選択した「命令セットアーキテクチャ(ISA)」のサブセットである特定の命令セット用のコンパイラを構築します。(多くの命令セットにはI / O命令がありますが、コンパイラーがこれらを生成することはほとんどありません)。選択した特定の命令サブセットで動作するこの「命令セットアーキテクチャ」を実行するいくつかの異なるプロセッサ設計が存在する場合があります。
実際には3種類の進化イベントが発生します。
ISAからの命令をさらに使用すると、コンパイラの方が優れていると判断します。たとえば、MULTIPLY命令を使用すると、コンパイラが過去に乗算に使用したサブルーチン呼び出しよりも高速なコードを生成できるようになると判断する場合があります。この場合、コンパイラを少し拡張します。
ISAの所有者(Intel、AMD、IBMなど)は、まったく新しい一連の命令をISAに追加します。たとえば、データのキャッシュラインでのデータ並列操作(「SIMD命令」)。これらのいくつかをコンパイラーに追加することを決定できます。新しい命令ファミリは通常、データのレイアウトと処理方法についてさまざまな仮定を行うため、このイベントは困難な場合があります。
処理したい完全に異なるISAがいくつか見つかります。この場合、どのレジスタが存在するか、どのように使用されるかなどの点で、命令セットが完全に異なるため、コンパイラのバックエンドを再構築します。
コンパイラビルダーは、段階的に動作するコンパイラをビルドすることがよくあります。実際のマシンコードを生成する前の最後の段階では、通常、プログラムは、かなり標準的な抽象演算(ADD、MULTIPLY、COMPARE、JUMP、 CALL、STORE、LOAD、...)実際のISAへのコミットメントはありません(特に、登録または特定のマシン命令に関するコミットメントはありません)。このようにすることで、ISAとは無関係に高レベルの最適化を実行できます。これを優れたモジュール化と考えてください。最後のいくつかの段階はISAに特化しています。通常、レジスタを割り当てるためのステージで、その後にパターンが実際の命令を抽象命令と照合します。
より高いレベルでの最適化について書かれた本全体と、最終的なコード生成状態について書かれた他の本(そして多くの場合、別々の章で両方を扱っている本)があります。[Aho&UllmanDragonの本とTorczonのEngineeringaCompilerはどちらも両方のトピックについて非常に優れた本です)。最終的な命令セットを書き留めてレイアウトを登録することを可能にする多くの技術があり、最終段階の多くを生成します。GCCにはそのようなものがあります。そのテクノロジーは複雑で、この文には当てはまりません。本を読みに行くのが一番です。
この方法で最初のISAでコンパイラを動作させると、同じテクノロジを使用してバリアントを構築できます。最終的に、ISAごとに1つずつ、合計2つの物理コンパイラが作成されます。それらはすべてのフロントエンドロジックを共有し、コード生成と最適化を抽象化します。それらは最終段階で完全に異なります。
理解しておくべきことは、命令セットを利用するコンパイラーの構築は複雑なプロセスであるということです。