Nguồn: Hacker News
Tóm tắt
Bài viết phân tích một quan niệm sai phổ biến: WebAssembly thường được mô tả là “stack machine”, nhưng thực tế thiếu đi tính năng cốt lõi làm nên stack machine đúng nghĩa. Trong khi stack machine thực sự như JVM có các instruction thao tác trực tiếp lên stack (dup, swap, over, rot), WebAssembly gần như không có instruction nào loại này — chỉ có drop để hủy giá trị top-of-stack.
Trong một stack machine thuần, để tính x * x * x, cần dùng dup và swap để sao chép và hoán đổi giá trị trên stack mà không cần biến tạm. JVM làm được điều này tự nhiên. Wasm thì không — ngay khi cần tái sử dụng một giá trị, buộc phải dùng local variables, tức là về bản chất trở thành register machine. Đây là điểm khác biệt kiến trúc quan trọng.
Hệ quả thực tế: compiler tối ưu hóa cho Wasm không thể thực hiện common subexpression elimination hay tối ưu hóa expr^2 thành expr * expr mà không đưa vào biến trung gian. Wasm chỉ thực sự hoạt động như stack machine khi biểu thức đủ đơn giản để evaluate straight-through. Với mọi tình huống phức tạp hơn, local variables là bắt buộc.
Tác giả kết luận rằng Wasm là hybrid — có cú pháp stack-based nhưng ngữ nghĩa execution đòi hỏi register machine. Gọi nó là “stack machine” là misleading với bất kỳ ai đã từng viết code Wasm thủ công hay nghiên cứu sâu về thiết kế ISA.