WebAssembly (WASM) trong trình duyệt: kiến trúc và WASI

Sơ đồ quy trình WebAssembly: mã nguồn C Rust AssemblyScript được biên dịch thành file nhị phân wasm rồi chạy trong trình duyệt

WebAssembly (viết tắt Wasm) là chuẩn mã nhị phân được thiết kế để chạy trên mọi trình duyệt hiện đại. Thay vì phân tích mã nguồn mỗi lần tải trang như JavaScript, trình duyệt giải mã một file nhị phân gọn nhẹ rồi biên dịch sang mã máy — nhanh hơn, an toàn hơn, và chạy được cả trong môi trường ngoài trình duyệt nhờ chuẩn WASI.

WebAssembly là gì

WebAssembly là một ngôn ngữ lập trình tầng trung (instruction set) được W3C và Ecma International đồng phát triển, dùng làm đích biên dịch cho C, C++, Rust, Go, AssemblyScript và nhiều ngôn ngữ khác. Mô hình thực thi: mã nguồn → biên dịch sang .wasm (một file nhị phân, thường nhỏ hơn nhiều) → trình duyệt xác thực và biên dịch Just-In-Time sang mã máy của CPU.

Lịch sử phiên bản đáng chú ý:

Phiên bản Ngày Điểm mới
WebAssembly 1.0 5/12/2019 W3C Recommendation — bản chuẩn đầu tiên
WebAssembly 2.0 20/3/2025 +236 lệnh SIMD, bulk memory, multi-value, reference types
WebAssembly 3.0 17/9/2025 Không gian địa chỉ 64-bit (i64), nhiều bộ nhớ, WasmGC, typed references, tail calls, exception handling

Chi tiết từng phiên bản tại Wasm 2.0 và Wasm 3.0. Trạng thái spec tại webassembly.org/specs.

Sơ đồ quy trình WebAssembly: mã nguồn C Rust AssemblyScript được biên dịch thành file nhị phân wasm rồi được trình duyệt nạp và thực thi
Quy trình biên dịch và thực thi WebAssembly (Nguồn: Wikimedia Commons)

Tính năng chính và hỗ trợ trình duyệt

Điểm mạnh của WebAssembly nằm ở bộ tính năng ngày càng mở rộng, mỗi tính năng đều đã đạt hỗ trợ đồng nhất ba trình duyệt lớn. Bảng dưới đây tổng hợp từ dữ liệu tính năng chính thức:

Tính năng Chrome Firefox Safari
SIMD 91 89 16.4
Threads (SharedArrayBuffer) 74 79 14.1
Garbage collection (WasmGC) 119 120 18.2
Exception handling 137 131 18.4

Một số điểm đáng chú ý về kiến trúc:

  • Sandbox bắt buộc: mô hình bộ nhớ tuyến tính, không truy cập hệ thống file hay mạng trừ khi thông qua API được cấp quyền tường minh.
  • WasmGC (WebAssembly 3.0): thu gom rác thay vì quản lý thủ công, giúp các ngôn ngữ như Rust chạy tự nhiên hơn.
  • Component Model: lớp trừu tượng mới cho phép ghép nối các module Wasm với nhau và với hệ thống ngoài qua giao diện có kiểu (typed interfaces), không cần chuyển dữ liệu thô.
Module WebAssembly nhị phân biên dịch từ AssemblyScript với các hàm export add và multiply
Ví dụ module WebAssembly nhị phân sau khi biên dịch (Nguồn: Wikimedia Commons)

Hiệu năng và ứng dụng thực tế

Case study kinh điển nhất: Figma chuyển sang WebAssembly và cắt thời gian tải xuống hơn 3 lần (8/6/2017). Cùng bài viết cho biết mã nhị phân WebAssembly được thiết kế để giải mã nhanh khoảng 20 lần so với asm.js. Trình biên dịch phổ biến nhất là Emscripten (C/C++ → Wasm), bên cạnh Rust (wasm-pack), Go (GOOS=js GOARCH=wasm), AssemblyScript.

Các ứng dụng phổ biến hiện nay:

  • Ứng dụng thiết kế: Figma, Canva, Google Earth dựa trên Wasm để xử lý canvas nặng.
  • Công cụ web: AutoCAD chạy trên Web, Photoshop phiên bản web, Unity và Unreal Engine xuất bản sang WebAssembly.
  • Xử lý dữ liệu: codec video, xử lý ảnh, phân tích số liệu lớn ngay trong trình duyệt.
  • Mã nguồn mở: Python (Pyodide), Lua, SQLite, ImageMagick đều có bản Wasm chạy trong trình duyệt.

Tỷ lệ sử dụng thực tế vẫn khiêm tốn: báo cáo States of WebAssembly ghi nhận khoảng 0,35% trang desktop và 0,28% trang mobile (2025) dùng Wasm — cho thấy đây vẫn là công nghệ chuyên dụng, không phải lựa chọn mặc định. Cùng báo cáo ghi nhận file Wasm lớn nhất trong HTTP Archive đạt 228 MB.

WASI: chạy Wasm ngoài trình duyệt

WASI 0.2 (25/1/2024) là chuẩn runtime cho WebAssembly ngoài trình duyệt, dựa trên Component Model, bao gồm hai thế giới: wasi-cli (chạy công cụ dòng lệnh) và wasi-http (giao tiếp HTTP). Nhờ đó, cùng một file .wasm có thể chạy trong Node.js, Deno, Wasmtime, và container mà không cần biên dịch lại cho từng nền tảng.

WASI 0.3 đang trong giai đoạn preview bổ sung hỗ trợ bất đồng bộ (async), mở ra hướng lập trình WebAssembly với I/O bất đồng bộ. Xem wasi.dev.

So sánh WebAssembly với JavaScript

Tiêu chí WebAssembly JavaScript
Loại Chuẩn nhị phân (instruction set) Ngôn ngữ script cấp cao
Biên dịch AOT sang .wasm, sau đó JIT sang mã máy Parse + JIT trực tiếp
Tốc độ khởi động Nhanh hơn nhờ bỏ qua bước phân tích cú pháp Chậm hơn với code lớn
Hiệu năng tính toán nặng Gần bằng native code Kém hơn 1–2 bậc
Bộ nhớ Tuyến tính, sandbox GC tự động, không sandbox
Hệ sinh thái Rust, C, C++, Go, AssemblyScript Toàn bộ frontend, npm

Ưu và nhược điểm

Ưu điểm:

  • Tốc độ gần native cho code tính toán nặng (xử lý ảnh, video, khoa học).
  • Sandbox an toàn — mã Wasm không thể tự ý truy cập DOM, mạng hay hệ thống file.
  • Nhị phân gọn, tải nhanh hơn trong nhiều trường hợp so với JS minify.
  • Chạy được ngoài trình duyệt qua WASI — cùng binary cho mọi nền tảng.
  • Không phụ thuộc thư viện ngoài, không cần cài runtime riêng.

Nhược điểm:

  • Hệ sinh thái công cụ (debug, hot reload) kém trưởng thành hơn JS.
  • Không có DOM trực tiếp — phải giao tiếp qua JavaScript, tạo thêm chi phí marshalling.
  • Kích thước file nhị phân lớn với app lớn (một số file lên tới 228 MB).
  • Tỷ lệ sử dụng thấp trên web nói chung — chưa phải lựa chọn mặc định.
  • Debug stack trace khó đọc hơn JavaScript.

Khi nào nên dùng WebAssembly

  • Ứng dụng web cần xử lý nặng (render 3D, xử lý ảnh/video, biên dịch code trong trình duyệt).
  • Cần di chuyển code C/C++/Rust sẵn có lên web mà không viết lại bằng JS.
  • Cần chạy cùng một logic server-side và client-side (Rust → cả WASM lẫy native).
  • Plugin sandbox cho trình duyệt hoặc hệ thống nhúng — nhờ mô hình bộ nhớ tuyến tính.
  • Không phù hợp cho UI logic đơn giản, animation CSS hay xử lý DOM nhiều.

Kết luận

WebAssembly đã trở thành công nghệ nền tảng cho ứng dụng web hiệu năng cao. Từ Recommendation đầu tiên của W3C năm 2019 đến Wasm 3.0 với WasmGC và Component Model, hệ sinh thái đã đủ trưởng thành để chọn cho các ứng dụng nặng như Figma, Photoshop web hay game engine. Hướng đang đi là kết hợp WASI cho serverless, kèm async trong WASI 0.3 — mở đường cho WebAssembly thoát khỏi giới hạn trình duyệt.

Từ khóa chính: WebAssembly, WASM, Emscripten, WASI, Rust, AssemblyScript, WasmGC, SIMD, sandbox, Figma, Component Model.

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ơ đồ các trạng thái trao đổi cơ sở dữ liệu của OSPF: Exchange, Loading và Full kèm các gói LS Request, LS Update và LS Ack

OSPF là gì? Giao thức định tuyến link-state và cách tính cost

OSPF (Open Shortest Path First) là giao thức định tuyến nội bộ tiêu chuẩn cho mạng doanh nghiệp và nhà cung cấp dịch vụ Internet. Thay vì dùng vector khoảng…

Xem thêm

Kubernetes là gì: Hệ điều phối container và kiến trúc cụm

Kubernetes là hệ điều phối mã nguồn mở dành cho container, thường được gọi tắt là K8s. Nó cho phép tự động hoá việc triển khai, mở rộng và quản…

Xem thêm
Sơ đồ xếp chồng kiến trúc WebGPU: GPU vật lý → API gốc → triển khai trình duyệt → GPUAdapter → GPUDevice

WebGPU là gì? Chuẩn đồ hoạ và tính toán GPU cho trình duyệt

WebGPU là một giao diện lập trình web cho phép JavaScript sử dụng trực tiếp GPU của máy người dùng, cả để dựng hình lẫn để tính toán song song….

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