1. ホーム
  2. compiler-construction

[解決済み] JVMプログラミング言語を作るには?

2023-02-09 13:37:22

質問

ループ、関数内の関数宣言、再帰呼び出しなどをサポートする動的型付けプログラミング言語用のCコンパイラ(Lex &; Bisonを使用)を作成したことがあります。また、コンパイラーによって作成された中間コードを実行する仮想マシンを作成しました。

自分で作った中間コードではなく、Javaバイトコードにコンパイルしようと考えていました。

JVM言語の作成についての質問が既にされているのを見たのですが に質問されています。 がありますが、私はその回答があまり有益だとは思えません。

というわけで、以下は私の質問です。

  1. 私は、JVMのための言語を作成するために必要であると思います。 JVM仕様 を読むことだと思いますが、他にどんな本がお勧めですか(もちろんドラゴンブックは除いて)?私は主に、一般的なコンパイラではなく、JVM言語を作成する方法についての本やチュートリアルに関心があります。
  2. 多くの Java ライブラリがあり、読み、書き、変更することができます .class のようなファイルを読み書きするための Java ライブラリがたくさんあります。 jclasslib , bcel , gnu バイトコード などです。どれがお勧めですか?また、同じ仕事をするCライブラリもご存知ですか?
  3. 私は、Clojure、Jython、JRubyのようなJVMをターゲットとする別の言語を見てみようと思っていました。しかし、これらのすべての言語は非常に高レベルで複雑です(それらのためのコンパイラを作成するために)。私は、JVMをターゲットとし、オープンソースのコンパイラを持つ、よりシンプルな(無名でも未使用でもかまわない)プログラミング言語を探していました。何かアイデアはありますか?

どのように解決するのですか?

ASMもお勧めですが、以下をご覧ください。 Jasmin 私は大学のプロジェクトでこれを使いましたが(というか使わざるを得ませんでした)、非常にうまくいきました。私は、JavaとJasminを使って、あるプログラミング言語のためのレキサパーサ、アナライザ、オプティマイザ、ジェネレータの組み合わせを書き、JVMコードを生成していました。私はコードをアップロードしました ここに であるはずです。 のソースコードそのものです。 . フォルダの中の bytecode/InsanelyFastByteCodeCreator.java には、ASTツリーをJasminのアセンブラの入力フォーマットに変換するコードがあります。これは非常に簡単です。

ソース言語(レキサー・パーサー・アナライザーによってASTに変換されたもの)はMiniJavaと呼ばれるJavaのサブセットです。これは、継承、コンストラクター、静的メソッド、プライベート フィールドおよびメソッドのようないくつかの「複雑な」機能を欠いています。これらの機能はどれも実装するのが難しいものではありませんが、x86バックエンドを書く(つまりマシンアセンブラを生成する)という別のタスクがあり、これらのことを処理するJVMがない場合は難しくなる傾向があります。

奇妙なクラス名を不思議に思うかもしれませんが、大学のプロジェクトのタスクは、AST を SSA グラフ (入力コードを表す) に変換し、グラフを最適化し、そしてそれを Java バイトコードに変換することでした。これはプロジェクトの仕事の約 3/4 であり、そのために InsanlyFastByteCodeCreator はすべてをテストするためのショートカットにすぎませんでした。

Jon MeyerとTroy Downingの "Java Virtual Machine "の本を読んでみてください。この本は、Jasmin アセンブラを大いに参照しており、JVM の内部を理解するのに非常に役に立ちます。