- 作者は学習プロジェクトとして、
rjvmという名前のRust製JVMを作成しました。
- このJVMはトイ実装であり、ジェネリクス、スレッド、リフレクション、アノテーション、I/O、JITコンパイルはサポートしていません。
- このJVMは、制御フロー文、基本型とオブジェクトの生成、仮想および静的メソッド呼び出し、例外処理、ガベージコレクション、
jarファイルからのクラス解決を実装しています。
- 作者はOpenJDK 7の実際の
rt.jarを使ってテストスイートを実装しました。
- コードは
reader、vm、vm_cliの3つのクレートで構成されています。
readerクレートは.classファイルを解析し、その内容をモデル化できます。
vmクレートにはコードを実行できる仮想マシンが含まれています。
vm_cliクレートはVM用のシンプルなコマンドラインランチャーです。
- 作者は、他の人が使えるように
readerクレートを別のリポジトリとして切り出すことを検討しています。
.classファイルをロードすることは、Javaコードを実行するための最初のステップです。
- クラスファイルには、クラスに関するメタデータ、スーパークラスおよびインターフェース名、フィールドとメソッド、それらのディスクリプタとバイトコードが含まれています。
vmクレートの主要なAPIはVm::invokeで、これを使ってメソッドを実行します。
vmクレートは、Rustで実装されたJavaバイトコードメソッドとネイティブメソッドの両方をサポートしています。
- JVMはスタックベースで、バイトコード命令は値スタックとローカル変数に対して動作します。
- 値とオブジェクトはRustの
enumとstructを使ってモデル化されています。
- メソッド実行には、バイトコード命令を1つずつ実行し、プログラムカウンタを更新し、スタックとローカル変数を操作することが含まれます。
- JVMは、仮想および静的ルックアップを含むさまざまな種類のメソッド呼び出しをサポートしています。
- 例外は例外テーブルを使って実装されており、メソッドの通常の制御フローを中断できます。
- 作者は、Rustの
Resultとパターンマッチングを使った例外実装を誇りに思っています。
- JVMには、stop-the-worldのセミスペースコピーアルゴリズムを使ったガベージコレクタが含まれています。
- ガベージコレクタはメモリを2つのセミスペースに分割し、一方のセミスペースからもう一方へ生存オブジェクトをコピーします。
- 作者は、Rustで
rjvmを書く過程で多くの楽しさと学びを得ました。
1件のコメント
Hacker Newsの意見