
WebAssembly (Wasm) là công nghệ mã nhị phân cho phép chạy mã nguồn đã biên dịch từ các ngôn ngữ như C, C++, Rust hay Go trên trình duyệt với tốc độ gần như native. Ra đời từ bản nháp đầu tiên năm 2017 và trở thành chuẩn W3C vào năm 2019, WebAssembly mở ra khả năng thực hiện các ứng dụng web phức tạp như trò chơi 3D, công cụ chỉnh sửa video, và môi trường phát triển trực tiếp trên trình duyệt mà không cần plugin trình duyệt.
Khác với JavaScript, WebAssembly được thiết kế để biên dịch trước (ahead-of-time) và thực thi trong môi trường sandbox cô lập, mang lại hiệu suất ổn định, thời gian khởi động nhanh và ranh giới bảo mật rõ ràng. Điểm quan trọng: WebAssembly không phải là một ngôn ngữ lập trình mới, mà là một mục tiêu biên dịch (compile target). Nhà phát triển viết mã bằng Rust hoặc C++, biên dịch ra file .wasm, rồi runtime WebAssembly nạp và thực thi file đó.
Cấu trúc bên trong một module WebAssembly
Một module .wasm bao gồm năm phần chính:
| Phần | Vai trò |
|---|---|
| Kiểu (type) | Định nghĩa chữ ký hàm, ví dụ (i32, i32) -> i32 |
| Hàm (function) | Mã máy đã biên dịch, là phần lớn nhất của file |
| Bảng (table) | Mảng con trỏ hàm gián tiếp, dùng cho gọi động và thông báo gián tiếp |
| Bộ nhớ (memory) | Bộ nhớ tuyến tính (linear memory) dạng ArrayBuffer, có thể mở rộng |
| Toàn cục (global) | Biến số dùng chung giữa các hàm, ví dụ con trỏ stack |
Khi trình duyệt tải file .wasm, engine sẽ kiểm tra tính hợp lệ (validate), biên dịch tier đầu bằng Liftoff rồi tối ưu bằng TurboFan (JIT tier-2), sau đó thực thi trong một runtime không có quyền truy cập DOM, hệ thống file hay network nếu không có WASI.

Linear memory: cầu nối giữa JavaScript và Wasm
JavaScript không thể gọi trực tiếp vào bộ nhớ của mô-đun Wasm. Thay vào đó, cả hai cùng chia sẻ một vùng nhớ tuyến tính kiểu ArrayBuffer. JavaScript ghi dữ liệu vào vùng nhớ này, sau đó gọi hàm được export, hàm đó đọc dữ liệu trực tiếp từ địa chỉ offset tương ứng. Chính cơ chế chia sẻ bộ nhớ này giúp loại bỏ chi phí sao chép dữ liệu, giữ hiệu năng gần native.
Ví dụ tối giản bằng JavaScript:
const bytes = await fetch("module.wasm").then(r => r.arrayBuffer());
const { instance } = await WebAssembly.instantiate(bytes, {});
const result = instance.exports.add(2, 3);
WASI: lớp giao diện hệ thống cho WebAssembly
WASI (WebAssembly System Interface) cung cấp bộ API hệ thống chuẩn cho WebAssembly gồm file system, network, clock, random và các tiến trình con. Nhờ WASI, WebAssembly không còn bị giới hạn ở trình duyệt mà có thể chạy ở server, trong container, hay trên thiết bị edge.
Bản WASI Preview 2 tách API thành các thành phần nhỏ (components model), cho phép ghép nối linh hoạt hơn. Runtime phổ biến gồm Wasmtime (Rust), Wasmer, WasmEdge và Node.js tích hợp sẵn từ phiên bản 12.

Hệ sinh thái và ứng dụng thực tế
- Trò chơi 3D trên web: Unity và Unreal Engine đều hỗ trợ xuất bản sang WebAssembly, mang lại hiệu năng gần bản native.
- Công cụ thiết kế: Figma chuyển phần lõi rendering sang Rust rồi biên dịch Wasm để đạt tốc độ như ứng dụng desktop.
- Môi trường lập trình trên trình duyệt: Rust Playground và các trình biên dịch C++ trực tuyến đều chạy hoàn toàn bằng Wasm.
- Machine learning inference: ONNX Runtime Web và TensorFlow Lite cho phép chạy mô hình suy luận ngay trong trình duyệt, dữ liệu không rời khỏi máy người dùng.
- Serverless và edge computing: Cloudflare Workers, Fastly Compute và AWS Lambda hỗ trợ chạy hàm viết bằng Rust, C++ hay AssemblyScript biên dịch sang Wasm.
- Plugin hệ thống: Envoy hỗ trợ Proxy Wasm và Istio dùng Wasm để nạp filter mà không cần build lại toàn bộ.
Nguồn tham khảo chính thức: webassembly.org cho đặc tả và roadmap, kho WebAssembly/WASI trên GitHub cho đặc tả WASI, và MDN WebAssembly cho hướng dẫn sử dụng chi tiết.
Điểm hạn chế cần biết
WebAssembly không phải lựa chọn cho mọi bài toán. Bạn không thể truy cập trực tiếp DOM hay gọi API DOM từ Wasm, phải đi qua JavaScript. Ngoài ra việc gỡ bỏ dependency trong hệ sinh thái C/C++ vẫn chưa hoàn hảo, và ngôn ngữ Go có GC nên Wasm output lớn hơn Rust. Với các tác vụ thuần JavaScript đơn giản, việc thêm một toolchain biên dịch thường không đáng.
Tóm lại, WebAssembly là lớp thực thi bổ trợ chứ không thay thế JavaScript. Nó thay đổi cơ bản câu hỏi “viết ứng dụng nặng thế nào vẫn chạy trên web” và đang nhanh chóng trở thành lựa chọn mặc định cho các tác vụ tính toán nặng, bảo mật và chạy nhiều nền tảng.
