Jaws – Trình biên dịch tiền biên dịch JavaScript sang WASM
(github.com/drogus)- 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
Promisegiớ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óanew.
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ủawasm-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
Ý 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.
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 đã đọ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.
"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.