文章摘要
文章指出WebAssembly(Wasm)虽然被广泛认为是栈式虚拟机,但实际上与传统的栈式机器存在重要差异。作者通过手写Wasm代码发现,其操作方式与传统栈式语言不同,更接近于寄存器机器,这使"Wasm是栈式机器"的说法存在误导性。
文章总结
标题:WebAssembly并非纯粹的栈式虚拟机
文章来源:https://purplesyringa.moe/blog/wasm-is-not-quite-a-stack-machine/
发布日期:2026年4月28日
核心内容:
- 普遍认知的误区
- 虽然维基百科和官方设计规范都将Wasm描述为栈式虚拟机,但作者通过手动编写Wasm指令发现其与传统栈式语言存在显著差异。
- 寄存器与栈式机器的本质区别
- 寄存器机器(如x86汇编)通过显式变量存储中间结果
- 传统栈式机器(如Forth)通过隐式栈结构管理数据,需要配合dup、swap等栈操作指令实现值复用
- Wasm的特殊性
- 指令集缺失关键栈操作指令(仅有drop指令)
- 无法直接实现常见优化(如公共子表达式消除)
- 实际需要依赖局部变量(类似寄存器机器)
- 控制流块在multi-value扩展前几乎无法与栈交互
- 本质特征
- 应视为"支持复合表达式的寄存器机器"
- 后缀波兰表示法只是编码方式,文本格式采用LISP风格前缀表示法
- 栈结构主要服务于非优化解释器的实现便利性
- 现实影响
- 传统栈式虚拟机的经验不能直接迁移到Wasm
- 虽然底层可转换为SSA形式,但输入格式特性仍值得关注
(注:原文中关于JVM指令集的对比示例、具体数学运算的详细步骤等细节内容已精简,保留核心论点所需的必要论据)
评论总结
总结评论内容:
WASM作为编译目标的优势
- 支持者认为WASM的栈式设计便于编译器实现,文本格式(WAT)的S-Expression表达清晰。
引用:
"I can actually guarantee that it will always build an expression... Everything stays within that function" (stevefan1999)
"WAT, the textual format is so neat, that you can represent it with a S-Expression" (stevefan1999)
- 支持者认为WASM的栈式设计便于编译器实现,文本格式(WAT)的S-Expression表达清晰。
对缺乏栈操作指令的批评
- 部分用户指出缺少
dup等指令导致代码生成不够紧凑,但另一观点认为这是设计选择,通过局部变量即可实现类似功能。
引用:
"The lack of a dup opcode... is quite annoying when trying to generate compact code" (kg)
"Even Java... doesn’t use them --- reuse happens via local variables" (ufo)
- 部分用户指出缺少
文本格式与执行模型的争议
- 有评论强调文本格式的LISP语法仅是语法糖,与二进制格式的栈特性一致;但工具链对规范的实现存在不一致。
引用:
"The textual format is as 'stack-like' as the binary format" (asibahi)
"tools likewat2wasm... don’t seem to adhere to the spec" (asibahi)
- 有评论强调文本格式的LISP语法仅是语法糖,与二进制格式的栈特性一致;但工具链对规范的实现存在不一致。
WASM的定位与未来
- 悲观观点认为WASM未达早期承诺(如跨语言统一、性能提升),实际应用有限;另有分析指出其线性验证器等设计权衡。
引用:
"It has failed to deliver... rarely see any awesome success story" (shevy-java)
"WASM's validator is linear-time... fast startup was a hard requirement" (ronin_niron)
- 悲观观点认为WASM未达早期承诺(如跨语言统一、性能提升),实际应用有限;另有分析指出其线性验证器等设计权衡。
技术本质的探讨
- 核心争议在于WASM是否应被归类为栈机器,有观点认为其本质是面向验证和编译的中间表示(IR)。
引用:
"It’s closer to a structured IR that uses a stack encoding" (wabstractions)
"They should have just picked RISC-V" (Validark)
- 核心争议在于WASM是否应被归类为栈机器,有观点认为其本质是面向验证和编译的中间表示(IR)。
(注:所有评论评分均为None,未体现社区认可度差异)