- Tác giả đã tạo ra một JVM viết bằng Rust có tên là rjvm như một dự án học tập.
- JVM này là một bản triển khai mang tính thử nghiệm và không hỗ trợ generics, luồng, reflection, annotation, I/O hoặc biên dịch JIT.
- JVM này triển khai các câu lệnh điều khiển luồng, kiểu nguyên thủy và tạo đối tượng, gọi phương thức ảo và tĩnh, xử lý ngoại lệ, garbage collection và phân giải lớp từ tệp jar.
- Tác giả đã triển khai bộ kiểm thử bằng cách sử dụng
rt.jar thực tế của OpenJDK 7.
- Mã nguồn gồm ba crate:
reader, vm và vm_cli.
- Crate
reader có thể phân tích tệp .class và mô hình hóa nội dung của chúng.
- Crate
vm chứa máy ảo có thể thực thi mã.
- Crate
vm_cli là một trình khởi chạy dòng lệnh đơn giản cho VM.
- Tác giả đang cân nhắc tách crate
reader thành một kho lưu trữ riêng để người khác có thể sử dụng.
- Việc nạp tệp
.class là bước đầu tiên để thực thi mã Java.
- Tệp lớp chứa metadata về lớp, tên lớp cha và interface, các trường và phương thức cùng descriptor và bytecode của chúng.
- API chính của crate
vm là Vm::invoke, được dùng để thực thi phương thức.
- Crate
vm hỗ trợ cả phương thức bytecode Java và phương thức native được triển khai bằng Rust.
- JVM là một hệ thống dựa trên stack, trong đó các lệnh bytecode hoạt động trên ngăn xếp giá trị và biến cục bộ.
- Giá trị và đối tượng được mô hình hóa bằng
enum và struct của Rust.
- Việc thực thi phương thức bao gồm chạy từng lệnh bytecode một, cập nhật bộ đếm chương trình và thao tác với stack cùng biến cục bộ.
- JVM hỗ trợ nhiều kiểu gọi phương thức khác nhau, bao gồm tra cứu ảo và tĩnh.
- Ngoại lệ được triển khai bằng bảng ngoại lệ và có thể làm gián đoạn luồng điều khiển thông thường của phương thức.
- Tác giả tự hào về cách triển khai ngoại lệ bằng
Result và pattern matching của Rust.
- JVM bao gồm một bộ gom rác sử dụng thuật toán sao chép bán không gian stop-the-world.
- Bộ gom rác chia bộ nhớ thành hai bán không gian và sao chép các đối tượng còn sống từ bán không gian này sang bán không gian kia.
- Tác giả đã có rất nhiều niềm vui và học hỏi được nhiều điều khi viết rjvm bằng Rust.
1 bình luận
Ý kiến trên Hacker News
Objectdo type erasure hay không.