11 điểm bởi GN⁺ 2025-05-10 | 2 bình luận | Chia sẻ qua WhatsApp
  • Đặc tả Wasm 2.0 đã được công bố chính thức
  • Cộng đồng Wasm và các Working Group đã hoàn thiện đặc tả từ năm 2022, và các triển khai lớn đã hỗ trợ 2.0 từ trước
  • Từ 2.0, mô hình evergreen được áp dụng, theo đó tài liệu Candidate Recommendation sẽ liên tục được cập nhật để luôn ở trạng thái mới nhất
  • Thay vì chuyển sang khuyến nghị cuối cùng mỗi khi có phiên bản mới được công bố, bản dự thảo khuyến nghị hiện tại sẽ được xem là tiêu chuẩn

Các tính năng chính và bổ sung trong Wasm 2.0

  • Lệnh vector (SIMD): bổ sung 236 lệnh mới để tận dụng khả năng SIMD 128-bit của CPU hiện đại, hiệu quả cho codec âm thanh/video hiệu năng cao, machine learning, mã hóa và nhiều lĩnh vực khác
  • Lệnh bộ nhớ hàng loạt: bổ sung tập lệnh cho phép sao chép và khởi tạo bộ nhớ cùng bảng một cách nhanh chóng
  • Trả về nhiều giá trị: hàm và khối có thể trả về nhiều giá trị, giúp cải thiện calling convention và cho phép thêm các phép biến đổi chương trình
  • Kiểu tham chiếu: hỗ trợ tham chiếu đến hàm hoặc con trỏ tới đối tượng bên ngoài (ví dụ: giá trị JavaScript) như các giá trị hạng nhất dạng opaque; bảng có thể được dùng làm nơi lưu trữ các giá trị tham chiếu này, đồng thời hỗ trợ lệnh thao tác với bảng và định nghĩa nhiều bảng
  • Chuyển đổi không gây trap: bổ sung lệnh chuyển đổi từ số thực dấu chấm động sang số nguyên mà không phát sinh trap ngoài ý muốn
  • Lệnh mở rộng dấu: thêm các lệnh mở rộng trực tiếp độ rộng của số nguyên có dấu, giúp thực hiện mở rộng mà không cần truy cập bộ nhớ như trước

Tương thích ngược và triển vọng sắp tới

  • Wasm 2.0 hoàn toàn tương thích với 1.0, nên các chương trình hiện có vẫn chạy nguyên vẹn
  • Wasm 3.0 cũng sẽ sớm được phát hành

2 bình luận

 
caniel 2025-05-10

WA!(SM)

 
GN⁺ 2025-05-10
Ý kiến trên Hacker News
  • Tóm tắt tin công bố WASM 2.0 vào tháng 3 năm 2025: đây là một bản nâng cấp lớn với 236 lệnh vector mới như SIMD 128-bit, giúp tăng mạnh hiệu năng cho codec video/âm thanh, machine learning và các ứng dụng mật mã; lệnh bulk memory hỗ trợ sao chép/khởi tạo bộ nhớ nhanh; hàm giờ đây có thể trả về nhiều kết quả để hỗ trợ quy ước gọi hàm nhanh hơn và giảm tham chiếu gián tiếp; reference types cho phép coi con trỏ tới đối tượng bên ngoài (như giá trị JavaScript) là giá trị hạng nhất; có thể khai báo bảng với nhiều kiểu khác nhau; đồng thời bổ sung lệnh mở rộng độ rộng bit và chuyển đổi số thực không còn phát sinh trap ngoài ý muốn
    • Rust+LLVM hiện trên thực tế vẫn chưa tận dụng được khả năng trả về nhiều kết quả do vấn đề tương thích ABI, còn phía Clang thì tôi không rõ
    • Phần lệnh vector (SIMD) có vẻ đã trở nên phức tạp vì theo đuổi tối ưu hóa quá sớm, giá mà chỉ dùng đề xuất flexible-size vectors thì có lẽ đã thanh lịch hơn
    • Tính năng trả về nhiều kết quả sẽ rất hữu ích cho việc phát triển runtime Common Lisp
    • Cuối bài viết chính thức có ghi “sắp giới thiệu Wasm 3.0”, nên có vẻ Wasm 3.0 thực sự sẽ sớm xuất hiện
    • Một ISA độc lập kiến trúc và mang tính tổng quát không thể đồng thời là ISA tận dụng tối đa SIMD của từng CPU cụ thể; phải chọn một trong hai. Tôi chưa kiểm tra được liệu lệnh SIMD của Wasm2 hiện có đủ tổng quát hay không vì bị rate limit trên GitHub
  • Đặc tả WebAssembly khá dễ đọc, nhưng với người mới không muốn lao thẳng vào toàn văn đặc tả thì tôi khuyên đọc cuốn sách online WebAssembly from the Ground Up; sách hướng dẫn từng bước bằng cách tự xây compiler bằng JavaScript nên rất hợp để thực hành, và cũng có bản mẫu miễn phí. Nhân tiện, tôi là một trong các tác giả
    • Cá nhân tôi thích Ada vì những đoạn mã hàm kiểm tra U32 rườm rà như trong JavaScript có thể được xử lý rất gọn trong Ada bằng subtype hoặc module
    • Tôi tò mò liệu có thể instrument mã WASM để debug trong cùng tiến trình hay không; tức là chuyển đổi một ngôn ngữ tùy biến sang WASM theo thời gian thực, rồi triển khai luôn break point và memory inspection trên web
  • Trong một năm gần đây, khi làm việc phát triển runtime WebAssembly, tôi rất ấn tượng với độ chặt chẽ của đặc tả và bộ test được cung cấp đầy đủ; cần chút thời gian để làm quen, nhưng một khi đã quen thì đây là một đặc tả ngôn ngữ cực kỳ thông minh. Trong những tình huống mơ hồ, reference interpreter được sinh trực tiếp từ đặc tả rất hữu ích, và các spec test để kiểm chứng tính nhất quán cũng cực kỳ giá trị
  • Gần đây đề xuất Wasm Constant Time đã bị chuyển sang trạng thái inactive; phần lớn công việc thực tế được thực hiện từ năm 2018, nhưng việc tích hợp với SIMD và hợp nhất vào phần mở rộng chính thức vẫn đang bị trì hoãn. Nếu không có ai tiếp tục công việc cực kỳ quan trọng này, toàn bộ mật mã trên Wasm sẽ rất dễ bị timing attack
  • Tôi thấy thú vị ở chỗ Wasm là dạng rút gọn của WebAssembly chứ không phải một acronym, nên người ta không viết là WASM bằng chữ in hoa
    • Theo logic đó thì chẳng phải nên viết là WAsm sao?
    • Thực ra ngay cả acronym cũng có nhiều trường hợp được viết thường hết (ví dụ: scuba, radar, laser)
    • Hy vọng mọi chuyện suôn sẻ haha
  • Tôi muốn biết danh sách các ứng dụng WASM thực sự hoạt động; ý tưởng thì hay, nhưng cảm giác giống DAPPs ở chỗ “chỉ tồn tại cho vui”. Nếu có ví dụ thực tế thì sẽ rất tốt
    • Khuyên xem madewithwebassembly.com và GitHub Awesome-WebAssembly-Applications. Đây là các nguồn tổng hợp rất tốt về ứng dụng WASM thực tế
  • Bản phát hành WASM2 lần này rất tuyệt, nhưng việc đưa vào SIMD kích thước cố định (128-bit) vẫn khiến tôi thấy tiếc; cách linh hoạt hơn, như ARM SVE nơi compiler điều chỉnh độ rộng SIMD theo hiệu năng của từng thiết bị, có lẽ sẽ tốt hơn
    • Nhưng ngược lại, tôi cho rằng SIMD kích thước cố định lại mở ra nhiều trường hợp sử dụng hơn; lệnh vector có thể được thay thế khá dễ bằng SIMD kích thước cố định. SIMD không phải lúc nào cũng là thứ bắt buộc, nhưng cũng có nhiều trường hợp cơ hội được vector hóa nhờ kích thước thanh ghi, và khi đó nó khá hữu ích
    • Tối ưu hóa quá sớm mới là gốc rễ của vấn đề; riêng chuyện SIMD này cũng sẽ thanh lịch hơn nhiều nếu chỉ đi theo đề xuất vector kích thước biến thiên
  • Tôi thắc mắc liệu hàm C khi trả về giá trị dưới dạng struct có biên dịch được sang WASM hay không
    • Có thể, nhưng theo tôi biết thì hiện tại vẫn chưa thể “export” ra JS
  • Tôi muốn biết đã có runtime nào triển khai các tính năng của WASM2 hay chưa
    • Hầu hết đã triển khai từ lâu rồi; cộng đồng Wasm và nhóm làm việc đã chốt đặc tả từ đầu năm 2022, và các implementation chính đã hỗ trợ 2.0 từ trước đó. 3.0 cũng sắp được chính thức hóa, và một số tính năng hiện đã ở trạng thái thông qua feature flag
  • Tôi nghĩ bytecode cho web là một giấc mơ lâu đời; với tư cách là một lập trình viên C#, tôi thấy ấn tượng khi Blazor đã tiên phong với WASM từ rất sớm. .NET đang đi khá xa trên WASM, và tôi đang mong chờ các thay đổi trong 2.0