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

1件のコメント

 
GN⁺ 2023-07-22
Hacker Newsの意見
  • JVMでRustで書かれたガベージコレクタを実装することは、ヒープへの参照が適切にルート化されることをどう保証するのかという疑問を投げかけます。
  • 記事では、複製したリポジトリでテストを実行すると、クラスパスに項目を追加する際のエラーが発生すると述べられています。
  • コメント投稿者は、過去にJava OSプロジェクトに取り組んだ経験を振り返り、RustでJVMを実装することのメモリ安全性の利点を強調しています。
  • JVMでのジェネリクス対応についての質問があり、型消去のためにすべてがObjectとして扱われるのかと尋ねています。
  • コメント投稿者は、関数シグネチャでのライフタイム使用の制約と、それがエラー処理に与える影響について尋ねています。
  • このプロジェクトは、その達成と学習経験を称賛されています。
  • プロジェクトの創始者に仕事のオファーが差し伸べられています。
  • Goで書かれた別のJVM実装へのリンクが共有されています。
  • コメント投稿者はこのプロジェクトに感嘆し、Rust入門ガイドについての案内を求めています。
  • このプロジェクトは、興味深い基盤メカニズムを備えたJVMの基礎レイヤーとして説明されています。
  • 趣味のOSプロジェクトへのユーモラスな言及があります。
  • 類似プロジェクトへのリンクが共有されています。