WebAssembly là gì? Tìm hiểu cách chạy mã gốc trên trình duyệt

WebAssembly (thường viết tắt là Wasm) là định dạng mã nhị phân được thiết kế để chạy gần bằng tốc độ gốc trên trình duyệt web. WebAssembly là gì và tại sao nó quan trọng với lập trình viên? Bài viết này sẽ giải thích kiến trúc, cách hoạt động và những ứng dụng thực tế của công nghệ đang thay đổi nền tảng web.

WebAssembly là gì?

Sơ đồ biên dịch C/C++ qua Emscripten thành module Wasm chạy trên trình duyệt

WebAssembly là một định dạng lệnh nhị phân cho máy ảo dạng ngăn xếp, hoạt động như mục tiêu biên dịch di động cho các ngôn ngữ như C, C++ và Rust. Thay vì viết ứng dụng web bằng JavaScript, lập trình viên biên dịch mã nguồn sang file .wasm, sau đó trình duyệt tải và thực thi trực tiếp với hiệu suất gần bằng mã gốc.

Wasm được thiết kế với bốn mục tiêu chính: nhanh, an toàn, di động và tương thích. Các trình duyệt lớn đều hỗ trợ WebAssembly, từ Chrome, Firefox, Safari đến Edge, và phiên bản hiện tại của đặc tả là Wasm 3.0 do tổ chức W3C quản lý.

Cách WebAssembly hoạt động

Một module Wasm chạy bên cạnh JavaScript thay vì thay thế nó. Trình duyệt tải file .wasm, khởi tạo bằng API WebAssembly.instantiate, và chia sẻ vùng nhớ tuyến tính liên tục giữa hai ngôn ngữ. JavaScript có thể gọi các hàm được xuất từ module Wasm và ngược lại, tạo nên sự kết hợp linh hoạt.

Sơ đồ pipeline xử lý file wasm từ giải mã qua máy ảo đến biên dịch và thực thi

Khác với JavaScript cần thông dịch hoặc biên dịch JIT, mã Wasm được tải và biên dịch nhanh hơn nhiều vì định dạng nhị phân đã được tối ưu. Cơ chế sandbox đảm bảo module không thể truy cập bộ nhớ ngoài vùng được cấp, mang lại tính an toàn cao cho người dùng.

Ngôn ngữ nào biên dịch được sang WebAssembly?

  • Rust: Hệ sinh thái phát triển nhất với target wasm32-unknown-unknown và công cụ wasm-bindgen, được khuyên dùng cho các dự án mới.
  • C và C++: Dùng Emscripten, trình biên dịch dựa trên LLVM đã tồn tại lâu nhất trong hệ sinh thái Wasm.
  • Go: Hỗ trợ target WASI từ bản 1.21, đơn giản để build nhưng file nhị phân còn khá lớn.
  • AssemblyScript: Ngôn ngữ giống TypeScript biên dịch trực tiếp sang .wasm, dễ tiếp cận với lập trình viên web.
  • Kotlin và Swift: Đang trong quá trình phát triển hỗ trợ chính thức.

Ứng dụng thực tế của WebAssembly

Nhiều sản phẩm bạn dùng hằng ngày đã chạy Wasm mà không hề hay biết. Figma biên dịch toàn bộ phần lõi C++ của trình chỉnh sửa sang Wasm để chạy trên web. Photoshop phiên bản web dùng Wasm kết hợp SIMD cho các tác vụ xử lý ảnh nặng. Các game engine như Unity và Unreal Engine xuất bản bản dựng WebGL sang Wasm để chạy game ngay trong trình duyệt.

Trong lĩnh vực trí tuệ nhân tạo, ONNX Runtime Web hỗ trợ backend Wasm và WebGPU giúp chạy mô hình học máy ngay trên trình duyệt mà không cần máy chủ. Các phiên bản llama.cpp biên dịch sang Wasm cho phép chạy mô hình ngôn ngữ nhỏ ngay trên thiết bị của người dùng, mở ra hướng bảo mật và quyền riêng tư mới cho ứng dụng AI.

Ứng dụng Rust wasm-pack chạy trong trình duyệt hiển thị thông báo Hello

WebAssembly bên ngoài trình duyệt

Ngoài trình duyệt, WebAssembly đang mở ra những khả năng hoàn toàn mới cho ngành công nghệ phần mềm. Khả năng chạy mã biên dịch từ nhiều ngôn ngữ trên cùng một nền tảng đã thu hút sự chú ý của các công ty công nghệ lớn trên toàn thế giới.

WASI (WebAssembly System Interface) mở rộng Wasm ra ngoài trình duyệt, cung cấp các giao diện hệ thống cho file, mạng, đồng hồ và bộ đếm ngẫu nhiên. Nhờ WASI, các runtime như Wasmtime và Wasmer chạy module Wasm như ứng dụng native trên máy chủ.

Lĩnh vực điện toán biên đang là nơi Wasm phát triển mạnh nhất. Cloudflare Workers chạy JavaScript, Wasm và nhiều ngôn ngữ khác trên nền tảng V8 trải rộng hơn 330 thành phố, trong khi Fastly Compute chạy Wasm thuần túy. Cả hai đều có thời gian khởi động dưới một mili giây, lý tưởng cho các hàm serverless quy mô lớn.

Bắt đầu với WebAssembly

Cách nhanh nhất để làm quen là cài Rust và thêm target biên dịch bằng lệnh rustup target add wasm32-unknown-unknown, kết hợp wasm-bindgen để tạo liên kết với JavaScript. Tài liệu chính thức của Rust và WebAssembly tại rustwasm.github.io có hướng dẫn từng bước từ khởi tạo dự án đến chạy thử trong trình duyệt.

WebAssembly không thay thế JavaScript mà bổ sung cho nó những khả năng về hiệu suất mà ngôn ngữ kịch bản không làm được. Với hệ sinh thái đang phát triển nhanh, Wasm chắc chắn là kỹ năng đáng đầu tư cho lập trình viên web trong những năm tới.

Tham khảo thêm

MDN: WebAssembly Concepts

webassembly.org: Specifications

Rust and WebAssembly Book: Hello World

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

Ruby on Rails là gì? Hướng dẫn framework web Ruby toàn diện

Ruby on Rails là gì? Đây là framework phát triển ứng dụng web phía máy chủ viết bằng ngôn ngữ Ruby, được thiết kế để giúp lập trình viên xây…

Xem thêm

Apache Kafka là gì? Kiến trúc và ứng dụng thực tế

Kafka là gì? Apache Kafka là nền tảng stream event mã nguồn mở được xây dựng để xử lý hàng tỷ sự kiện mỗi ngày theo thời gian thực. Được…

Xem thêm

Git là gì? Hướng dẫn toàn diện cho người mới bắt đầu

Git là gì? Vì sao mọi lập trình viên đều cần Git Git là hệ thống quản lý phiên bản phân tán (Distributed Version Control System) mã nguồn mở, được…

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