← Về danh sách
Điện toán & Nhúng
#WebAssembly#Wasm#WASI#샌드박스#컴포넌트모델
Cập nhật lần cuối · 2026-09-01

WebAssembly (Wasm)

1. Tổng quan

A. Định nghĩa

WebAssembly (Wasm) là định dạng lệnh nhị phân khả chuyển (portable binary instruction format) dành cho máy ảo dựa trên ngăn xếp, là công nghệ tiêu chuẩn W3C nhằm biên dịch nhiều ngôn ngữ như C/C++, Rust, Go để thực thi an toàn với tốc độ gần như native trong nhiều môi trường thực thi, bao gồm cả trình duyệt.

Wasm xuất phát từ ý tưởng "chạy mã nhanh như assembly trên web", nhưng bản chất của nó là một đích biên dịch (compilation target) không phụ thuộc vào ngôn ngữ hay trình duyệt cụ thể nào. Nói cách khác, bản thân Wasm không hẳn là ngôn ngữ để con người viết trực tiếp, mà là biểu diễn trung gian mức thấp đồng thời là định dạng phân phối mà các ngôn ngữ bậc cao được biên dịch tới. Định dạng văn bản (WAT) và định dạng nhị phân (.wasm) tương ứng 1:1, và trong phân phối, truyền tải thực tế, người ta dùng định dạng nhị phân vì phân tích cú pháp và kiểm chứng nhanh.

B. Bối cảnh ra đời và sự cần thiết

Để thực hiện các tác vụ tính toán chuyên sâu trên web (xử lý ảnh·video, game, CAD, phép toán mật mã), chỉ riêng JavaScript thì chưa đủ về hiệu năng và khả năng dự đoán. JavaScript phụ thuộc vào kiểu động và tối ưu hóa JIT nên hiệu năng thực thi dao động theo tình huống lúc chạy, và chi phí phân tích cú pháp, tối ưu hóa cũng lớn. Dựa trên kinh nghiệm từ asm.js (tập con có thể tối ưu hóa của JavaScript) vốn nhằm bù đắp điểm này, bốn hãng trình duyệt (Google, Mozilla, MS, Apple) đã cùng thiết kế một định dạng nhị phân tiêu chuẩn, đó chính là WebAssembly.

Lý do cần Wasm có thể tóm tắt thành ba điểm. Thứ nhất là khả năng dự đoán hiệu năng. Vì là mã nhị phân đã xác định kiểu nên phân tích cú pháp nhanh, và sau khi kiểm chứng được biên dịch ngay thành mã máy, cho hiệu năng ổn định gần với native. Thứ hai là sự đa dạng ngôn ngữ. Có thể chuyển các tài sản C/C++, Rust hiện có lên web, xóa bỏ ràng buộc "web = JavaScript". Thứ ba là cô lập mạnh (sandbox). Nhờ bộ nhớ tuyến tính và giao diện dựa trên năng lực (capability), mã không thể truy cập tùy ý tài nguyên hệ thống, tạo nền tảng để thực thi an toàn mã không đáng tin cậy. Nhờ đặc tính thứ ba này, ngày nay Wasm đang mở rộng vượt ra khỏi trình duyệt sang serverless, edge và runtime plugin.

2. Cấu trúc thực thi và luồng xử lý

Việc thực thi Wasm chia thành hai giai đoạn lớn: giai đoạn biên dịch (build) và giai đoạn runtime (nạp·kiểm chứng·thực thi). Sơ đồ dưới đây cho thấy toàn bộ pipeline từ ngôn ngữ bậc cao đến khi module Wasm được tạo ra và thực thi.

flowchart LR
  subgraph Build["Thời điểm build (môi trường nhà phát triển)"]
    SRC["Mã nguồn (C/C++/Rust/Go)"] --> FE["Trình biên dịch frontend (LLVM, v.v.)"]
    FE --> WASM["Module Wasm (nhị phân .wasm)"]
  end
  subgraph Runtime["Runtime (bộ máy trình duyệt/máy chủ)"]
    WASM --> DEC["Giải mã·kiểm chứng cấu trúc"]
    DEC --> VAL["Kiểm chứng kiểu (tĩnh)"]
    VAL --> COMP["Biên dịch mã máy (Baseline/JIT tối ưu hoặc AOT)"]
    COMP --> INST["Khởi tạo instance (liên kết bộ nhớ·import)"]
    INST --> EXE["Thực thi (tương tác gọi hàm với host)"]
  end

Ở thời điểm build, ngôn ngữ bậc cao đi qua trình biên dịch như LLVM để được chuyển thành module nhị phân Wasm. Module này khai báo định nghĩa hàm, biến toàn cục, bộ nhớ, bảng, v.v., cùng các import cần nhận từ host và các export công khai cho host. Ở runtime, trước tiên mã nhị phân được giải mã, kiểm tra tính đúng đắn về cấu trúc, rồi thực hiện kiểm chứng kiểu tĩnh. Bước kiểm chứng này là cốt lõi bảo mật của Wasm, loại trừ trước khi thực thi mọi tràn dưới/tràn trên ngăn xếp, không khớp kiểu, rẽ nhánh ra ngoài phạm vi, v.v. Chỉ module vượt qua kiểm chứng mới được biên dịch thành mã máy, và tùy bộ máy, người ta kết hợp (tiering) biên dịch baseline để khởi động nhanh với biên dịch tối ưu để đạt hiệu năng cao nhất, hoặc biên dịch trước (AOT).

A. Máy ảo dựa trên ngăn xếp và bộ nhớ tuyến tính

Wasm sử dụng mô hình máy ngăn xếp (stack machine). Mỗi lệnh lấy giá trị từ ngăn xếp toán hạng để tính toán rồi đẩy kết quả trở lại ngăn xếp. Kiểu giá trị đơn giản, chỉ gồm i32, i64, f32, f64 và kiểu tham chiếu, nên dễ kiểm chứng và biên dịch. Dữ liệu heap mà chương trình sử dụng được lưu trong mảng byte liên tục gọi là bộ nhớ tuyến tính (linear memory); bộ nhớ này do host sở hữu và bắt buộc kiểm tra biên, nên module không thể đọc hoặc ghi ra ngoài vùng được phép. Hình dưới đây thể hiện cấu trúc cô lập trong đó module Wasm và host tương tác với nhau.

flowchart TB
  subgraph HOST["Môi trường host (JS trình duyệt / runtime máy chủ)"]
    JS["Mã host (JS/Go/Rust)"]
    IMP["Hàm import (cung cấp năng lực như tệp·mạng)"]
  end
  subgraph SANDBOX["Sandbox Wasm (ranh giới cô lập)"]
    MOD["Module Wasm"]
    MEM[("Bộ nhớ tuyến tính (kiểm tra biên)")]
    TAB["Bảng hàm"]
    MOD --- MEM
    MOD --- TAB
  end
  JS -->|"Gọi hàm export"| MOD
  MOD -->|"Gọi import (chỉ năng lực được phép)"| IMP

Cốt lõi của cấu trúc này là module chỉ có thể sử dụng những năng lực (capability) mà host trao một cách tường minh. Truy cập tệp, mạng, lời gọi hệ thống đều được tiêm vào qua import, và nếu không được tiêm vào thì chức năng đó hoàn toàn không tồn tại. Mô hình "mặc định không làm được gì (deny-by-default)" này là căn cứ để coi Wasm là một ranh giới tin cậy.

B. Tương tác với host và WASI

Trong trình duyệt, module được nạp thông qua JavaScript API (WebAssembly.instantiate), còn DOM, fetch, v.v. được gọi thông qua JS. Bên ngoài trình duyệt (máy chủ·edge) cần một giao diện hệ thống tiêu chuẩn, và thứ quy định điều đó là WASI (WebAssembly System Interface). WASI công khai các chức năng hệ điều hành như tệp, đồng hồ, nhập/xuất chuẩn theo dựa trên năng lực (capability-based); chẳng hạn, nếu chỉ trao handle của một thư mục cụ thể thì module chỉ có thể truy cập các đường dẫn bên dưới thư mục đó. Nhờ vậy có thể tạo ra đơn vị thực thi cô lập nhẹ hơn và khởi động nhanh hơn container.

3. Các dạng ứng dụng và trường hợp thực tế

Phạm vi ứng dụng của Wasm đang mở rộng nhanh chóng. Tổng hợp các dạng tiêu biểu cùng nguyên lý như sau.

Lĩnh vực ứng dụng Nội dung Trường hợp tiêu biểu·hiệu quả
Ứng dụng hiệu năng cao trên trình duyệt Chuyển logic tính toán chuyên sâu sang Wasm Figma (công cụ thiết kế), AutoCAD Web, game engine (Unity/Unreal)
Serverless·edge Thực thi hàm với cold start cỡ mili giây Fastly Compute, runtime edge của Cloudflare
Plugin·tiện ích mở rộng Cô lập an toàn mã bên thứ ba không đáng tin Bộ lọc proxy Envoy, tiện ích mở rộng DB/SaaS
Phân phối khả chuyển Build một lần, chạy trên nhiều kiến trúc Artifact dùng chung edge–cloud

Về trường hợp cụ thể, Figma được biết là đã biên dịch engine kết xuất viết bằng C++ sang Wasm, hiện thực hóa hiệu năng chỉnh sửa gần với ứng dụng desktop trên trình duyệt và rút ngắn đáng kể thời gian tải ban đầu. Ở phía máy chủ, runtime Wasm có thể giảm cold start – vốn thường mất vài trăm mili giây trở lên với container – xuống mức 1 mili giây, có lợi cho edge computing nơi mỗi yêu cầu khởi tạo một instance mới. Tuy nhiên, các con số cụ thể có thể khác nhau tùy khối lượng công việc và bộ máy, nên hiểu theo cách khái quát là an toàn.

A. So sánh với container và JavaScript

Wasm thường bị hiểu lầm là thứ thay thế container hoặc JavaScript, nhưng thực tế tính chất về đơn vị cô lập và đích thực thi là khác nhau. Lý do khác biệt nằm ở sự đánh đổi giữa mức độ cô lập và chi phí khởi động.

Phân loại WebAssembly Container (Docker) JavaScript
Phương thức cô lập Sandbox ngôn ngữ mức VM Namespace·cgroup của OS Cô lập runtime ngôn ngữ
Cold start Rất nhanh (μs~ms) Tương đối chậm (vài trăm ms) Nhanh
Kích thước image Vài trăm KB~vài MB Vài chục~vài trăm MB -
Đa dạng ngôn ngữ Biên dịch từ nhiều ngôn ngữ Nhị phân tùy ý Đơn ngôn ngữ
Độ trưởng thành·hệ sinh thái Đang phát triển (đặc biệt GC·truy cập DOM) Rất trưởng thành Rất trưởng thành

Container có thể chứa nhị phân Linux tùy ý và hệ thống tệp hoàn chỉnh nên tính đa dụng lớn, nhưng image nặng và khởi động chậm. Ngược lại, Wasm tuy hạn chế về những gì có thể chứa nhưng nhẹ, nhanh và độc lập kiến trúc. Do đó, hai bên không hẳn là quan hệ thay thế mà có xu hướng kết hợp theo tầng, chẳng hạn "cô lập đa khách thuê (multi-tenant) tinh vi hơn (Wasm) bên trong lớp cô lập nặng (container)". So với JavaScript, điểm mạnh là tính ổn định hiệu năng và tự do ngôn ngữ, nhưng cần cân nhắc rằng Wasm không truy cập trực tiếp DOM và việc hỗ trợ các ngôn ngữ có thu gom rác mới đang bước vào giai đoạn trưởng thành.

4. Chuyên sâu — Sự tiến hóa của tiêu chuẩn và Component Model

Kể từ phiên bản ban đầu (MVP), Wasm đã tiêu chuẩn hóa nhiều phần mở rộng để nới rộng phạm vi ứng dụng. Thread·SIMD nâng cao hiệu năng tính toán song song và vector, còn kiểu tham chiếu·đề xuất GC mở đường để biên dịch hiệu quả các ngôn ngữ được quản lý như Java, Kotlin, C#. Đặc biệt đáng chú ý là Component Model (mô hình thành phần) và WIT (WebAssembly Interface Types). Module Wasm trước đây chỉ trao đổi giá trị mức thấp như i32, f64, nên việc truyền kiểu mức cao như chuỗi, cấu trúc giữa các module viết bằng ngôn ngữ khác nhau rất phiền phức. Component Model mô tả giao diện một cách trung lập về ngôn ngữ và cho phép lắp ráp như Lego các thành phần viết bằng những ngôn ngữ khác nhau, cụ thể hóa tầm nhìn dài hạn "thành phần khả chuyển có thể tái sử dụng bất kể ngôn ngữ".

Trên dòng chảy đó, WASI Preview 2 đã định nghĩa lại giao diện dựa trên năng lực trên nền Component Model, dịch chuyển trục tiêu chuẩn hóa, và đang trở thành nền tảng của hệ sinh thái Wasm phía máy chủ (ví dụ: hàm serverless, runtime plugin mở rộng). Chi tiết tiêu chuẩn vẫn đang được sửa đổi liên tục, nên khi áp dụng thực tế, điều quan trọng là xác nhận bộ máy và bộ công cụ ngôn ngữ định dùng hỗ trợ đề xuất (proposal) ở giai đoạn nào.

5. Những điểm cần cân nhắc và hàm ý

Từ góc nhìn Kỹ sư chuyên nghiệp (Professional Engineer), việc áp dụng WebAssembly vượt ra ngoài tối ưu hóa hiệu năng đơn thuần mà gắn liền với chiến lược kiến trúc và bảo mật.

  • Tiêu chí quyết định áp dụng: Wasm có lợi cho các khối lượng công việc tính toán chuyên sâu và cần tính khả chuyển ngôn ngữ. Ngược lại, với khối lượng công việc chủ yếu là I/O hoặc phụ thuộc nhiều vào hệ sinh thái container hiện có thì lợi ích hạn chế, nên chỉ áp dụng có chọn lọc khi yêu cầu "cô lập nhanh·đa khách thuê·tính khả chuyển" rõ ràng.
  • Đánh đổi bảo mật: Sandbox ngôn ngữ rất mạnh, nhưng phạm vi năng lực được trao qua import chính là bề mặt tấn công. Theo nguyên tắc đặc quyền tối thiểu (deny-by-default), chỉ tiêm những năng lực cần thiết và đồng thời kiểm chứng chuỗi cung ứng (nguồn gốc·chữ ký module). Cũng cần nhận thức rằng lỗi logic bên trong bộ nhớ tuyến tính (ví dụ: lỗi bộ nhớ của mã C) vẫn có thể tồn tại.
  • Triển vọng độ trưởng thành·hệ sinh thái: Việc thiếu truy cập DOM trực tiếp, hỗ trợ ngôn ngữ GC đang trong quá trình trưởng thành, công cụ gỡ lỗi và tooling còn tương đối thiếu là những ràng buộc mang tính quá độ. Tuy nhiên, nhờ tiêu chuẩn hóa Component Model và WASI, xu hướng áp dụng trong lĩnh vực máy chủ, edge, plugin đang tăng tốc, nên việc đưa vào như một lựa chọn trong lộ trình trung và dài hạn là hợp lý.
  • Góc nhìn công nghệ liên kết: Wasm kết hợp tự nhiên với serverless·edge computing, service mesh (bộ lọc Envoy), zero trust (cô lập mã không đáng tin) và chiến lược khả chuyển đa đám mây. Do đó, thay vì xem như một công nghệ riêng lẻ, nên hiểu nó như trục kiến trúc tầng thực thi cô lập hạng nhẹ, và xem xét việc kết hợp theo tầng với container và điều phối (orchestration) như một phương án thiết kế.

Tài liệu tham khảo


Tóm tắt một câu: WebAssembly là định dạng nhị phân khả chuyển cho phép biên dịch nhiều ngôn ngữ để thực thi an toàn với tốc độ gần native trên trình duyệt, máy chủ và edge, và đang mở rộng thành tầng thực thi cô lập hạng nhẹ thông qua cô lập dựa trên năng lực và Component Model.