[解決済み] JVMプログラミング言語を作るには?
質問
ループ、関数内の関数宣言、再帰呼び出しなどをサポートする動的型付けプログラミング言語用のCコンパイラ(Lex &; Bisonを使用)を作成したことがあります。また、コンパイラーによって作成された中間コードを実行する仮想マシンを作成しました。
自分で作った中間コードではなく、Javaバイトコードにコンパイルしようと考えていました。
JVM言語の作成についての質問が既にされているのを見たのですが に質問されています。 がありますが、私はその回答があまり有益だとは思えません。
というわけで、以下は私の質問です。
- 私は、JVMのための言語を作成するために必要であると思います。 JVM仕様 を読むことだと思いますが、他にどんな本がお勧めですか(もちろんドラゴンブックは除いて)?私は主に、一般的なコンパイラではなく、JVM言語を作成する方法についての本やチュートリアルに関心があります。
-
多くの Java ライブラリがあり、読み、書き、変更することができます
.class
のようなファイルを読み書きするための Java ライブラリがたくさんあります。 jclasslib , bcel , gnu バイトコード などです。どれがお勧めですか?また、同じ仕事をするCライブラリもご存知ですか? - 私は、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 の内部を理解するのに非常に役に立ちます。
関連
-
[解決済み] ダブルリンクとは何ですか?
-
[解決済み] JVM起動時のパラメータ「-Xms」「-Xmx」とは何ですか?
-
[解決済み] コンパイルとトランスパイルの比較
-
[解決済み] java.lang.UnsupportedClassVersionError を修正する方法。サポートされていないメジャー.マイナーバージョン
-
[解決済み] JVMターゲット1.8でビルドされたバイトコードをJVMターゲット1.6でビルドされているバイトコードにインライン化することができない
-
[解決済み] コンパイラの書き方を学ぶ【終了しました
-
[解決済み] アプリケーション・バイナリ・インターフェース(ABI)とは何ですか?
-
[解決済み] 64ビットJVMで動作しているか、32ビットJVMで動作しているか、どうすればわかりますか(プログラム内から)?
-
[解決済み] 最初のコンパイラはどのように書かれたのですか?
-
[解決済み] ブートストラップには外部からのサポートが必要
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ダブルリンクとは何ですか?
-
[解決済み] どなたか「-1.#QNAN」の意味を説明してください。
-
[解決済み] コンパイルとトランスパイルの比較
-
[解決済み] clang(およびLLVM)とgcc / g++の違いは何ですか?
-
[解決済み] コンパイラの書き方を学ぶ【終了しました
-
[解決済み] アプリケーション・バイナリ・インターフェース(ABI)とは何ですか?
-
[解決済み】独自の言語でコンパイラを書く
-
[解決済み] 最初のコンパイラはどのように書かれたのですか?
-
[解決済み] 解析木と抽象構文木(AST)の違いは何ですか?
-
[解決済み] ブートストラップには外部からのサポートが必要