はい、サポートするすべてのプラットフォームの機械語を「知っている」必要があります。これは、マシンコードを生成するために必要です。ただし、コンパイルは複数のステップからなるプロセスです。通常、コンパイルの最初のステップはほとんどのアーキテクチャに共通です。
ウィキペディアから取得
コンパイラの構造
コンパイラは、高級言語のソースプログラムと基盤となるハードウェアをブリッジします。
コンパイラには
プログラムの構文の正しさを判断し、
正確で効率的なオブジェクトコードを生成し、
実行時の組織、および
アセンブラやリンカの規則に従って出力をフォーマットします。
コンパイラは、フロントエンド、ミドルエンド、バックエンドの3つの主要部分で構成されています。
フロントエンド
プログラムがプログラミング言語の構文とセマンティクスに関して正しく記述されているかどうかをチェックします。ここでは、合法および違法なプログラムが認められています。エラーがある場合は、有用な方法で報告されます。タイプチェックは、タイプ情報を収集することによっても実行されます。次に、フロントエンドは、ミドルエンドで処理するためのソースコードの中間表現またはIRを生成します。
ミドルエンド
最適化が行われる場所です。最適化のための典型的な変換は、役に立たないまたは到達不能コードの削除、定数値の検出と伝播、あまり頻繁に実行されない場所への計算の再配置(たとえば、ループ外)、またはコンテキストに基づく計算の特殊化です。ミドルエンドは、次のバックエンドに対して別のIRを生成します。ほとんどの最適化の取り組みは、この部分に焦点を合わせています。
バックエンド
IRをミドルエンドからアセンブリコードに変換する責任があります。ターゲット命令は、IR命令ごとに選択されます。レジスタ割り当ては、可能な場合、プログラム変数にプロセッサレジスタを割り当てます。バックエンドは、並列実行ユニットをビジー状態に保つ方法、遅延スロットを埋める方法などを理解することにより、ハードウェアを利用します。最適化のためのほとんどのアルゴリズムはNPにありますが、ヒューリスティック手法は十分に開発されています。
コンパイラの構造を説明するこの記事と、クロスコンパイラを扱うこの記事の詳細。