2 điểm bởi GN⁺ 2024-11-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • Công cụ biên dịch JavaScript sang WebAssembly, tương tự porffor ở điểm tạo ra các nhị phân WASM độc lập. Được viết bằng Rust
  • Đây là một công cụ thử nghiệm, vẫn chưa sẵn sàng để dùng trong production, và còn thiếu hoặc chưa hoàn thiện nhiều tính năng ngôn ngữ cũng như các kiểu dựng sẵn
  • Mục tiêu là đạt được mức hỗ trợ 100% cho ngôn ngữ.

##Vì sao là Jawsm?

  • Dự án Jawsm bắt đầu trong quá trình làm Crowst, một công cụ stress test để chạy các kịch bản WebAssembly.
  • Chỉ hỗ trợ mã được biên dịch từ Rust sang WASM, nhưng Rust không phải là ngôn ngữ được dùng rộng rãi.
  • Việc chạy ngôn ngữ kịch bản trên WASM hiện vẫn chưa lý tưởng. Hoặc phải kèm theo một trình thông dịch, hoặc phải dùng một biến thể của ngôn ngữ đích.
  • Tác giả tin rằng với các đề xuất WASM hiện đại, có thể hiện thực 100% tính năng JavaScript mà không cần trình thông dịch đã biên dịch.

Những gì đang hoạt động

  • Mục tiêu là hiện thực 100% ngôn ngữ và hiện đang tập trung vào việc triển khai ngữ nghĩa.
  • Có 4 hạng mục khó triển khai: scope/closure, try/catch, async/await, generator.
  • Hiện tại Jawsm đã triển khai việc biên dịch mã dùng closure, try/catch, API Promise giới hạn và async.
  • Các tính năng đang hoạt động: khai báo và gán biến, while, chuỗi literal, số và các toán tử cơ bản, boolean và các toán tử boolean cơ bản, array literal, object literal, từ khóa new.

Yêu cầu phía host

  • Jawsm được xây dựng dựa trên các đề xuất WASM gần đây, nên các nhị phân được tạo ra có tính di động kém giữa các runtime.
  • Đang được triển khai với WASIp2 trong đầu, và sử dụng V8 cùng polyfill JavaScript cho các tính năng WASIp2.
  • Có script run.js để chạy các nhị phân do Jawsm tạo ra.

Cách dùng

  • Khuyến nghị không sử dụng trừ khi bạn định đóng góp.
  • Sau khi clone repository, có thể dùng script execute.sh để tạo file WAT, biên dịch thành nhị phân rồi chạy bằng Node.js.
  • Cần Rust cargo, phiên bản mới nhất của wasm-tools, và Node.js v23.0.0 trở lên.

Bước tiếp theo

  • Trước tiên dự định sẽ hoàn thành các tính năng khó triển khai; tiếp theo là hỗ trợ generator và từ khóa await.
  • Muốn sử dụng đề xuất chuyển đổi stack, nhưng hiện tại đang dùng biến đổi CPS để mô phỏng continuation.
  • Sau đó sẽ triển khai cú pháp cùng các kiểu dựng sẵn và API.

Cách hoạt động

  • Dự án chuyển đổi cú pháp JavaScript thành các lệnh WASM, đồng thời tận dụng các đề xuất WASM GC, xử lý ngoại lệ và tối ưu hóa tail call.
  • Để mô phỏng scope và closure của JavaScript trong WASM, dự án tạo thêm mã WASM bổ sung.

1 bình luận

 
GN⁺ 2024-11-11
Ý kiến trên Hacker News
  • Đây là một cách sử dụng thông minh của đề xuất WASM GC mới. Các trình biên dịch JS -> WASM trước đây thường bao gồm toàn bộ JS engine, nhưng dự án này cố gắng ánh xạ trực tiếp các cấu trúc JS sang các thành phần cơ bản của WASM.

    • Trước đây tôi từng tạo một trình biên dịch nhúng ARM gần như là TypeScript. Một vài kỹ thuật có thể sẽ hữu ích.
  • Tôi thích viết Rust, nhưng đây không phải là một ngôn ngữ được dùng rộng rãi. Rust hiện rất được chú ý và có vẻ như đang được sử dụng ở nhiều nơi.

  • Tôi tin rằng nó sẽ có thể bao phủ 100% đặc tả JavaScript. Hoan nghênh mọi ý tưởng, câu hỏi hoặc phê bình.

    • Tôi tò mò không biết có kết quả từ test262_runner.rb hay không. Sẽ rất tốt nếu README hiển thị tiến độ này. Dự án rất tuyệt.
  • Tôi đã đọc README.md của dự án, nhưng vẫn không chắc cách sử dụng được kỳ vọng là gì. Tôi tò mò mã WASM được tạo ra sẽ tương tác với runtime như thế nào. Không rõ đây có phải là công cụ được nhắm tới để tương thích với trình duyệt và các runtime WASM khác hay chỉ tương thích với runtime đi kèm dự án.

    • Tôi cũng tò mò nó phản ứng thế nào khi gặp các Web API hoặc các định danh global chỉ được định nghĩa trong những môi trường cụ thể bên trong mã JavaScript. Nếu nó không dành cho môi trường đó, thì khi sử dụng nó, I/O sẽ được xử lý như thế nào?
  • "Chạy JS mà không cần runtime trình duyệt" đang đến gần. perforr, jaws hoặc một dự án khác cuối cùng sẽ thành công.

  • Tôi tò mò việc xử lý sự không khớp mã hóa chuỗi và các tiện ích liên quan được làm như thế nào. WASM hỗ trợ UTF-8 còn JS hỗ trợ UTF-16 (có thể không hợp lệ).

  • Tôi rất thích cách tiếp cận này. Thay vì cố tạo binary trực tiếp, việc build trực tiếp cho WASM có nghĩa là có thể dựa vào WASM GC và hỗ trợ bất đồng bộ được kỳ vọng như một phần của WASI 0.3.

  • Một số người gọi đây là trình biên dịch. Làm rất tốt.

  • Tôi tò mò liệu đoạn mã này có chạy nhanh hơn so với việc chạy cùng đoạn mã đó trong JS hay không, hay nó chủ yếu nhằm phục vụ khả năng tương tác với các ngôn ngữ khác.