3 คะแนน โดย GN⁺ 2023-07-22 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ผู้เขียนได้สร้าง 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 ความคิดเห็น

 
GN⁺ 2023-07-22
ความคิดเห็นจาก Hacker News
  • การนำตัวเก็บขยะของ JVM ที่เขียนด้วย Rust ไปใช้งาน ทำให้เกิดคำถามเกี่ยวกับการรับประกันว่าการอ้างอิงไปยังฮีปถูกทำรูตอย่างเหมาะสม
  • บทความระบุว่าเมื่อรันทดสอบในรีโพซิทอรีที่โคลนมา จะเกิดข้อผิดพลาดในการเพิ่มรายการเข้าไปในคลาสพาธ
  • ผู้แสดงความเห็นรำลึกถึงประสบการณ์ที่เคยทำงานในโปรเจ็กต์ Java OS ในอดีต และเน้นย้ำข้อดีด้านความปลอดภัยของหน่วยความจำจากการนำ JVM ไปเขียนด้วย Rust
  • มีคำถามเกี่ยวกับการรองรับ generics ใน JVM โดยถามว่าทุกอย่างถูกจัดการเป็น Object ทั้งหมดเพราะ type erasure หรือไม่
  • ผู้แสดงความเห็นถามถึงข้อจำกัดของการใช้ lifetime ในฟังก์ชันซิกเนเจอร์ และผลกระทบต่อการจัดการข้อผิดพลาด
  • โปรเจ็กต์นี้ได้รับคำชื่นชมทั้งในด้านความสำเร็จและประสบการณ์การเรียนรู้
  • มีการยื่นข้อเสนองานให้กับผู้ก่อตั้งโปรเจ็กต์
  • มีการแชร์ลิงก์ไปยังการนำ JVM ไปใช้งานอีกรายการหนึ่งที่เขียนด้วย Go
  • ผู้แสดงความเห็นชื่นชมโปรเจ็กต์นี้และขอคำแนะนำเกี่ยวกับคู่มือเริ่มต้นใช้งาน Rust
  • โปรเจ็กต์นี้ถูกอธิบายว่าเป็นชั้นฐานของ JVM ที่มีกลไกพื้นฐานที่น่าสนใจ
  • มีการกล่าวถึงโปรเจ็กต์ระบบปฏิบัติการงานอดิเรกแบบขำ ๆ
  • มีการแชร์ลิงก์ไปยังโปรเจ็กต์ที่คล้ายกัน