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


38

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

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

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


31
クロムをコンパイルしてみてください。
UldisK 14

2
Linuxカーネルのコピーを入手します。完全なビルドを行います。自分で見て。または、Javaコーダーの場合はソースからSpring。現状では、この質問にはいくつかの回答があり、質問のように質問に回答しています(「私は30分間のコンパイルを完了しました...」タイプの回答)。 。

最近の大規模プロジェクトでは、コンパイルに40分かかりました(Mavenでコンパイルされた40 000のソースコードファイル)。回避策は、多くのCPUコアでコンパイルをパラレル化することです。
ニクラスローゼンクランツ14

2
ソースのLinuxディストリビューション(gentoo、LFSなど)を選択し、インストールするすべてのソフトウェアをコンパイルするのに何日も費やします。
バジルスタリンケビッチ14

6
長く定義...学校を出たばかりの子供には1分間は長いように見えるかもしれませんが、数十年もの間溝の中にいた数時間は、眉を上げることはありません。
jwenting

回答:


48

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

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

  • Cの#includeプリプロセッサディレクティブ。これにより、同じコードが何百回もコンパイルされます。マクロシステムには、テキストレベルで動作するため、同様の問題があります。プリプロセッサは、実際にコンパイラに渡されるコードサイズを実際に大きくします。前処理(たとえばgcc -E)でファイルを見ると目が開くはずです。

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

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

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


14
実際、Scalaの型システムはチューリング完全であるため、型チェックには無限の時間がかかり、コンパイラーがそれを判断することは不可能です。
ヨルグWミットタグ14

7
最適化を忘れないでください。(たとえば)C / C ++コンパイラが行う最適化の多くは非常に高価です(たとえば、JITがそれらを行う余裕がないほど高価です)。最悪の場合、ほとんどのツールチェーンは現在、プログラム全体の最適化をサポートしています。これにより、ビルド時間が大幅に増加することが知られています。
ブレンダン14

あなたが私が考慮していなかった多くのことを指摘したので、私はこの答えを受け入れました。具体的には、全体をコンパイルするか、断片的にコンパイルするか、そして今回の「コンパイル」にテストスイートが含まれる可能性があるという事実
サンダーフォージ14

1
テストスイートだけでなく、コードカバレッジ分析、自動パッケージ化、テストシステムへの自動展開。最近では、統合されたビルドシステムに包まれているものがたくさんあります。また、devまたはqa環境に到達するまで保留状態になっている場合は、小さな椅子で馬上槍試合をする時間があることは確かです。
corsiKa 14

1
いい答えです。コンパイル時間の広がりはもっと大きくなる可能性があります。私は、完全なコンパイルに2〜3日かかる可能性のあるプロジェクト(恐ろしいことです!)に取り組んでおり、さらに悪い犯罪者がいると思います。
ロイT. 14

17

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

ビルド時間が長くなると、JenkinsTeamCityなどの継続的な統合システムを活用することがより重要になります。これにより、個々の開発者は(ほとんど)ゼロからビルドする苦痛を回避しながら、変更がビルドを壊さないことをテストできます。


1
javacは、「事前のコンパイルとリンクコストを完全にスキップする」わけではありません。多くの最適化コストをスキップしますが、ソースをバイトコードに変換し、その過程で多くの静的チェックを実行しています。Cコンパイラと同じくらいのリンクを行います。実際のパフォーマンスの違いは、Javaのコンパイルプロセスは、小さなチャンクに分割して同じファイルを何千回も再処理する必要がなく、プログラム全体とその依存関係を一度にメモリにロードできると想定されていた時代に設計されたということです。
ピーターテイラー14年

10

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

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


4

他の回答では、はい、大規模なプロジェクト(5万行以上を意味する場合)のコードは、特にゼロから構築する場合、かなりの時間がかかることがあると既に述べています。

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

私はあなたが時間の無駄のためにそのような言い訳で逃げないだろうと付け加えます。専門家は、そのような期間に何か役に立つことができるように、タスクを計画する必要があります。


3

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

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


2

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.