Brimstone - Mesin JavaScript ES2025 yang Ditulis dengan Rust
(github.com/Hans-Halverson)- Mesin JavaScript yang diimplementasikan dari nol dengan Rust, dengan arsitektur yang mendukung spesifikasi ECMAScript hampir sepenuhnya
- Saat ini telah lolos lebih dari 97% bahasa ECMAScript, dan telah diverifikasi dengan pengujian berbasis test262
- Terinspirasi oleh desain Ignition milik V8 dan LibJS dari SerenityOS, dengan sebagian besar komponen diimplementasikan sendiri dengan pendekatan meminimalkan dependensi
- Menyertakan VM bytecode, garbage collector kompak, mesin RegExp kustom, dan parser, serta menyediakan objek dan fungsi bawaan yang sesuai spesifikasi
- Meski belum selesai untuk penggunaan produksi, ini merupakan kemajuan penting dalam pengembangan mesin JS berbasis Rust dengan kemampuan setingkat ES2025
Ikhtisar Brimstone
- Brimstone adalah mesin JavaScript yang sepenuhnya baru ditulis dengan Rust, dengan tujuan mengimplementasikan spesifikasi ECMAScript secara setia
- Saat ini mendukung lebih dari 97% bahasa ECMAScript dan lolos pengujian test262
- Ini masih merupakan proyek yang sedang dikembangkan dan belum siap digunakan di lingkungan produksi
Desain dan implementasi
- Mengimplementasikan spesifikasi ECMAScript secara langsung, dengan inspirasi desain dari V8 dan LibJS milik SerenityOS
- Sebagian besar komponen mesin diimplementasikan sendiri tanpa dependensi, dengan ICU4X sebagai satu-satunya pengecualian
- Komponen utama:
- VM berbasis bytecode yang merujuk pada V8 Ignition
- Garbage collector kompak yang ditulis dengan kode Rust yang sangat unsafe
- Mesin RegExp kustom dan parser
- Implementasi objek dan fungsi bawaan yang sesuai spesifikasi
Build dan menjalankan
- Dapat di-build dan dijalankan dengan perintah Cargo standar
cargo buildmembuat berkas eksekusibscargo runmenjalankan langsung dari source
- Contoh menjalankan berkas JavaScript:
cargo build ./target/debug/bs ./hello.js Hello world!
Sistem pengujian
- Memanfaatkan rangkaian pengujian integrasi pihak pertama dan pihak ketiga, termasuk test262 resmi
- Menyertakan runner pengujian integrasi kustom (dijalankan dengan perintah
cargo brimstone-test) - Pengujian unit dan snapshot dijalankan dengan
cargo test - Informasi pengujian tambahan tersedia di
tests/README.md
Fitur yang belum diimplementasikan
- Sudah mengimplementasikan semua fitur hingga ES2024 dan sebagian besar proposal Stage 4 berdasarkan rapat TC39 Februari 2025
- Fitur yang masih belum didukung:
- SharedArrayBuffer
- Atomics
2 komentar
Mantap banget..
Komentar Hacker News
Terima kasih kepada @ivankra yang menambahkannya ke javascript-zoo dan menjalankan benchmark
Ini adalah proyek hobi yang saya tekuni secara konsisten selama 3 tahun terakhir untuk meningkatkan kematangan dan performa
Ukurannya mungkin akan membesar jika fiturnya disejajarkan dengan Boa dan diperkuat untuk penggunaan produksi, tetapi cukup mengesankan bahwa dengan ukuran sekecil ini ia lulus 97% spesifikasi
Brimstone tidak, dan itu mencakup sebagian besar perbedaan ukuran
Untuk menangani Unicode dengan benar, dibutuhkan data beberapa MB, jadi membuat executable kecil bukan hal yang mudah saat ini
Jika dukungan Unicode wajib ada, maka ada batas ukuran minimum
Konfigurasi default biasanya berfokus pada performa, jadi hasilnya bisa berubah jika opsi seperti
codegen-units=1atau penghapusan panic diubahBoa hanya meluluskan sekitar 91%, jadi Brimstone lebih matang
Proyek yang lebih kecil cenderung memiliki kode yang kecil, rapi, dan mudah dirawat
Kolaborasi selalu membawa overhead tertentu
Repositori Boa
Fungsinya hampir setara dengan Boa, dan pada beberapa benchmark dua kali lebih cepat
Menurut saya itu alur yang wajar
Namun katanya proyek ini cukup banyak memakai unsafe
Rasanya seperti semacam fenomena Blub
Pada akhirnya memang unsur pemasaran, tetapi rata-rata tingkat kematangannya tinggi
Saya membayangkan intro Ikari muncul sebelum OS boot
Sepenuhnya native Rust tanpa tautan C/C++
Kita bisa menambahkan scripting JS ke server biner tunggal berukuran 40MB
Keren sekali melihat ada beberapa engine JS berbasis Rust bermunculan
Selama area unsafe diminimalkan, menurut saya tidak masalah
Vecpun secara internal menggunakan unsafeYang penting adalah membatasi unsafe pada area kecil agar bisa diverifikasi
Implementasi GC adalah salah satu area pengecualian itu
Kalau saya membuat runtime JS dengan Rust, saya juga akan mengimplementasikannya dengan aman terlebih dahulu lalu memakai unsafe hanya saat diperlukan
Untuk mengimplementasikan GC berperforma tinggi, ada bagian yang memang tak terhindarkan
Rust hanyalah bahasa imperatif yang cepat dan bagus
RcatauArc