- Alat untuk mengompilasi JavaScript ke WebAssembly, mirip dengan porffor karena menghasilkan biner WASM mandiri. Ditulis dalam Rust
- Alat eksperimental yang masih belum siap digunakan di produksi, dan banyak fitur bahasa serta tipe bawaan yang masih kurang atau belum lengkap
- Tujuannya adalah mencapai dukungan 100% untuk bahasa tersebut.
Mengapa Jawsm?
- Proyek Jawsm dimulai saat mengerjakan Crowst, alat stress test yang menjalankan skenario WebAssembly.
- Hanya mendukung kode yang dikompilasi dari Rust ke WASM, tetapi Rust bukan bahasa yang digunakan secara luas.
- Menjalankan bahasa skrip di atas WASM saat ini belum ideal. Harus menyertakan interpreter, atau menggunakan varian dari bahasa target.
- Mereka percaya bahwa dengan proposal WASM modern, implementasi 100% fitur JavaScript dimungkinkan tanpa interpreter terkompilasi.
Yang sudah berfungsi
- Menargetkan implementasi 100% bahasa dan berfokus pada implementasi semantik.
- Empat hal yang sulit diimplementasikan: scope/closure, try/catch, async/await, generator.
- Saat ini Jawsm mengimplementasikan kompilasi kode yang menggunakan closure, try/catch,
Promise API terbatas, dan async.
- Fitur yang berfungsi: deklarasi dan penugasan variabel,
while, string literal, angka dan operator dasar, boolean dan operator boolean dasar, array literal, object literal, kata kunci new.
Persyaratan host
- Jawsm dibangun dengan proposal WASM terbaru, sehingga biner yang dihasilkan kurang portabel antar-runtime.
- Diimplementasikan dengan mempertimbangkan WASIp2, dan menggunakan V8 dengan polyfill JavaScript untuk fitur WASIp2.
- Ada skrip
run.js yang dapat menjalankan biner yang dihasilkan Jawsm.
Cara penggunaan
- Sebaiknya jangan digunakan kecuali jika Anda ingin berkontribusi.
- Setelah meng-clone repositori, Anda dapat menggunakan skrip
execute.sh untuk menghasilkan file WAT, mengompilasikannya menjadi biner, lalu menjalankannya dengan Node.js.
- Membutuhkan
cargo dari Rust, wasm-tools versi terbaru, dan Node.js v23.0.0 atau lebih baru.
Langkah berikutnya
- Mereka berencana menyelesaikan lebih dulu fitur yang sulit diimplementasikan, dan berikutnya adalah dukungan generator serta kata kunci
await.
- Mereka ingin menggunakan proposal stack switching, tetapi saat ini mensimulasikan continuations dengan transformasi CPS.
- Setelah itu mereka akan mengimplementasikan sintaks serta tipe bawaan dan API.
Cara kerjanya
- Proyek ini mengubah sintaks JavaScript menjadi instruksi WASM, serta memanfaatkan proposal WASM GC, exception handling, dan tail-call optimization.
- Mereka menulis kode WASM tambahan untuk mensimulasikan scope dan closure JavaScript di WASM.
1 komentar
Komentar Hacker News
Ini adalah penggunaan yang cerdas dari proposal WASM GC baru. Kompiler JS -> WASM sebelumnya menyertakan seluruh engine JS, tetapi proyek ini mencoba memetakan struktur JS langsung ke elemen dasar WASM.
Saya suka menulis Rust, tetapi ini bukan bahasa yang digunakan secara luas. Rust sedang sangat mendapat perhatian akhir-akhir ini, dan tampaknya digunakan di banyak tempat.
Saya yakin ini bisa mencakup 100% spesifikasi JavaScript. Ide, pertanyaan, atau kritik sangat diterima.
test262_runner.rb. Akan bagus jika README menampilkan progres ini. Proyek yang hebat.Saya sudah membaca README.md proyek ini, tetapi saya masih belum yakin seperti apa penggunaan yang dimaksud. Saya penasaran bagaimana kode WASM yang dihasilkan berinteraksi dengan runtime. Apakah ini dimaksudkan sebagai alat yang kompatibel dengan browser dan runtime WASM lainnya, atau hanya kompatibel dengan runtime yang terhubung ke proyek ini.
"Menjalankan JS tanpa runtime browser" semakin dekat.
perforr,jaws, atau proyek lain pada akhirnya akan berhasil.Saya penasaran bagaimana ketidakcocokan encoding string dan utilitas terkait ditangani. WASM mendukung UTF-8 dan JS mendukung UTF-16 (yang berpotensi tidak valid).
Saya sangat menyukai pendekatan ini. Alih-alih mencoba menghasilkan biner secara langsung, membangun langsung untuk WASM berarti bisa bergantung pada dukungan asinkron yang diharapkan hadir sebagai bagian dari WASM GC dan WASI 0.3.
Beberapa orang menyebut ini sebagai kompiler. Kerja yang luar biasa.
Saya penasaran apakah kode ini berjalan lebih cepat daripada menjalankan kode yang sama di JS, atau apakah ini ditujukan untuk interoperabilitas dengan bahasa lain.