- ผู้เขียนได้สร้าง JVM ที่เขียนด้วย Rust ชื่อว่า rjvm เป็นโปรเจ็กต์เพื่อการเรียนรู้
- JVM นี้เป็นการอิมพลีเมนต์แบบของเล่น และไม่รองรับ generics, threads, reflection, annotations, I/O หรือการคอมไพล์แบบ JIT
- JVM นี้อิมพลีเมนต์คำสั่งควบคุมการไหล การสร้าง primitive และอ็อบเจ็กต์ การเรียกเมธอดแบบ virtual และ static การจัดการข้อยกเว้น การเก็บกวาดขยะ และการ resolve คลาสจากไฟล์ jar
- ผู้เขียนได้ทำชุดทดสอบโดยใช้ rt.jar จริงจาก OpenJDK 7
- โค้ดประกอบด้วย 3 crate คือ reader, vm และ vm_cli
- crate
reader สามารถพาร์สไฟล์ .class และสร้างโมเดลของเนื้อหาภายในได้
- crate
vm มี virtual machine ที่สามารถรันโค้ดได้
- crate
vm_cli เป็นตัวเรียกใช้งานผ่านบรรทัดคำสั่งแบบเรียบง่ายสำหรับ VM
- ผู้เขียนกำลังพิจารณาแยก crate
reader ออกเป็นรีโพซิทอรีแยกต่างหากเพื่อให้ผู้อื่นนำไปใช้ได้
- การโหลดไฟล์
.class เป็นขั้นตอนแรกของการรันโค้ด Java
- ไฟล์คลาสมีเมทาดาทาของคลาส ชื่อ superclass และ interface, fields และ methods รวมถึง descriptor และ bytecode ของมัน
- API หลักของ crate
vm คือ Vm::invoke ซึ่งใช้สำหรับรันเมธอด
- crate
vm รองรับทั้งเมธอด Java bytecode และ native method ที่อิมพลีเมนต์ด้วย Rust
- JVM เป็นระบบแบบ stack-based โดยคำสั่ง bytecode จะทำงานกับ value stack และ local variables
- ค่าและอ็อบเจ็กต์ถูกสร้างโมเดลด้วย
enum และ struct ของ Rust
- การรันเมธอดเกี่ยวข้องกับการประมวลผลคำสั่ง bytecode ทีละคำสั่ง อัปเดต program counter และจัดการ stack กับ local variables
- JVM รองรับการเรียกเมธอดหลายประเภท รวมถึงการค้นหาแบบ virtual และ static
- ข้อยกเว้นถูกอิมพลีเมนต์ด้วย exception table และสามารถขัดจังหวะ control flow ปกติของเมธอดได้
- ผู้เขียนภูมิใจกับการอิมพลีเมนต์ข้อยกเว้นโดยใช้
Result และ pattern matching ของ Rust
- JVM มี garbage collector ที่ใช้ stop-the-world semispace copying algorithm
- garbage collector จะแบ่งหน่วยความจำออกเป็นสอง semispace และคัดลอกอ็อบเจ็กต์ที่ยังมีชีวิตจาก semispace หนึ่งไปยังอีกฝั่ง
- ผู้เขียนได้รับทั้งความสนุกและการเรียนรู้มากมายจากการเขียน rjvm ด้วย Rust
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News