半篇文章来自 Mozilla 的博客的阅读笔记
https://hacks.mozilla.org/2015/12/compiling-to-webassembly-its-happening/
WebAssembly 的生态大致分为两部分, 编译器等工具链, 和执行环境
两者依据 spec 来完成对接, 并且实现解耦
工具链部分重要的新项目是 Binaryen, 一个编译器
https://github.com/WebAssembly/binaryen
实现语言是 C++, 可以用于 parse 和 emit WebAssembly
也可以基于 AST 规范进行转换
基于几个部分的工具:
Binaryen shell 可以加载运行代码, 类似解释器
使用的后缀.wast
, 这是 WebAssembly 的某个文本格式asm2wasm ASM.js 编译到 WebAssembly
wasm2asm WebAssembly 编译到 ASM.js(还没完成)
s2wasm 汇编文件, 后缀
.s
, 编译到 WebAssembly, 基于 LLVM
http://llvm.org/devmtg/2015-10/slides/BastienGohman-WebAssembly-HereBeDragons.pdfwasm.js
Binaryen 的 JavaScript 实现, 以便在已有 JavaScript 环境执行
关于 Binaryen 的介绍, 有个幻灯片, 其中一页特别要看下
https://kripken.github.io/talks/wasm.html#/9
Binaryen 就是 Binary 和 Emscripten 的结尾连载一起写
关于 Emscripten
Emscripten 可以编译 C 或者 C++ 到 ASM.js
而 Binaryen 可以把 ASM.js 编译到 WebAssembly, 整个就通了
可以用 asm2wasm
命令, 也可以用 emcc
直接包含这一步:
emcc file.cpp -o file.js -s ‘BINARYEN=”path-to-binaryen”’
https://github.com/kripken/emscripten/wiki/WebAssembly
目前还没有直接编译到浏览器环境运行的方案
现在测目标是最快能实现和检验效果, 浏览器的事以后再说
而为了测出的目的的话, 有个性能很低的 wasm.js 可以跑
大概就是用来初始化运行环境, 然后解释执行 WebAssembly
估计这个方案和 CoffeeScript 的解释执行会有相似之处
提到一些可以参考的内容
https://kripken.github.io/talks/wasm.html#/10
https://github.com/WebAssembly/build-suite
目前的测试工具, 将来也能用来保证后续代码的可靠性
当然以后运行性能必定是要非常高的
https://github.com/WebAssembly/binaryen/blob/master/src/wasm2asm.h
https://github.com/WebAssembly/polyfill-prototype-2
https://github.com/WebAssembly/design/blob/master/FAQ.md#can-the-polyfill-really-be-efficient
很多 C/C++ 项目将来可以被编译到 WebAssembly, 以后难度不会高
关于 LLVM 后端
WebAssembly 也在开发一个 LLVM 后端, 现在还不成熟
不过将来应该会非常重要的, Binaryen 也支持
LLVM 通常会输出 .s
的汇编后缀文件, 这个也是类似的
这个结果会有点像 C 生成的汇编, 而不是像 AST 的样子
至少能从这个文件比较直接得转换到 WebAssembly
其中会用到 s2wasm
来进行编译, 细节看原文
这个项目有命令行, 也已经集成在 Emscripten 里边
emcc file.cpp -o file.js -s ‘BINARYEN=”path-to-binaryen”’ -s WASM_BACKEND=1
https://github.com/kripken/emscripten/wiki/WebAssembly
现在大致有两条思路, 一条旧一条新, 新的还没成熟, 但将来会取代旧的
Emscripten + asm.js backend + asm2wasm
Emscripten + new WebAssembly backend + s2wasm
另外在 FAQ 里扒了一些感兴趣的内容
https://github.com/WebAssembly/design/blob/master/FAQ.md
使用场景用哪些?
页面上拉了很长的列表, 感觉常用的桌面软件都列上去了
https://github.com/WebAssembly/design/blob/master/UseCases.md
只是针对 C/C++ 程序员设计的吗?
最初可能是为了 C/C++, 后面会跟 ES6 模块接口整合
那么就是很容易复用 C++ 写的类库, 而不用写 C++ 了
构建 LLVM 后端, 支持 LLVM 的 Clang, GCC 等, 因为熟悉所以先对付 LLVM
从长远的目标, WebAssembly 算是提供二进制格式, 实现 Web 平台功能
https://github.com/WebAssembly/design/blob/master/HighLevelGoals.md
比如对 Web 向后兼容, 继承 JavaScript 的同源策略, 异步调用和被调用 JavaScript
访问已有的 API, 提供人类能阅读的文本格式, 对应 View Source 效果
还有 Source Maps, 协程, 多进程, 大于 4GB 内存, 尾递归, 具体看文档
https://github.com/WebAssembly/design/blob/master/FutureFeatures.md#gcdom-integration
对于 Node 环境也支持, 还有移动平台, 网联网设备等等
https://github.com/WebAssembly/design/blob/master/NonWeb.md
关于 Web API 有单独的文档, 在 MVP 这个初步的阶段之后会开始做
https://github.com/WebAssembly/design/blob/master/GC.md
在 WebAssembly 当中直接引用 DOM 和各种对象
直接访问 Web API, 而不是通过 JavaScript 去调用
在 WebAssembly 代码中直接操作 GC 对象
想要替代 JavaScript 吗?
不是的. WebAssembly 只是允许了更多的语言能编译运行
而 JavaScript 作为快速发展的语言, 是享有特权, 一直支持下去的
两种语言很可能会长期共用下去, 比如性能要求高的部分用 WebAssembly
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。