プログラミング言語を書いたとします。名前は、langとします。JVMの言語を書く
長い旅を書き始めるには、lang、私は自分自身でlangを書くことで始めることにしました。私は実際にを実行することはできませんそれは、実行するプログラムを実行するために何もないためです。
だから私はlangのJavaで別のコンパイラを書くことから始めます。今回は、私が終わったらバイトコードに変換してそれを残すことにしました。私は今、私のすべてlangコードをバイトコードに変換する作業コンパイラを持っています。
私は自分の言語用の自己コンパイラをプラグインすることにしました。私はちょうどJavaで作成したコンパイラにプラグインしました。次に、自己コンパイラをバイトコードに変換し、Javaコンパイラを実行します。私は今langコンパイラを持っています。純粋にそれ自身で書かれ、バイトコードに変換されています。
これは完全なプログラムを作成しますが、私はこれをすべて理解していますが、私の質問は、JVMのコンパイラ設計に比べてです。バイトコードを更新するにはどうすればいいですか?古いバージョンの言語の更新版を単に書き直すだけですか?
これは私がやりたがっているためです。存在しない言語をそれ自身で作成し、Javaで最初にコンパイラを作成してJVMにブートストラップします。
C++で行ったことと同じです。クラスを持つCが書かれ、次にC++が書かれ、最終的にClassesを持つCがブートストラップされたC++のために放棄されました。しかし、その後、彼らはどのようにして言語を更新するつもりでしたか?
バイトコードのデバッグはかなり苦しいことがあります。私は 'lang'の翻訳者を' java'に書くことをお勧めします。これはあなたが何をしているのかを見て翻訳されたJavaをデバッグする方法です。後でより効率的なコンパイラをバイトコードに直接書くことができます。 –
@Peter Lawrey:「バイトコードのデバッグ」はめったに必要ありません。生成されたクラスファイルにソースファイル名を指定し、行番号への命令のマッピングを指定するデバッグ属性がある場合は、実際に書き込まれた言語に関係なく、Javaソースコードと同様にデバッグできます。 – Holger
言語をアップグレードすると、前の言語の機能のみを使用して新しい機能を実装する必要があります。その完了後にのみ、コンパイラ内で新しい機能の使用を開始できます。 – Holger