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

荀攸
• 阅读 10270

半篇文章来自 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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Easter79 Easter79
3年前
vue+element 表格formatter数据格式化并且插入html标签
前言   vue中element框架,其中表格组件,我既要行内数据格式化,又要插入html标签一贯思维,二者不可兼得也一、element表格数据格式化  !(https://oscimg.oschina.net/oscnet/3c43a1cb3cbdeb5b5ad58acb45a42612b00.p
Easter79 Easter79
3年前
springboot的起步依赖
!(https://oscimg.oschina.net/oscnet/f3acbe4cf3b00c68207e091c172d6b45a27.png)加载自动配置的方式2:!(https://oscimg.oschina.net/oscnet/40341228c10f7a56d82323a1d622521d92d.png) spring
Stella981 Stella981
3年前
React Hooks实现异步请求实例—useReducer、useContext和useEffect代替Redux方案
<blockquote本文是学习了2018年新鲜出炉的ReactHooks提案之后,针对<strong异步请求数据</strong写的一个案例。注意,本文假设了:<br1.你已经初步了解<codehooks</code的含义了,如果不了解还请移步<ahref"https://reactjs.org/docs/hooksintro.html
Stella981 Stella981
3年前
Golang modules 初探
今天天色刚刚亮起,起床看到golang1.11正式发版了,有着两个重要的特性:modules和WebAssembly。本博文只要说的是modules,从Java转golang的同学肯定是对golang的包管理充满了无奈之情,我也曾在博客中介绍过glide(https://my.oschina.net/u/553243/blog/1475626),也
Stella981 Stella981
3年前
Python基础教程,Python入门教程(非常详细)
<divclass"htmledit\_views"id"content\_views"<p<ahref"http://c.biancheng.net/python/base/"rel"nofollow"第1章Python编程基础</a</p<p1.<ahref"http://c.biancheng.net/view/
Wesley13 Wesley13
3年前
QQ玩一玩好友排行榜与世界排行榜
QQ玩一玩好友排行榜与世界排行榜1、开发环境CocosCreatorV2.0.5手Q版本V7.9.0.3820(目前市场中最新版本)qqPlayCore.jsbuildTime:'FriNov09201813:20:45GMT0800(GMT08:00)'上出现,
Easter79 Easter79
3年前
TiDB 的现在和未来
本文根据黄东旭在PingCAPD轮融资线上发布会的演讲实录进行整理。!(https://oscimg.oschina.net/oscnet/upceee1b1ad10e2bcde45dbe1cc00dc0688fc.png)TiDB的现在和未来大家好,我是黄东旭,是PingCAP的联合创始人和CTO
Wesley13 Wesley13
3年前
MySQL 什么是索引?
_该文为《MySQL实战45讲》的学习笔记,感谢查看,如有错误,欢迎指正_<br<fontcolorblue一、索引简介</font<fontcolorred索引就类似书本的目录,作用就是方便我们更加快速的查找到想要的数据。</font索引的实现方式比较多,常见的有哈希表,有序数组,
初探webAssembly | 京东物流技术团队
本文从为什么需要WebAssembly、WebAssembly的工作原理、哪些语言可用来创建WebAssembly模块、WebAssembly可以用在哪里以及怎么使用几方面简要介绍了webAssembly。如果之前没有了解过webAssembly,可以做一些简要的了解。