Jaws – คอมไพเลอร์ที่คอมไพล์ JavaScript ล่วงหน้าเป็น WASM
(github.com/drogus)- เครื่องมือสำหรับคอมไพล์ JavaScript เป็น WebAssembly โดยคล้ายกับ porffor ตรงที่สร้างไบนารี WASM แบบสแตนด์อโลนได้ เขียนด้วย Rust
- เป็นเครื่องมือเชิงทดลอง และยังไม่พร้อมสำหรับใช้งานในโปรดักชัน โดยฟีเจอร์ของภาษาและชนิดข้อมูล built-in จำนวนมากยังขาดหายหรือยังไม่สมบูรณ์
- เป้าหมายคือทำให้รองรับภาษาได้ 100%
##ทำไมถึงเป็น Jawsm?
- โปรเจ็กต์ Jawsm เริ่มต้นขึ้นระหว่างทำงานกับ Crowst ซึ่งเป็นเครื่องมือ stress test สำหรับรันสถานการณ์ของ WebAssembly
- แม้จะรองรับโค้ดที่คอมไพล์จาก Rust ไปเป็น WASM แต่ Rust ก็ไม่ใช่ภาษาที่ถูกใช้อย่างแพร่หลาย
- การรันภาษาสคริปต์บน WASM ในปัจจุบันยังไม่ใช่ทางเลือกที่เหมาะนัก เพราะต้องฝังอินเทอร์พรีเตอร์ไว้ด้วย หรือไม่ก็ต้องใช้ภาษาปลายทางแบบดัดแปลง
- เชื่อว่าด้วยข้อเสนอ WASM สมัยใหม่ จะสามารถทำให้ JavaScript ทำงานได้ครบ 100% โดยไม่ต้องมีอินเทอร์พรีเตอร์ที่คอมไพล์ไว้
สิ่งที่ใช้งานได้
- ตั้งเป้าให้รองรับภาษาได้ 100% และกำลังโฟกัสที่การทำ semantic implementation
- มี 4 ส่วนที่ทำได้ยาก: scope/closure, try/catch, async/await, generator
- ตอนนี้ Jawsm รองรับการคอมไพล์โค้ดที่ใช้ closure,
try/catch,PromiseAPI แบบจำกัด และasyncแล้ว - ฟีเจอร์ที่ใช้งานได้: การประกาศและกำหนดค่าตัวแปร,
while, string literal, ตัวเลขและโอเปอเรเตอร์พื้นฐาน, boolean และโอเปอเรเตอร์ boolean พื้นฐาน, array literal, object literal, คีย์เวิร์ดnew
ข้อกำหนดของโฮสต์
- Jawsm ถูกสร้างขึ้นบนข้อเสนอ WASM รุ่นใหม่ ทำให้ไบนารีที่สร้างได้ยังพกพาข้ามรันไทม์ได้ไม่ดีนัก
- กำลังพัฒนาโดยคำนึงถึง WASIp2 และใช้ V8 พร้อม JavaScript polyfill สำหรับความสามารถของ WASIp2
- มีสคริปต์
run.jsสำหรับรันไบนารีที่ Jawsm สร้างขึ้น
วิธีใช้งาน
- ไม่แนะนำให้ใช้ เว้นแต่คุณจะเข้ามามีส่วนร่วมพัฒนา
- หลังจากโคลนรีโพแล้ว สามารถใช้สคริปต์
execute.shเพื่อสร้างไฟล์ WAT คอมไพล์เป็นไบนารี แล้วรันด้วย Node.js ได้ - ต้องมี Rust
cargo,wasm-toolsเวอร์ชันล่าสุด และ Node.js v23.0.0 ขึ้นไป
ขั้นถัดไป
- มีแผนจะทำฟีเจอร์ที่ยากให้เสร็จก่อน โดยลำดับถัดไปคือรองรับ generator และคีย์เวิร์ด
await - อยากใช้ข้อเสนอเรื่อง stack switching แต่ตอนนี้กำลังใช้ CPS transform เพื่อจำลอง continuation
- หลังจากนั้นจะเริ่มทำส่วนของไวยากรณ์ รวมถึง built-in type และ API
หลักการทำงาน
- โปรเจ็กต์นี้แปลงไวยากรณ์ JavaScript เป็นคำสั่ง WASM และอาศัยข้อเสนอ WASM GC, exception handling และ tail-call optimization
- มีการเขียนโค้ด WASM เพิ่มเติมเพื่อจำลอง scope และ closure ของ JavaScript บน WASM
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เป็นการใช้ข้อเสนอ WASM GC แบบชาญฉลาด คอมไพเลอร์ JS -> WASM แบบเดิมมักรวมเอนจิน JS ทั้งตัวไว้ด้วย แต่โปรเจ็กต์นี้พยายามแมปโครงสร้างของ JS ไปยังองค์ประกอบพื้นฐานของ WASM โดยตรง
ชอบเขียน Rust แต่ก็ไม่ได้เป็นภาษาที่ถูกใช้อย่างแพร่หลาย Rust ได้รับความสนใจอย่างมากในช่วงนี้ และดูเหมือนว่าจะถูกใช้งานในหลายที่
มั่นใจว่าน่าจะครอบคลุมสเปกของ JavaScript ได้ 100% ยินดีรับไอเดีย คำถาม หรือคำวิจารณ์
อ่าน README.md ของโปรเจ็กต์แล้ว แต่ก็ยังไม่แน่ใจว่ารูปแบบการใช้งานที่คาดหวังคืออะไร อยากรู้ว่าโค้ด WASM ที่สร้างขึ้นมามีปฏิสัมพันธ์กับรันไทม์อย่างไร ตั้งใจให้เป็นเครื่องมือที่เข้ากันได้กับเบราว์เซอร์และรันไทม์ WASM อื่น ๆ หรือว่าจะเข้ากันได้เฉพาะกับรันไทม์ที่พ่วงมากับโปรเจ็กต์เท่านั้น
"การรัน JS โดยไม่ต้องมีรันไทม์ของเบราว์เซอร์" กำลังใกล้เข้ามาแล้ว perforr, jaws หรือโปรเจ็กต์อื่น ๆ สุดท้ายจะต้องมีสักตัวที่สำเร็จ
อยากรู้ว่าจัดการกับความไม่ตรงกันของการเข้ารหัสสตริงและยูทิลิตีที่เกี่ยวข้องอย่างไร WASM รองรับ UTF-8 ขณะที่ JS รองรับ UTF-16 ที่อาจไม่ถูกต้องได้
ชอบแนวทางนี้มาก การบิวด์สำหรับ WASM โดยตรงแทนที่จะพยายามสร้างไบนารีโดยตรง หมายความว่าสามารถพึ่งพา WASM GC และการรองรับ async ที่คาดว่าจะมาเป็นส่วนหนึ่งของ WASI 0.3 ได้
บางคนเรียกสิ่งนี้ว่าคอมไพเลอร์ เป็นงานที่ยอดเยี่ยม
อยากรู้ว่าโค้ดนี้รันได้เร็วกว่าเมื่อเทียบกับการรันโค้ดเดียวกันใน JS หรือว่ามีไว้เพื่อการทำงานร่วมกับภาษาอื่นมากกว่า