コンパイラのコースを正しく覚えていると、一般的なコンパイラの概要は次のようになります。
ソースコードを4分の1(または任意の分母)に分割し、スキャンと解析のプロセスをマルチスレッド化することは理論的に可能ですか?マルチスレッドを利用するコンパイラーはありますか?
大規模なソフトウェアプロジェクトは通常、比較的独立してコンパイルできる多くのコンパイルユニットで構成されているため、コンパイルは、コンパイラーを複数回並行して呼び出すことにより、非常に大まかな粒度で並列化されることがよくあります。これはOSプロセスのレベルで発生し、適切なコンパイラではなくビルドシステムによって調整されます。これはあなたが尋ねたものではないことを私は理解していますが、それはほとんどのコンパイラの並列化に最も近いものです。
何故ですか?まあ、コンパイラが行う作業の多くは、簡単には並列化に向いていません。
この後、少し簡単になります。型チェックと最適化、およびコード生成は、原則として、関数の粒度で並列化できます。おそらくこれほど多くのコンパイラーがこれを実行するかどうかはまだわかっていません。おそらく、これほど大きなタスクを同時に実行することは非常に困難です。また、ほとんどの大規模なソフトウェアプロジェクトには非常に多くのコンパイルユニットが含まれているため、「多数のコンパイラを並行して実行する」アプローチで、すべてのコア(場合によってはサーバーファーム全体)を占有するのに十分です。さらに、大規模なコンパイルタスクでは、ディスクI/Oが実際のコンパイル作業と同じくらいボトルネックになる可能性があります。
そうは言っても、コードの生成と最適化の作業を並列化するコンパイラーは知っています。 Rustコンパイラは、バックエンドの作業(LLVM、これには実際には「ミドルエンド」と見なされているコード最適化を実際に含む)を複数のスレッドに分割できます。これは「コード生成ユニット」と呼ばれます。上記の他の並列化の可能性とは対照的に、これは次の理由により経済的です。
コンパイルは「恥ずかしいほど並列」な問題です。
1つのファイルをコンパイルする時間を気にする人はいません。人々は1000個のファイルをコンパイルする時間を気にします。また、1000ファイルの場合、プロセッサの各コアは一度に1つのファイルをコンパイルして、すべてのコアを完全にビジー状態に保つことができます。
ヒント:「make」は、適切なコマンドラインオプションを指定すると、複数のコアを使用します。それがなければ、16コアシステムで1つのファイルを次々にコンパイルします。つまり、ビルドオプションを1行変更するだけで、16倍速くコンパイルできます。