2 คะแนน โดย GN⁺ 2024-11-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เครื่องมือสำหรับคอมไพล์ 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, Promise API แบบจำกัด และ 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 ความคิดเห็น

 
GN⁺ 2024-11-11
ความคิดเห็นจาก Hacker News
  • เป็นการใช้ข้อเสนอ WASM GC แบบชาญฉลาด คอมไพเลอร์ JS -> WASM แบบเดิมมักรวมเอนจิน JS ทั้งตัวไว้ด้วย แต่โปรเจ็กต์นี้พยายามแมปโครงสร้างของ JS ไปยังองค์ประกอบพื้นฐานของ WASM โดยตรง

    • เมื่อก่อนเคยสร้างคอมไพเลอร์สำหรับ ARM แบบฝังตัวที่เกือบจะใกล้เคียงกับ TypeScript มากอยู่แล้ว เทคนิคบางอย่างอาจมีประโยชน์
  • ชอบเขียน Rust แต่ก็ไม่ได้เป็นภาษาที่ถูกใช้อย่างแพร่หลาย Rust ได้รับความสนใจอย่างมากในช่วงนี้ และดูเหมือนว่าจะถูกใช้งานในหลายที่

  • มั่นใจว่าน่าจะครอบคลุมสเปกของ JavaScript ได้ 100% ยินดีรับไอเดีย คำถาม หรือคำวิจารณ์

    • อยากรู้ว่ามีผลลัพธ์ของ test262_runner.rb หรือไม่ ถ้าแสดงความคืบหน้านี้ไว้ใน README ก็น่าจะดี เป็นโปรเจ็กต์ที่ยอดเยี่ยม
  • อ่าน README.md ของโปรเจ็กต์แล้ว แต่ก็ยังไม่แน่ใจว่ารูปแบบการใช้งานที่คาดหวังคืออะไร อยากรู้ว่าโค้ด WASM ที่สร้างขึ้นมามีปฏิสัมพันธ์กับรันไทม์อย่างไร ตั้งใจให้เป็นเครื่องมือที่เข้ากันได้กับเบราว์เซอร์และรันไทม์ WASM อื่น ๆ หรือว่าจะเข้ากันได้เฉพาะกับรันไทม์ที่พ่วงมากับโปรเจ็กต์เท่านั้น

    • อยากรู้ว่ามันตอบสนองอย่างไรเมื่อเจอ Web API หรือ global identifier ที่ถูกกำหนดไว้เฉพาะในบางสภาพแวดล้อมภายในโค้ด JavaScript ถ้าไม่ได้มีไว้สำหรับสภาพแวดล้อมนั้น ก็อยากรู้ว่าเวลาจะใช้งานต้องทำ I/O อย่างไร
  • "การรัน JS โดยไม่ต้องมีรันไทม์ของเบราว์เซอร์" กำลังใกล้เข้ามาแล้ว perforr, jaws หรือโปรเจ็กต์อื่น ๆ สุดท้ายจะต้องมีสักตัวที่สำเร็จ

  • อยากรู้ว่าจัดการกับความไม่ตรงกันของการเข้ารหัสสตริงและยูทิลิตีที่เกี่ยวข้องอย่างไร WASM รองรับ UTF-8 ขณะที่ JS รองรับ UTF-16 ที่อาจไม่ถูกต้องได้

  • ชอบแนวทางนี้มาก การบิวด์สำหรับ WASM โดยตรงแทนที่จะพยายามสร้างไบนารีโดยตรง หมายความว่าสามารถพึ่งพา WASM GC และการรองรับ async ที่คาดว่าจะมาเป็นส่วนหนึ่งของ WASI 0.3 ได้

  • บางคนเรียกสิ่งนี้ว่าคอมไพเลอร์ เป็นงานที่ยอดเยี่ยม

  • อยากรู้ว่าโค้ดนี้รันได้เร็วกว่าเมื่อเทียบกับการรันโค้ดเดียวกันใน JS หรือว่ามีไว้เพื่อการทำงานร่วมกับภาษาอื่นมากกว่า