我讨厌编译器
你可能会认为,给定相同的输入字节,就能得到相同的输出字节。哈哈,笑死。不,你得不到。事情远比想象中复杂。
背景速读
- Xe Iaso(xeiaso.net 博主)是知名技术写作者,常以讽刺口吻讨论基础设施、编译器和 WASM(WebAssembly)生态的痛点。
- 这篇博客的核心背景:WASM 模块理论上应具有「确定性编译」(相同源代码 → 相同二进制),但实际中,编译器版本、标准库实现、时间戳、文件路径、甚至构建环境都会导致输出不同——这叫「非复现构建」(non-reproducible build)。
- 这种不确定性给供应链安全(如 sigstore、SLSA 验证)、二进制缓存(如 npm 包管理)、和分布式构建带来麻烦:你无法通过哈希值证明一个 WASM 二进制来自某段特定源码。
- 作者提到一个叫「Anubis」的项目(猜测为作者或社区开发的 WASM 工具),试图通过 WASM 虚拟机的方式来「厂商锁定」(vendor)二进制依赖,避免每次从源码编译的不一致问题。
- 全文语气是「怒喷」——抱怨编译器不遵循直觉、WASM 生态承诺的确定性被现实打破。目标读者是熟悉构建工具链但没踩过这个坑的开发者。