- Penulis membuat sebuah JVM bernama rjvm sebagai proyek pembelajaran yang ditulis dengan Rust.
- JVM ini adalah implementasi mainan dan tidak mendukung generics, thread, reflection, annotation, I/O, atau kompilasi JIT.
- JVM ini mengimplementasikan pernyataan alur kontrol, pembuatan tipe primitif dan objek, pemanggilan metode virtual dan statis, penanganan pengecualian, garbage collection, serta resolusi kelas dari file jar.
- Penulis mengimplementasikan test suite menggunakan
rt.jar asli dari OpenJDK 7.
- Kodenya terdiri dari tiga crate:
reader, vm, dan vm_cli.
- Crate
reader dapat mem-parsing file .class dan memodelkan isinya.
- Crate
vm berisi mesin virtual yang dapat mengeksekusi kode.
- Crate
vm_cli adalah peluncur command line sederhana untuk VM.
- Penulis sedang mempertimbangkan untuk mengekstrak crate
reader menjadi repositori terpisah agar dapat digunakan orang lain.
- Memuat file
.class adalah langkah pertama untuk menjalankan kode Java.
- File kelas berisi metadata tentang kelas, nama superclass dan interface, field dan metode beserta descriptor dan bytecode-nya.
- API utama dari crate
vm adalah Vm::invoke, yang digunakan untuk menjalankan metode.
- Crate
vm mendukung baik metode bytecode Java maupun metode native yang diimplementasikan dalam Rust.
- JVM berbasis stack, sehingga instruksi bytecode bekerja pada value stack dan variabel lokal.
- Value dan objek dimodelkan menggunakan
enum dan struct Rust.
- Eksekusi metode melibatkan menjalankan instruksi bytecode satu per satu, memperbarui program counter, serta memanipulasi stack dan variabel lokal.
- JVM mendukung berbagai jenis pemanggilan metode, termasuk lookup virtual dan statis.
- Pengecualian diimplementasikan menggunakan exception table dan dapat mengganggu alur kontrol normal sebuah metode.
- Penulis bangga dengan implementasi pengecualian menggunakan
Result dan pattern matching di Rust.
- JVM ini menyertakan garbage collector yang menggunakan algoritma penyalinan semi-space stop-the-world.
- Garbage collector membagi memori menjadi dua semi-space, lalu menyalin objek yang masih hidup dari satu semi-space ke semi-space lainnya.
- Penulis mendapatkan banyak kesenangan dan pembelajaran saat menulis rjvm dengan Rust.
1 komentar
Komentar Hacker News