- เอนจิน JavaScript ที่สร้างขึ้นใหม่ทั้งหมดด้วย Rust โดยมีโครงสร้างที่รองรับข้อกำหนด ECMAScript ได้เกือบครบถ้วน
- ปัจจุบันผ่านการทดสอบของ ภาษา ECMAScript มากกว่า 97% และได้รับการตรวจสอบด้วยชุดทดสอบบนพื้นฐาน test262
- ได้แรงบันดาลใจจาก สถาปัตยกรรม Ignition ของ V8 และ LibJS ของ SerenityOS พร้อมทั้งพัฒนาองค์ประกอบส่วนใหญ่ขึ้นเองแบบ ลดการพึ่งพาไลบรารีให้น้อยที่สุด
- มีทั้ง bytecode VM, compact garbage collector, RegExp engine แบบคัสตอม และ parser รวมถึงมี built-in object และฟังก์ชันที่เป็นไปตามข้อกำหนด
- แม้จะยัง ไม่สมบูรณ์สำหรับการใช้งานระดับโปรดักชัน แต่ก็ถือเป็นความก้าวหน้าสำคัญของการพัฒนา JS engine บน Rust ที่มีความสามารถระดับ ES2025
ภาพรวมของ Brimstone
- Brimstone คือ เอนจิน JavaScript ที่เขียนขึ้นใหม่ทั้งหมดด้วย Rust โดยมีเป้าหมายเพื่อทำตามข้อกำหนด ECMAScript อย่างครบถ้วน
- ขณะนี้รองรับ ภาษา ECMAScript มากกว่า 97% และผ่านการทดสอบ test262
- ยังเป็น โครงการที่อยู่ระหว่างพัฒนา และยังไม่พร้อมสำหรับใช้งานในสภาพแวดล้อมระดับโปรดักชัน
การออกแบบและการพัฒนา
- พัฒนาโดยอิงการทำตาม ข้อกำหนด ECMAScript โดยตรง และได้รับแรงบันดาลใจด้านการออกแบบจาก V8 และ LibJS ของ SerenityOS
- องค์ประกอบส่วนใหญ่ของเอนจินถูกพัฒนาขึ้นเอง โดยไม่พึ่งพาไลบรารีภายนอก ยกเว้น ICU4X
- องค์ประกอบหลักได้แก่:
- VM แบบ bytecode ที่อ้างอิงแนวทางจาก V8 Ignition
- compact garbage collector ที่เขียนด้วย Rust แบบ unsafe อย่างมาก
- RegExp engine แบบคัสตอม และ parser
- การทำตาม built-in object และฟังก์ชัน ให้สอดคล้องกับข้อกำหนด
การ build และการรัน
ระบบทดสอบ
- ใช้ชุดทดสอบ integration ทั้งจากทางการและของ third-party รวมถึง test262
- มี custom integration test runner รวมอยู่ด้วย (รันด้วยคำสั่ง
cargo brimstone-test)
- การทดสอบแบบ unit และ snapshot ใช้
cargo test
- ดูข้อมูลการทดสอบเพิ่มเติมได้ที่
tests/README.md
ฟีเจอร์ที่ยังไม่รองรับ
- รองรับ ทุกฟีเจอร์จนถึง ES2024 และข้อเสนอ Stage 4 ส่วนใหญ่ตามการประชุม TC39 ณ เดือนกุมภาพันธ์ 2025
- ฟีเจอร์ที่ยังไม่รองรับ:
- SharedArrayBuffer
- Atomics
2 ความคิดเห็น
สุดยอดมาก..
ความคิดเห็นจาก Hacker News
ขอบคุณ @ivankra ที่เพิ่มมันเข้าไปใน javascript-zoo และรันเบนช์มาร์กให้
นี่เป็นโปรเจ็กต์งานอดิเรกที่ฉันค่อย ๆ ทุ่มเวลาให้มาตลอด 3 ปีเพื่อเพิ่มทั้งความสมบูรณ์และประสิทธิภาพ
แม้ขนาดอาจใหญ่ขึ้นได้หากเติมฟีเจอร์ให้เทียบเท่า Boa และเสริมความพร้อมสำหรับ production แต่การที่ผ่านสเปกได้**97%**ด้วยขนาดเท่านี้ก็น่าประทับใจมาก
แต่ Brimstone ไม่ได้ทำแบบนั้น และนั่นคือสาเหตุหลักของความต่างด้านขนาด
ถ้าจะรองรับ Unicode อย่างถูกต้องจำเป็นต้องมีข้อมูลหลาย MB ดังนั้นทุกวันนี้การทำไฟล์ปฏิบัติการให้เล็กจึงไม่ง่าย
ถ้าต้องการรองรับ Unicode ก็จะมีขีดจำกัดขั้นต่ำของขนาดอยู่
ค่าปริยายมักจะเน้นประสิทธิภาพ ดังนั้นถ้าปรับตัวเลือกอย่าง
codegen-units=1หรือการตัด panic ออก ผลลัพธ์อาจเปลี่ยนไปได้Boa ผ่านได้แค่ราว 91% ดังนั้น Brimstone จึงสมบูรณ์กว่ามาก
ยิ่งเป็นโปรเจ็กต์ขนาดเล็ก โค้ดก็มักจะเล็ก สะอาด และดูแลง่าย
การทำงานร่วมกันย่อมมีโอเวอร์เฮดติดมาด้วยเสมอ
คลังเก็บของ Boa
ฟีเจอร์แทบจะใกล้เคียง Boa และในบางเบนช์มาร์กก็เร็วกว่า 2 เท่า
คิดว่าเป็นเรื่องธรรมชาติ
แต่โปรเจ็กต์นี้เองก็ใช้ unsafe ค่อนข้างมากเหมือนกัน
คล้าย ๆ ปรากฏการณ์ Blub
สุดท้ายมันก็เป็นองค์ประกอบทางการตลาดอยู่ดี แต่โดยเฉลี่ยแล้วคุณภาพสูงกว่าจริง
ลองนึกภาพว่า Ikari intro เด้งขึ้นมาก่อน OS จะบูต
เป็น Rust เนทีฟเต็มรูปแบบโดยไม่ต้องลิงก์ C/C++
สามารถเพิ่มการสคริปต์ JS ลงในเซิร์ฟเวอร์ไบนารีเดี่ยวขนาด 40MB ได้
การที่มี JS engine บน Rust เกิดขึ้นหลายตัวถือว่าเจ๋งมากจริง ๆ
ถ้าจำกัดขอบเขตของ unsafe ให้เล็กที่สุดก็ถือว่าโอเค
Vecเองก็ยังใช้ unsafe ภายในประเด็นสำคัญคือทำให้ unsafe ถูกจำกัดอยู่ในขอบเขตเล็ก ๆ และตรวจสอบได้
การทำ GC ก็เป็นหนึ่งในกรณีพิเศษแบบนั้น
ถ้าเป็นฉันแล้วจะทำ JS runtime ด้วย Rust ก็คงเริ่มจากเขียนให้ปลอดภัยก่อน แล้วค่อยใช้ unsafe เท่าที่จำเป็น
ถ้าจะทำ GC ประสิทธิภาพสูง มันก็เป็นส่วนที่เลี่ยงได้ยาก
Rust ก็เป็นเพียงภาษาคำสั่งที่เร็วและดีภาษาหนึ่ง
RcหรือArcเท่านั้น