[译] 关于 WebAssembly 你应该知道的 7 件事
粗略翻译, 推荐看原文
了解 WebAssembly, 了解 Web 的将来
这里不支持链接,代码展现也不好,建议看原文。
介绍
如果你不熟悉 WebAssembly 后面的概念, 可以读一下:
考虑到本文的目标, 这里加上个简短的术语表:
源码(Source code): 开发者写的.
编译器(Compiler): 一个应用程序, 用于把源码转换为汇编,字节码或者机器码
汇编(Assembly): 低级的类似源码的语言, 针对特定机器或特定应用程序
字节码(Bytecode): 低级的二进制的代码形式, 可以被其他应用程序执行
机器码(Machine code): 代码的二进制形式, 可以由硬件直接执行
WebAssembly 的目标是 Web 的字节码. 未来的开发者会这样使用 WebAssembly:
开发一个应用(源码用任何可以编译到 WebAssembly 的语言)
用编译器把源码转换到 WebAssembly 字节码(可能只要的话转化成汇编)
-
在浏览器加载字节码并执行
真相 1: WebAssembly 不是 JavaScript 的末日
已经说过的再说一次: JavaScript 依然会继续
得益于 Web 平台的增长, JavaScript 已经成为开发者和工具链的通用语言
它从一开始就被设计为编译目标
它将得到所有主流浏览器提供商的支持
它可以根据需要任意地偏离 JavaScript 原有的语义
WebAssembly 对于 Web 来说是对 JavaScript 很有必要的补充
真相 2: WebAssembly 由 ASM.js 和 (P)NaCl 背后的团队开发
如果你过去几年跟进了 Web 的发展你就知道 WebAssembly 目标很有难度:
Fact 3: WebAssembly 会向后兼容
Web 的一个基础特性就是向后兼容性, WebAssembly 也不例外:
Fact 4: WebAssembly 看起来不像 CPU 汇编
当听到"汇编"这个词你也许马上在脑子里听到"可读性差"这句话
这里举了例子 WebAssembly 的文本形式看起来怎么样
;; Iterative factorial named
(func $fac-iter (param $n i64) (result i64)
(local $i i64)
(local $res i64)
(set_local $i (get_local $n))
(set_local $res (i64.const 1))
(label $done
(loop
(if
(i64.eq (get_local $i) (i64.const 0))
(break $done)
(block
(set_local $res (i64.mul (get_local $i) (get_local $res)))
(set_local $i (i64.sub (get_local $i) (i64.const 1)))
)
)
)
)
(return (get_local $res))
)
这里看完整的例子
那么, S 表达式是最终的格式吗? 不是的, 目前没有 WebAssembly 的官方版本
export func main() i32 {
storeI32(temp, 0); var i i32 = 0;
done: while (i < 10) {
i = i + 1; if (i >= 7) { break done;
}
} return (i + ifelse(0, 1, 2) * 2) * loadI32(temp) + loadI32(scale);
}
可以在这里看到
真相 5: WebAssembly 会扩展出 JavaScript 所没有的功能
WebAssembly 初步的实现目标是等同 ASM.js 的功能.
完整的线程支持
SIMD 类型和 intrinsics
零消耗的异常(栈审查和展开)
协成
动态链接
DOM 集成
集成垃圾回收
尾递归优化
多进程支持
其中一些功能用 JavaScript 甚至纯粹的 ASM.js 都非常难实现
真相 6: Source Maps 帮助你在浏览器中轻松调试编译后的代码
编译目标语言的一个不足是调试常常变得更难
Fact 7: 你不需要等到 WebAssembly 整个准备完成
尽管 WebAssembly 还在初期, 你已经能开始得到它将来能提供的好处了
题外话: WebAssembly 和已有的类库
...
结论
过去几年出现了大量的框架, 编译器和其他类型的方案,