
WebAssembly Component Model là gì?
WebAssembly Component Model là một kiến trúc tiên tiến cho phép xây dựng các thư viện, ứng dụng và môi trường WebAssembly có khả năng tương tương tốt. Nó giải quyết vấn đề về khả năng tương tác giữa các thành phần WASM được viết bởi các ngôn ngữ lập trình và công cụ khác nhau.
Tại sao cần Component Model?
WebAssembly hiện nay chủ yếu tập trung vào các mô-đun (modules) độc lập với giao diện nhị phân (binary ABI) cố định. Tuy nhiên, khi các ứng dụng WASM trở nên phức tạp hơn, nhu cầu chia sẻ mã giữa các thành phần, tái sử dụng thư viện, và kết hợp nhiều ngôn ngữ trong một dự án ngày càng tăng. Component Model ra đời để cung cấp một lớp trừu tượng mới — component — mức độ trừu tượng hơn so với module, hỗ trợ kiểu dữ liệu phong phú, giao tiếp có kiểu (typed interfaces), và cơ chế nhập/xuất linh hoạt.
Các khái niệm cốt lõi
Components
Một component là một đơn vị mô-đun mở rộng của WebAssembly. Khác với module (chỉ chứa mã WASM nguyên thủy), component có thể đóng gói nhiều module con, tài nguyên (resources), và định nghĩa giao diện (interface) cho phép khác. Component cung cấp một cách thức chuẩn để mã do người khác viết có thể được tái sử dụng mà không cần biết chi tiết cài đặt bên trong.
Interfaces (Giao diện)
Giao diện (interface) định nghĩa bộ API mà một component cung cấp hoặc tiêu thụ. Giao diện giúp tách biệt giữa phần cài đặt và phần giao tiếp. Một giao diện có thể mô tả các hàm (function), kiểu dữ liệu (type), và tài nguyên (resource) được chia sẻ giữa các component.

Worlds (Thế giới)
World là một tập hợp các giao diện được nhóm lại. Một world mô tả môi trường mà một component có thể chạy trong đó — bao gồm các giao diện mà component cung cấp (export) và các giao diện mà component cần thiếu (import). World giúp xác định rõ contract giữa platform và component.
Packages (Gói)
Package là đơn vị phân phối chứa một hoặc nhiều thành phần, giao diện, và world. Package sử dụng WIT (WebAssembly Interface Type) để mô tả cấu trúc và quan hệ. Các package có thể phiên bản hóa và được xuất bản trong registry như BytecodeALLIANCE.
WIT – WebAssembly Interface Types
WIT (WebAssembly Interface Types) là ngôn ngữ khai báo giao diện cho Component Model. WIT cho phép định nghĩa các hàm, kiểu dữ liệu phức tạp (string, list, record, variant), và tài nguyên một cách có kiểu an toàn. Dưới đây là một ví dụ WIT đơn giản:
package example:[email protected]
interface greet {
greet: func(name: string) -> string
}
world cli-world {
export greet
}

Hỗ trợ ngôn ngữ lập trình
Component Model hỗ trợ hầu hết ngôn ngữ lập trình phổ biến thông qua các công cụ biên dịch khác nhau:
- Rust: Hỗ trợ thông qua cargo-component, tích hợp sẵn async runtime.
- JavaScript/TypeScript: Hỗ trợ thông qua jco (JavaScript Components Transpiler).
- Go: Hỗ trợ thông qua wit-bindgen.
- Python: Hỗ trợ thông qua PyO3 và wasmtime.
- C/C++: Hỗ trợ thông qua WASI SDK.
- C#, TinyGo, MoonBit: Các ngôn ngữ khác đang được hỗ trợ hoặc phát triển.
Async, Streams và Futures
Component Model hỗ trợ lập trình bất đồng bộ (async) thông qua các kiểu stream và future. Điều này cho phép các thành phần giao tiếp bằng luồng dữ liệu liên tục hoặc nhận kết quả bất đồng bộ, rất hữu ích cho các ứng dụng I/O nặng như máy chủ web, xử lý dữ liệu thời gian thực, hoặc kết nối mạng.
WebAssembly System Interface (WASI)
Component Model được thiết kế chặt chẽ với WASI (WebAssembly System Interface), chuẩn API hệ thống cho WASM. Phiên bản ổn định hiện tại là WASI 0.2.0 (phát hành ngày 25 tháng 1 năm 2024). WASI cung cấp các API để truy cập hệ thống như đọc/ghi file, mạng, thời gian, và môi trường thực thi bảo mật.

Thành phần và công cụ chi phóng
Các nền tảng thời gian chạy (runtime) hỗ trợ Component Model bao gồm:
- Wasmtime: Runtime phần phát triển bởi Bytecode Alliance, hỗ trợ đầy đử độ Component Model.
- jco: Công cụ transpiler JavaScript, biến component thành mã JS có thể chạy trong browser hoặc Node.js.
- Wasmer: Runtime đa nền tảng hỗ trợ Component Model qua plugin.
Định dạng và truyền tải
Component Model định nghĩa ba định dạng chính:
- Định dạng nhị phân: Mở rộng từ WebAssembly binary format, thêm các đoạn (section) mới cho component.
- Định dạng văn bản (Component Text Format): Biểu diễn con người của component, dựa trên WAT (WebAssembly Text Format).
- Canonical ABI: Quy tắc mã hóa (encoding) dữ liệu giữa các component và module con, bao gồm cơ chế chuyển đổi kiểu (lowering/raising).
Tương lai của Component Model
Component Model đang được phát triển tăng dần thông qua các bản cập nhật WASI Developer Preview. Các tính năng sắp tới bao gồm hỗ trợ đa luồng (threads), kênh (channels), và cải tiến Canonical ABI. Bạn có thể theo dõi tiến trình phát triển từ kho lưu trữ GitHub chính thức và tài liệu Bytecode Alliance.
