今日は、あなたがする実際のCコンパイラを必要とする最適化コンパイラ、特にCは、ハードウェアに近い言語は、もはやであるため、現在のためのプロセッサは(信じられないほど複雑なアウトオブオーダー、パイプライン化、スーパースカラ、複雑でキャッシュ&TLB、したがって、命令のスケジューリングなどが必要です)。現在のx86プロセッサは、両方が同じマシンコードを実行できる場合でも、前世紀のi386プロセッサとは異なります。Cは低レベルの言語ではない(お使いのコンピューターは高速なPDP-11ではない) David Chisnallによる論文をご覧ください。
tinyccやnwccのような素朴な非最適化Cコンパイラを使用している人はほとんどいません。最適化コンパイラが提供するコードよりも数倍遅いコードを生成するためです。
最適化コンパイラのコーディングは困難です。GCCとClangの両方が、「ソース言語に依存しない」コード表現(GCCのGimple、ClangのLLVM)を最適化していることに注意してください。優れたCコンパイラの複雑さは、解析段階ではありません!
特に、C ++コンパイラを作成することは、Cコンパイラを作成することほど難しくありません:C ++を解析して内部コード表現に変換することは複雑です(C ++仕様が複雑なため)が、よく理解されていますが、最適化の部分はさらに複雑です複雑(GCCの内部:ミドルエンド最適化、ソース言語およびターゲットプロセッサニュートラルがコンパイラの大部分を構成し、残りは複数の言語のフロントエンドと複数のプロセッサのバックエンドでバランスが取れています)。したがって、ほとんどの最適化Cコンパイラは、C ++、Fortran、Dなどの他の言語もコンパイルできます。GCCのC ++固有の部分は、コンパイラの約20%です。
また、C(またはC ++)は非常に広く使用されているため、言語のセマンティクスを十分に正確に定義していない公式の標準に正確に準拠していない場合でも、コードがコンパイル可能であると人々は期待しています(したがって、各コンパイラーは独自の解釈を持つことができます)それの)。CompCertで実証されたCコンパイラーとFrama -C静的アナライザーも調べてください。これらは、Cのより正式なセマンティクスに注意を払っています。
そして、最適化はロングテールの現象です。いくつかの簡単な最適化を実装するのは簡単ですが、コンパイラの競争力を高めることはありません!多くの異なる最適化を実装し、それらを巧みに編成および結合して、競争力のある実際のコンパイラを取得する必要があります。つまり、実際の最適化コンパイラは複雑なソフトウェアでなければなりません。ところで、GCCとClang / LLVMの両方には、いくつかの内部に特化したC / C ++コードジェネレーターがあります。そして、両方とも巨大な獣(毎年数パーセントの成長率を持つ数百万のソースコード行)であり、大規模な開発者コミュニティ(数百人、ほとんどがフルタイム、または少なくともハーフタイム)を持っています。
コンパイラの一部が並行して実行できたとしても(私の知る限り)、マルチスレッドCコンパイラはありません(プロシージャ内最適化、レジスタ割り当て、命令スケジューリングなど)。また、(特にLTOを使用した)並列ビルドでは必ずしも十分ではありません。make -j
また、Cコンパイラをゼロからコーディングするための資金を得るのは難しく、そのような努力は数年続く必要があります。最後に、ほとんどのCまたはC ++コンパイラは今日のフリーソフトウェアです(スタートアップが販売する新しいプロプライエタリコンパイラの市場はもはやありません)、または少なくとも独占的な商品(Microsoft Visual C ++など)であり、コンパイラにはフリーソフトウェアであることがほぼ必要です(多くの異なる組織からの貢献が必要だからです)。
フリーのソフトウェアとしてCコンパイラをゼロから開発するための資金を得ることができればうれしいですが、それが今日可能であると信じるほど素朴ではありません!