2 điểm bởi GN⁺ 2025-02-05 | 1 bình luận | Chia sẻ qua WhatsApp

WebAssembly là gì?

  • WebAssembly là một tập lệnh và định dạng bytecode đã được tiêu chuẩn hóa, được thiết kế để chạy mã phía máy khách không đáng tin cậy trong trình duyệt web với tốc độ gần như native.
  • Nó phát triển từ Emscripten, một trình biên dịch từ C/C++ sang JavaScript, ban đầu chuyển LLVM IR sang JavaScript để có thể chạy mã C và C++ trên web.
  • Theo thời gian, các nhà phát triển trình duyệt đã hợp tác với dự án Emscripten để tạo ra một tập con đơn giản của JavaScript nhằm tối ưu hiệu năng, và tập con này sau đó được tiêu chuẩn hóa thành asm.js.
  • Sau đó, để tránh overhead của JavaScript, một định dạng bytecode độc lập đã được thiết kế, và đó chính là Wasm.
  • Gần đây, WebAssembly cũng đang trở nên phổ biến ngoài phạm vi trình duyệt; Fastly và Shopify đã xây dựng các sản phẩm Edge Compute và Functions dựa trên các engine WebAssembly.
  • WebAssembly là một nền tảng hấp dẫn để xây dựng hệ sinh thái plugin nhờ khả năng được nhiều ngôn ngữ nguồn khác nhau nhắm tới.

Vì sao lại là trình thông dịch WebAssembly?

  • Giống như nhiều kỹ sư phần mềm khác, tác giả thường rơi vào kiểu bắt đầu một side project mới rồi mất hứng thú sau vài tuần.
  • Tác giả cần một dự án lớn có thể đầu tư công sức trong thời gian dài, đồng thời giúp tiếp cận với các tầng thấp hơn của ngăn xếp tính toán.
  • Tác giả bắt đầu quan tâm đến làn sóng hype quanh WebAssembly và thấy nó hấp dẫn như một công cụ platform engineering, nơi có thể thiết kế các system call tùy chỉnh.

Semblance

  • Để làm quen với WebAssembly Core Specification, tác giả quyết định viết một trình thông dịch WebAssembly.
  • Vì mục tiêu của dự án là để học, tác giả không định triển khai mọi opcode hay vượt qua toàn bộ bộ kiểm thử cốt lõi.
  • Chỉ cần chạy được chương trình "Hello, World!" là đã thấy hài lòng.

Kết quả

  • Dự án được xem là một thành công lớn. Dù độ bao phủ opcode chưa đầy đủ, nó vẫn có thể chạy một chương trình "Hello, World!" đơn giản.
  • Mã nguồn lộn xộn, chậm, có rò rỉ bộ nhớ và có thể dễ bị tấn công bởi các module độc hại, nhưng nó hoạt động.
  • Tác giả đã học được rất nhiều về đặc tả cốt lõi của WebAssembly và có thể bước ra khỏi vùng an toàn của mình với tư cách một kỹ sư.
  • Giờ đây tác giả cảm thấy mình đã có đủ kiến thức về WebAssembly để đóng góp cho các runtime công nghiệp như Wasmtime.

1 bình luận

 
GN⁺ 2025-02-05
Bình luận trên Hacker News
  • Tôi từng có trải nghiệm viết một trình thông dịch Wasm bằng Scheme, nên rất vui khi thấy người khác tự tay làm việc này. Wasm ít khó hơn tưởng tượng, và tôi khuyên hãy thử ở mức đủ để thấy thú vị, không nhất thiết phải triển khai mọi lệnh

    • Một mẹo dành cho tác giả: spec-test có chứa các dạng text wasm khá phức tạp, nhưng nếu dùng bộ chuyển đổi wast2json thì có thể thu được mô tả JSON đơn giản hơn cùng với các tệp wasm nhị phân thông thường
  • Câu hỏi của người mới:

    • Tôi tò mò không biết sẽ debug như thế nào khi không trực tiếp tự code trình thông dịch
    • Tôi muốn biết việc fuzzing opcode dạng chuỗi hiệu quả đến mức nào
    • Tôi tò mò sự khác biệt thực tế giữa engine WASM phía máy chủ và engine dựa trên trình duyệt là bao nhiêu, và cần bao nhiêu công sức để chuyển từ cái này sang cái kia
  • Tôi tìm thấy một bài viết thú vị về việc tự diễn giải WASM

  • Đây là một cách tiếp cận thú vị và là một công trình rất tốt

  • Tôi nghĩ việc chọn Wasm-C-API làm giao diện chuẩn sẽ là một ý tưởng hay

    • Đây là API được đa số runtime Wasm (Wasmmer, V8, wasmi, v.v.) áp dụng, lại được viết bằng C, nên các lập trình viên quen với API đó có thể dễ dàng thử nghiệm
    • Nếu tác giả đã quen với Wasm, việc đóng góp patch hoặc cải tiến cho Wasmer cũng sẽ rất được hoan nghênh
  • Một điểm có thể gây tranh cãi:

    • Tôi tò mò liệu có quan tâm đến việc bổ sung các lệnh tail call ban đầu hay không
    • Những người phụ trách đặc tả WASM đã bác bỏ điều này vì cho rằng nó là "cấp cao", nhưng ủy ban C cũng từng bác bỏ đề xuất của Dennis Ritchie. Có vẻ Rob Pike cũng ủng hộ hướng đi của Ritchie. Nếu không thì tại sao ông ấy lại tạo ra Golang? Tail call chỉ là cấp cao khi chính lời gọi là cấp cao
  • Tôi khuyên nên xem qua Orca. Đây có thể là một cơ hội tốt để đóng góp: https://orca-app.dev

  • Thật tuyệt khi được thấy quá trình đào sâu vào WebAssembly và xây dựng một trình thông dịch từ đầu

  • Một bài viết rất hay, tạo động lực để tôi quay lại với việc triển khai WASM

  • Công việc thực sự rất ấn tượng