web-dev-qa-db-ja.com

長いコンパイルは過去のものですか?

コンパイルにかかる時間については無数の戦争の話があります。 xkcd でも言及しました。

今、私は長い間プログラミングをしておらず、ほとんどがJavaとPythonに公開されています(そしてPythonはインタープリター言語であり、コンパイルされたもの)。コンパイルに非常に長い時間がかかるプロジェクトに出くわしていない可能性があることに気づきますが、適切なサイズのアプリであっても、それは私にとって瞬時である(通常はIDEによってバックグラウンドで処理される)か、30以下しかかかりません非常に大規模なプロジェクトの場合は数秒程度。 (コミックが行われる)ビジネス環境でも、コードをコンパイルするのにそんなに長くかかることはありませんでした。

コンパイル時間が長いプロジェクトにさらされたことはありませんか?これは、現代ではもはや起こらない過去の遺物でしょうか?コンパイルにこれほど長い時間がかかるのはなぜですか?

38
Thunderforge

特にC、C++、Scalaなどの言語で記述された大規模なプロジェクトでは、コンパイルに時間がかかることがあります。バックグラウンドでパーツをコンパイルすると、コンパイル時間が短縮されますが、場合によっては、新たにコンパイルする必要があります。コンパイル時間が長くなる可能性のある要因には、次のものがあります。

  • 明らかに、コードサイズが大きい。大規模なプロジェクトには、数十万行のコードが含まれます。

  • Cさんの#includeプリプロセッサディレクティブ。これにより、同じコードが実質的に数百回コンパイルされます。マクロシステムはテキストレベルで機能するため、同様の問題があります。プリプロセッサは、実際にコンパイラに渡されるコードサイズを大きく膨らませます。前処理後のファイルの確認(例:gcc -E)目が開くはずです。

  • C++のテンプレートは完全なチューリングです。つまり、理論的には、コンパイル時に任意の計算を実行できます。誰もそれを本当に望んでいるわけではありませんが、多くの単純なケースでさえ、テンプレートの専門化にかなりの時間を費やしています。

  • Scalaはかなり若い言語であり、コンパイラーはひどく最適化されていません。現在、コンパイラは非常に多数のコンパイルパスを使用しています(Cは2つのコンパイルパスのみを必要とするように設計されています)。型チェックはこれらのパスの1つであり、言語が特徴とする複雑な型システムのため、時間がかかる場合があります。

時間のかかる作業はコンパイルだけではありません。プロジェクトがコンパイルされたら、テストスイートを実行する必要があります。これに費やされる時間は、数秒から数時間の範囲になる可能性があります(テストが正しく記述されていない場合)。

49
amon

それは決して過去の遺物ではありません。私が取り組んでいるプロジェクトの1つは、ゼロからクリーンビルドするのに45分かかります。独自のコードとは別に、外部リポジトリからいくつかの大きなCおよびC++ライブラリからソースをプルしてビルドする必要もあります。 CおよびC++コードのコンパイルとリンクは、計算コストがかかります。ご指摘のとおり、Pythonは通常、インタプリタ言語として実装され、Javaは通常JIT(Just in Time)コンパイラを使用するため、プロジェクトはスキップされます事前のコンパイルとリンクのコストをまとめて支払う支払うコストは、起動時間が長くなり、(Pythonの場合)実行速度が遅くなります)。

ビルド時間が長くなると、 Jenkins または TeamCity のような継続的インテグレーションシステムを利用することがより重要になります。これにより、個々の開発者は、(ほとんど)ゼロからビルドするという苦痛を回避しながら、変更をテストしてもビルドに支障をきたすことはありません。

17

大規模なプロジェクトには時間がかかる場合があります。十分に大きなプロジェクトの場合、1時間以上かかることがあります。私のコンピューターのソースからコンパイルしなければならないいくつかのライブラリーがあります。 opencascade。 Linuxカーネル自体をゼロから構築する必要がある場合も、かなり時間がかかります。

ただし、さらに時間がかかる可能性のあるコンパイルのようなプロセスが他にもあります。デジタル回路設計(ASICまたはFPGAのいずれか)には、配置配線ステップが必要です。配置配線ステップでは、個々の論理ゲート、フリップフロップ、レジスタ、RAM、およびその他のコンポーネントの配置が、相互接続配線の配線とともに決定されます。ソフトウェアは、タイミングモデルを使用して可能な配置のゲートおよび配線遅延を決定し、これらをタイミング制約によって提供される制限と比較してから、配置要件と配線パスを調整して、タイミング要件が満たされるようにします。タイミングを満たすために、ソフトウェアでゲートのサイズを変更し、バッファを追加する必要がある場合もあります。この手順は非常に計算量が多く、完了するまでに数時間または数日かかる場合があります。また、実際にはあまり並列化されません。 1年ほど前に作業していたFPGAデザインで、Virtex 6 HXT 565 FPGAの約半分(565k LUTのうち約300k)を消費し、配置配線に約7時間かかりました。 Core i7 CPUデザインのような場所で実行してルーティングするのにどれくらいの時間がかかるか想像できません。おそらく少なくとも数週間はかかります。

10
alex.forencich

他の回答はすでに述べました。特に、大規模なプロジェクトのコード(50万行以上を意味する)は、特にゼロからビルドする場合、かなりの時間がかかる可能性があります。

追加のポイントは、いくつかのプロジェクトを複数のターゲット環境用にビルドする必要があることです。それらの環境をホストするマシンが利用できない場合、ビルドはクロスコンパイルによって、使用しているマシンでシリアルに実行する必要があります。これはsignificantビルド時間につながる可能性があります。私が取り組んだ1つのプロジェクトでは、夜間のビルドに10時間かかります。あなたがそれを壊したのはあなたでしたか!

時間を浪費するためのそのような言い訳を逃れることはないと付け加えておきます。専門家は、そのような期間にdoが役立つ何かを実行できるように、自分のタスクを計画する必要があります。

4
andy256

両方の少し。 C++(およびそれより少ない程度のC)は、特に定期的なハードウェアでのコンパイル時間が遅いことで悪名が高かった。ミレニアムの変わり目頃、私はマクロな悪意のために構築するのに約4時間かかったプロジェクトに取り組みました。

最近の状況は改善されていますが、私の経験では30秒はかなり短くなっています。特に、ソース管理からチェックアウトする必要がある正式なビルド、ユニットテストの実行、インストーラーのビルド、およびすべてに送信されるすべてのSANどこかに。

3
Telastyn

それはプロジェクトとそれがコンパイルされる環境に依存します。私はコンパイルに数分かかった(MSVSで複数のプロジェクトとしてセットアップされた)C++プロジェクトに取り組んできました。これはおそらく剣闘に十分な時間です。

巨大なコードとデータベースを備えた大企業(Proctor and Gamble、Googleなど)、または非常に複雑な1つまたは2つの主要製品(科学的シミュレーションとレンダリングなど)に焦点を当てた中小企業またはスタートアップの場合、大きなプロジェクトがコンパイルされるのを待つのは、強力なマシンでも期待できる現実的なことです。これは、コードの開発方法とデバッグ方法(およびバージョン管理による変更の更新とマージの選択頻度)に影響を与える可能性があります。

2
Trixie Wolf