私はプログラミング言語を設計していますが、私が考えていた問題の1つは、プログラミング言語のコンパイルに時間がかかる理由でした。c ++は、ファイルをコンパイルするたびにヘッダーを解析してコンパイルする必要があるため、長い時間がかかると想定されています。しかし、プリコンパイル済みヘッダーは同じくらい時間がかかりますか?この問題を抱えている言語はc++だけではないと思います。
8 に答える
恐ろしく遅くなる C++ 固有の問題の 1 つは、他のほとんどの言語とは異なり、セマンティック分析とは別にそれを解析できないことです。
コンパイルは、かなりの数のステップを含む複雑なプロセスです。
- スキャン/字句解析
- 構文解析
- 中間コード生成
- おそらく中間コードの最適化
- ターゲットマシンのコード生成
- オプションで、マシンに依存するコードの最適化
(リンクは脇に置いておきます。)
当然、これはより長いプログラムには時間がかかります。
少なくとも 1988 年以来知られているように、プリコンパイル済みヘッダーははるかに高速です。
C コンパイラまたは C++ コンパイラに長い時間がかかる通常の理由は、膨大な数のトークンを #include、前処理、および lex する必要があるためです。
演習として、ヘッダー ファイルの典型的なコレクションに対して cpp を実行するだけでどれくらい時間がかかるかを調べてから、出力を lex するのにかかる時間を測定してください。
gcc -O は、Chris Fraser と Jack Davidson によって開発された、非常に効果的ですが、やや遅い最適化手法を使用します。他のほとんどのオプティマイザーは、かなり大きなデータ構造に対して繰り返し反復を行うため、遅くなる可能性があります。
言語設計は、コンパイラーのパフォーマンスに影響を及ぼします。C ++コンパイラは通常、言語の設計に大きく関係するC#コンパイラよりも低速です。(これはコンパイラの実装者にも依存します。AndersHejlsbergはC#を実装しており、最高の1つです。)
C ++の単純な「ヘッダーファイル」構造は、パフォーマンスの低下につながりますが、プリコンパイル済みヘッダーが役立つことがよくあります。C ++はCよりもはるかに複雑な言語であるため、通常、Cコンパイラの方が高速です。
コンパイルに時間がかかる必要はありません。tccは ANSI c をインタプリタとして使用できるほど高速にコンパイルします。
考えるべきこと:
- スキャンおよび解析パスの複雑さ。おそらく、長い先読みを必要とすることは、文脈依存 (文脈自由ではなく) 言語と同様に害を及ぼすでしょう。
- 内部表現。大規模で機能豊富な AST を構築して作業するには、しばらく時間がかかります。おそらく、実装したい機能をサポートする最も単純な内部表現を使用する必要があります。
- 最適化。最適化は面倒です。さまざまな条件を確認する必要があります。おそらく、複数のパスを作成する必要があります。これにはすべて時間がかかります。
それらはかかるのと同じくらい時間がかかり、それは通常あなたがあなたのコンパイルユニットにどれだけの無関係なものを注入するかに依存します。私はあなたがそれらをもっと速く手作業でコンパイルするのを見たいです:-)
初めてファイルをコンパイルするときは、ヘッダーがまったくないはずです。次に、必要に応じてそれらを追加します(そして、終了したら、まだ必要かどうかを確認します)。
その時間を短縮する他の方法は、コンパイル単位を小さく保ち(極端な場合は、ファイルごとに1つの関数になるまで)、必要なものだけをビルドするようにmake-likeツールを使用することです。
一部のコンパイラ(実際にはIDE)は、バックグラウンドでインクリメンタルコンパイルを実行するため、(ほぼ)常に完全にコンパイルされています。