Binaryen 项目进展, 以及一些关于 WebAssembly 的特点

发布时间:2019-08-06 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Binaryen 项目进展, 以及一些关于 WebAssembly 的特点脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

文章来自 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.pdf

  • wasm.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

脚本宝典总结

以上是脚本宝典为你收集整理的Binaryen 项目进展, 以及一些关于 WebAssembly 的特点全部内容,希望文章能够帮你解决Binaryen 项目进展, 以及一些关于 WebAssembly 的特点所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。