WebAssembly là gì: Công nghệ mã nhị phân chạy nhanh trên web

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.

Sơ đồ module WebAssembly gồm kiểu, hàm, bảng, bộ nhớ và toàn cục

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.

Máy chủ đám mây đại diện cho hạ tầng serverless và edge chạy WebAssembly

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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Sơ đồ đồ thị phụ thuộc hạ tầng Terraform: các resource liên kết bằng mũi tên

Terraform là gì: Quản lý hạ tầng bằng code cho DevOps

Terraform là gì là câu hỏi mà bất kỳ lập trình viên nào làm hạ tầng đều gặp phải. Công cụ mã nguồn mở của HashiCorp cho phép bạn mô…

Xem thêm

DNSSEC là gì: Chuỗi tin cậy chữ ký số bảo vệ hệ thống DNS

DNSSEC là gì? Đây là bộ mở rộng của hệ thống tên miền DNS, bổ sung chữ ký số vào mọi bản ghi trả về để người dùng xác minh…

Xem thêm

DNS over HTTPS là gì: Bảo mật và riêng tư cho DNS

DNS over HTTPS (viết tắt DoH) là cách thực hiện truy vấn phân giải tên miền thông qua giao thức HTTPS thay vì gửi truy vấn DNS dạng văn bản…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất