重複の可能性:
「それ自体」でのコンパイラの実装
言語のブートストラップ
コンパイラーを作成している言語と同じ言語でコンパイラーを作成するにはどうすればよいですか?そのような再帰的ではありませんか?
編集:これは削除される可能性がありますが、それ以外の場合は...:
ブートストラップする方法:
ブートストラップする理由:
重複の可能性:
「それ自体」でのコンパイラの実装
言語のブートストラップ
コンパイラーを作成している言語と同じ言語でコンパイラーを作成するにはどうすればよいですか?そのような再帰的ではありませんか?
編集:これは削除される可能性がありますが、それ以外の場合は...:
ブートストラップする方法:
ブートストラップする理由:
通常、コンパイラの最初のバージョンは異なる言語で記述され、その後の各バージョンはその言語で記述され、古いバージョンでコンパイルされます。x
バージョンをバージョンとともにコンパイルしたらx-1
、新しくビルドされたバージョンx
を使用して、バージョンが導入する新しい最適化を利用して、それ自体を再コンパイルできます。GCCはそのリリースをそのように行います
です。通常、別の言語からコンパイルまたは解釈された言語のブートストラップバージョンが必要です。
そしてもう少し気を紛らわせるために、数年前、私は大学院生のプロジェクトとして書かれたPascalコンパイラの歴史を読みました。Pascalで記述され、システムに組み込まれているPascalコンパイラでコンパイルされています。最終的には、システムに組み込まれているPascalコンパイラを置き換えるだけで十分でした。残念ながら、彼らはコード生成のバグを発見しましたが、コードジェネレーターの修正によりコンパイラーのバグがトリガーされ、不良コンパイラーが生成されました。これを修正するには、インストールされているコンパイラからバイナリに手動でパッチを適用してから、パッチをソースに適用してそれ自体を置き換える必要がありました。
これは、これまでの最初のバージョンでのみ問題になります。コンパイラのV1.0が機能するようになったら、自分の言語でV2.0を記述し、V1.0コンパイラを使用してコンパイルできます。次に、V3.0を記述し、V2.0を使用してコンパイルしたり、V3.0を使用してV4.0をコンパイルしたりできます。
コンパイラーの最初のパスは、通常、言語がそれ自体のコンパイラーをコンパイルできるように十分に形成されるまで、他の何かで書かれます。その後、xに入ることができます。xで書かれています。
当初、その言語の本当の最初のコンパイラは、もちろんその言語ではなく書かれていました。非常に2番目はその言語で書くことができます。さらに、言語の仕様を指定すると、ブートストラップコンパイラに基本コアを実装し、「ブートストラップ」コンパイラが理解するサブセットを使用して、その言語で完全準拠のコンパイラを記述できます。第2世代のコンパイラは、「ブートストラップ」コンパイラも忘れることができます。
ある時点で、別の言語で書かれたコンパイラー(またはインタープリター)が必要になります。しかし、それは効率的である必要はなく、構文解析とプロトタイピングを容易にする言語で行うことができます(LISPが一般的です)。これを使用して「セルフコンパイラ」をコンパイルしたら、それを破棄して結果を使用できます。