回答
「XYZ」という名前の新しいプログラミング言語を書いているとしましょう。最初のステップは、この言語用のコンパイラーを作成することです。この新しい言語はまだ存在しないので、コンパイラを次のように記述します… javaとしましょう。これをjxyzと呼びます。このプロセスを実行するのは、大学の典型的なクラスです。
これで、XYZソースファイルを取得して生成するJavaプログラム(jxyz)ができました。実行可能ファイル。その後、jxyzによってコンパイルされたXYZでXYZ用のコンパイラを作成することができます。
この時点で、jxyzに準拠したXYZ用のコンパイラができました。このプログラムを「xyzFromJ」と呼んでください。
「xyzFromJ」は、それ自体を入力として受け取り、それ自体をコンパイルして、言語の依存関係と定義からjxyzによって作成されたものを完全に削除できるはずです。この時点から、XYZ言語への変更は、XYZで記述され、それ自体を使用してコンパイルされたコンパイラで実行できます。
回答
ステップ1.別の言語でコンパイラを記述します。
ステップ2.ステップ1のコードをコンパイルします。
ステップ3.同じ言語でコンパイラを記述します。
ステップ4.からコードをコンパイルします。手順3。
コンパイラをさらに更新するには、手順3〜4を繰り返します。
手順1と3は、同時に、または異なる順序で実行される場合があることに注意してください。
これは非常に単純化しすぎていることを認めます。
コメント
回答
他の言語でコンパイラを作成することを提案する他の回答とは異なり、 (ターゲットとしているのと同じマシンで実行されていると思われます)、最初からターゲット言語でコンパイラーを作成することも可能です(実際には望ましいです)。
C用のコンパイラーを作成するとします。 ARMプロセッサの場合。 Windows(Intelアーキテクチャ)で実行されるCコンパイラがすでにあります。新しいコンパイラは、フロントエンド(字句解析と解析)とバックエンド(コード生成)の両方でCで記述します。もちろん、バックエンドはIntelではなくARMのコードを生成するように記述されています。
次に、既存のコンパイラを使用して新しいコンパイラのソースをコンパイルします。コンパイラがARMの有効なコードを生成していることを確認したら、コンパイルされたARMコードを取得して、ターゲットARMアーキテクチャで実行します。これで、新しいコンパイラのソースができました。これを変更して実行可能ファイルにフィードし、新しいバージョンを生成できます。
これはクロスコンパイルと呼ばれるプロセスです。利点は、コンパイラを1回作成します。
回答
別の回答から:
Step 1. Write your compiler in a different language. Step 2. Compile the code from Step 1. Step 3. Write your compiler in the same language. Step 4. Compile the code from step 3.
ステップ1と2は、新しい言語の「初めての」コンパイラーにのみ必要です。ステップ3と4にはさまざまなバリエーションがあるため、たとえば、新しいアーキテクチャーのコードジェネレーターを作成できます。クロスコンパイルしてから、同じコンパイラを新しいマシンで実行します。または、拡張機能を使用せずに新しい構文と構成を処理するようにコンパイラーを拡張してから、拡張機能を使用してそれ自体をコンパイルするようにコンパイラーを書き直すことができます。