2 poin oleh GN⁺ 2024-11-11 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2024-11-11
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.

    • Dulu saya pernah membuat kompiler embedded ARM yang hampir mendekati Typescript. Beberapa tekniknya mungkin berguna.
  • 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.

    • Saya penasaran apakah ada hasil dari 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.

    • Saya penasaran bagaimana ia bereaksi saat menemukan Web API atau identifier global yang hanya didefinisikan di lingkungan tertentu di dalam kode JavaScript. Jika ini bukan untuk lingkungan tersebut, saya penasaran bagaimana I/O seharusnya dilakukan saat menggunakannya.
  • "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.