图片 14

关于WebAssembly的详细讲述

值得一提的是,上个月 Mozilla、Fastly、Intel 与 Red Hat
宣布成立联合组织 Bytecode
Alliance(字节码联盟),该联盟旨在通过协作实施标准和提出新标准,以完善 WebAssembly
在浏览器之外的生态。

在每个浏览器里面,无论Chrome,Firefox,Safari,Edge,能够运行的语言就是Javascript。为了能够让其他语言的代码在浏览器中运行,WebAssembly被创造出来。它拥有更好性能,更小的size,能够更快的加载和执行。我们无需编写WebAssembly的代码,只需要将其他高级语言编译成WebAssembly,这样就能在浏览器中复用大量的其他语言现有的代码。

webAssembly.instantiate

Promise WebAssembly.instantiate(module, importObject);

大家都知道,万维网联盟 W3C 认证的 Web 语言有 HTML、CSS 与
JavaScript,而近日联盟正式宣布 WebAssembly 核心规范(WebAssembly Core
Specification)成为官方 Web
标准,这意味着 WebAssembly 成为了第 4 种 Web
语言。

GC。首先,提供GC功能对重写web框架是非常有优势的。例如:使用WASM重写React中的diff功能,借助多线程,手动的内存分配,能够提供以前无法现象的高性能,但是当你跟JS
对象交互时,例如组件,仍然需要GC来减轻开发的负担。异常处理。很多的高级语言,如C/C++提供异常处理,在某些特定场景下非常有用,同时JS也有异常处理,当WASM和JS互操作时,也需要有异常处理的支持。debug。这个就不多说现状JS拥有Typed
Objects
草案,WASM拥有GC草案。通过这两个草案,JS和WASM都能够清晰的知道一个对象的结构以及如何去存储,使用,回收。异常处理。目前还在开发阶段。debug。目前,大多数浏览器已经支持。

更直观的例子

上面的例子中,编译后即可直接运行。但是生成的代码体积较大,不容易看懂具体做了什么。因此下面提供一个更直观的例子。

math.c

int add (int x, int y) {

  return x + y;

}

int square (int x) {

  return x * x;

}

编译:

emcc math.c -Os -s WASM=1 -s SIDE_MODULE=1 -o math.wasm

-s SIDE_MODULE=1 直接由C生成wasm文件

目前只有一种方式能调用 wasm 里的提供接口,那就是:用 javascript !

W3C 同时公布了 WASM 接下来的开发重点,新特性包括:

我们知道,大量的桌面应用,像PS,AutoCAD,这些应用非常的庞大,对性能要求非常苛刻。要先让他们在浏览器里面运行起来非常的难,因此需要更多的特性来确保更佳的性能:

webAssembly.validate

webAssembly.validate() 方法验证给定的二进制代码的 typed array
是否是合法的wasm module.返回布尔值。

WebAssembly.validate(bufferSource);

使用

javascript
fetch(‘xxx.wasm’).then(response =>
response.arrayBuffer()
).then(function(bytes) {
var valid = WebAssembly.validate(bytes); //true or false
});

对于 Web 来说,因为其虚拟指令集设计,WebAssembly
可让加载的页面以本地编译代码运行,从而可以提高 Web
性能。换句话说,WebAssembly
可以实现接近本地的性能,并且优化加载时间,同时最重要的是,它可以作为现有代码库的编译目标。

对于很多的web应用场景,我们可能只需要在一些性能敏感的部分,使用WebAssembly。因此,某些模块需要用WebAssembly来编写,然后替换掉那些JS写的部分。一个例子就是Firefox中的source
map
library的parser,它用WebAssembly编写,比原来用JS编写的快11倍。为了能让这种场景下,WebAssembly更好的发挥作用,有更多的要求:

编写加载函数(loader)

function loadWebAssembly (path) {

  return fetch(path)                   // 加载文件        

    .then(res => res.arrayBuffer())    // 转成 ArrayBuffer

    .then(WebAssembly.instantiate)     // 编译 + 实例化

    .then(mod => mod.instance)         // 提取生成都模块

}

完成了上边的操作,就可以直接使用 loadWebAssembly 这个方法加载 wasm
文件了,它相当于是一个 wasm-loader ;返回值是一个 Promise.

loadWebAssembly('path/to/math.wasm')

  .then(instance => {

    const { add, square } = instance.exports

    // ...

})

更完善的loader

function loadWebAssembly(filename, imports = {}) {

return fetch(filename)

    .then(response => response.arrayBuffer())

    .then(buffer => WebAssembly.compile(buffer)) 

    //WebAssembly.compile 可以用来编译 wasm 的二进制源码,

    //它接受 BufferSource 格式的参数,返回一个 Promise。

    .then(module => {           

        imports.env = imports.env || {};

        // 开辟内存空间 && 创建变量映射表

        Object.assign(imports.env, {

            memoryBase: 0,

            tableBase: 0,

            memory: new WebAssembly.Memory({ initial: 256, maximum: 256 }),

            table: new WebAssembly.Table({ initial: 0, maximum: 0, 

                    element: 'anyfunc' })

        })

        // 创建 WebAssembly 实例

        return new WebAssembly.instantiate(module, imports)

    })

}

ArrayBuffer 做了两件事情,一件是做 WebAssembly 的内存,另外一件是做
JavaScript 的对象。

它使 JS 和 WebAssembly 之间传递内容更方便。 使内存管理更安全。

这个 loadWebAssembly 函数还接受第二个参数,表示要传递给 wasm
的变量,在初始化 WebAssembly 实例的时候,可以把一些接口传递给 wasm
代码。

尽管本地类型数量很少,但相对于 JavaScript
而言,性能的提高大部分归功于其对一致类型的使用。WebAssembly
对编译语言进行了数十年的优化,其字节代码针对紧凑性和流传输进行了优化。在下载其它代码时,网页便可以开始执行。网络和
API 访问通过附带的 JavaScript 库进行,安全模型则与 JavaScript 相同。

如何应对繁重的桌面应用

webAssembly.Module

WebAssembly.Module() 构造函数可以用来同步编译给定的 WebAssembly
二进制代码。不过,获取 Module 对象的主要方法是通过异步编译函数,如
WebAssembly.compile(),或者是通过 IndexedDB 读取 Module 对象.

var myInstance = new WebAssembly.Instance(module, importObject);

module: 需要被实例化的webAssembly module importObject: 需要导入的变量

图片 1

通过以上的特性以及正在开发中的功能,WASM的能力得到释放,接下来就是如何再现有的Web生态中使用WASM。

webAssembly的方法

  • Threading,线程:Threading 提供了共享内存多线程和原子内存访问的优势。
  • Fixed-width SIMD,固定宽度 SIMD:并行执行循环的向量操作。
  • Reference types 引用类型:允许 WebAssembly
    代码直接引用宿主对象。
  • Tail calls,尾调用:直接调用而不使用额外的堆栈空间。
  • ECMAScript module integration,ECMAScript 模块集成:通过将
    WebAssembly 可执行文件加载为 ES6 模块来与 JavaScript 进行交互。

跟具体的平台无关,因此不同平台的不同浏览器都能运行WebAssembly。拥有足够快的运行速度,能够带来足够流畅的交互体验。加载速度要足够快,因此,需要编译目标能够被压缩,减小加载内容的大小能够手动的管理,分配内存。我们知道C/C++一类的语言支持指针的特性,通过指针可以读写特定地址的内存;为了安全考虑,还要对限制特定地址的内存进行操作。出于以上的亮点,WebAssembly使用了线性内存模型。

简介

JS于1995年问世,设计的初衷不是为了执行起来快。直到08年性能大战中,许多浏览器引入了即时编译
JIT(just-in-time编译器),JavaScript
代码的运行渐渐变快。正是由于这些 JIT 的引入,使得
JavaScript
的性能达到了一个转折点,JS 代码执行速度快了 20 – 50倍。

JIT 是使 JavaScript 运行更快的一种手段,通过监视代码的运行状态,把 hot
代码(重复执行多次的代码)进行优化。通过这种方式,可以使 JavaScript
应用的性能提升很多倍。

图片 2

随着性能的提升,JavaScript
可以应用到以前根本没有想到过的领域,比如用于后端开发的
Node.js。性能的提升使得 JavaScript 的应用范围得到很大的扩展。

JavaScript的无类型是JavaScript引擎的性能瓶颈之一,在过去几年,我们看到越来越多的项目问世,它们试图通过开发编译程序,将其他语言代码转化为
JavaScript,以此让开发者克服 JavaScript
自身存在的一些短板。其中一些项目专注于给编程语言增加新的功能,比如微软的
TypeScript 和 Google 的
Dart,【设计一门新的强类型语言并强制开发者进行类型指定】或是加快
JavaScript 的执行速度,例如 Mozilla 的 asm.js
项目和Google的PNaCI【给现有的JavaScript加上变量类型】。

现在通过 WebAssembly,我们很有可能正处于第二个拐点。

图片 3

什么是webAssembly?

WebAssembly是一种新的适合于编译到Web的,可移植的,大小和加载时间高效的格式,是一种新的字节码格式。它的缩写是”.wasm”,.wasm
为文件名后缀,是一种新的底层安全的“二进制”语法。它被定义为“精简、加载时间短的格式和执行模型”,并且被设计为Web
多编程语言目标文件格式。

这意味着浏览器端的性能会得到极大提升,它也使得我们能够实现一个底层构建模块的集合.

webAssembly的优势

webassembly相较于asm.js的优势主要是涉及到性能方面。根据WebAssembly
FAQ的描述:在移动设备上,对于很大的代码库,asm.js仅仅解析就需要花费20-40秒,而实验显示WebAssembly的加载速度比asm.js快了20倍,这主要是因为相比解析
asm.js 代码,JavaScript 引擎破译二进制格式的速度要快得多。

主流的浏览器目前均支持webAssembly。

Safari 支持 WebAssembly的第一个版本是11 Edge 支持
WebAssembly的第一个版本是16 Firefox 支持 WebAssembly的第一个版本是 52
chrome 支持 WebAssembly的第一个版本是 57

使用WebAssembly,我们可以在浏览器中运行一些高性能、低级别的编程语言,可用它将大型的C和C++代码库比如游戏、物理引擎甚至是桌面应用程序导入Web平台。

此外还有一些一直在跟进的特性,包括垃圾回收、调试接口与 WebAssembly
系统接口(WASI)等。

虽然这些特性仍在开发中,但是我们能够看到已经有大量的桌面应用在浏览器中运行起来,其中最大的幕后功臣就是WebAssembly。

为什么WebAssembly更快

JS 引擎在图中各个部分所花的时间取决于页面所用的 JavaScript
代码。图表中的比例并不代表真实情况下的确切比例情况。

图片 4

图片 5

Parse: 把源代码变成解释器可以运行的代码所花的时间; Compiling +
optimizing: 基线编译器和优化编译器花的时间; Re-optimize: 当 JIT
发现优化假设错误,丢弃优化代码所花的时间。 Execut:执行代码的时间
Garbage collection: 垃圾回收,清理内存的时间

文件获取:

WebAssembly比JS的压缩了更高,所以文件获取更快。

解析:

到达浏览器时,JS源代码被解析成了抽象语法树,浏览器采用懒加载的方式进行,只解析真正需要的部分,,而对于浏览器暂时不需要的函数只保留它的桩,解析过后
AST (抽象语法树)就变成了中间代码(叫做字节码),提供给 JS 引擎编译。

而WebAssembly不需要这种转换,因为它本身就是中间代码,它要做的只是解码并且检查确认代码没有错误即可。

图片 6

编译和优化

JavaScript
是在代码的执行阶段编译的。因为它是弱类型语言,当变量类型发生变化时,同样的代码会被编译成不同版本。

不同浏览器处理 WebAssembly 的编译过程也不同。不论哪种方式,WebAssembly
都更贴近机器码,所以它更快.

在编译优化代码之前,它不需要提前运行代码以知道变量都是什么类型。
编译器不需要对同样的代码做不同版本的编译。 很多优化在 LLVM
阶段就已经做完了,所以在编译和优化的时候没有太多的优化需要做。

图片 7

重优化

JS的代码由于类型的不确定性,有些情况下,JIT会返回进行
“抛弃优化代码<->重优化”过程。

而WebAssembly中,类型都是确定了的,因为没有重优化阶段。

执行

WebAssembly
就是为了编译器而设计的,开发人员不直接对其进行编程,这样就使得
WebAssembly 专注于提供更加理想的指令给机器。

执行效率方面,不同的代码功能有不同的效果,一般来讲执行效率会提高 10% –
800%。

图片 8

垃圾回收

WebAssembly不支持垃圾回收,内存操作需要手动控制,因此WebAssembly没有垃圾回收。

WebAssembly 描述了一种内存安全的沙箱执行环境,该环境甚至可以在现有
JavaScript 虚拟机内部实现。当嵌入到 Web 中时,WebAssembly
将强制执行浏览器的同源和权限安全策略。

时间: 2018-12-15阅读: 1473标签: 语言历史

webAssembly.Table

var myTable = new WebAssembly.Table(tableDescriptor);

tableDescriptor (object)

element,当前只支持一个值。 ‘anyfunc’ initial, WebAssembly
Table的初始元素数 maximum(可选), 允许的最大元素数

WebAssembly 也叫
WASM,它是为基于栈的虚拟机设计的二进制指令格式,WASM 作为可移植目标,用于编译高级语言(如
C/C++/Rust),从而可以在 Web
上部署高性能客户端和服务器应用,同时它也可以在许多其它环境中使用。

最小可用产品

Rust编译为webAssembly

1.安装Rustup

Rustup是一个命令行应用,能够下载并在不同版本的Rust工具链中进行切换

brew install cargo

curl https://sh.rustup.rs -sSf | sh

source $HOME/.cargo/env 

source  ~/.bash_profile

rustup target add wasm32-unknown-unknown --toolchain nightly 

cargo install --git https://github.com/alexcrichton/wasm-gc 

//减小wasm的size

cargo可以将整个工程编译为wasm,首先使用cargo创建工程:

cargo new project

下一步,把下面的代码加到 Cargo.toml 中

[lib]

path = "src/lib.rs"

crate-type = ["cdylib"]

2.demo:

编译:

cargo +nightly build –target wasm32-unknown-unknown –release

图片 9

编译出来的wasm大小为82Kb,使用wasm-gc压缩 small-wasm_astar.wasm 的大小为
67Kb

wasm-gc wasm_astar.wasm small-wasm_astar.wasm

图片 10

(文/开源中国)    

通过以上的特点,保证了WebAssembly能够在生产环境中使用起来。

webAssembly.Memory

当 WebAssembly 模块被实例化时,它需要一个 memory
对象。你可以创建一个新的WebAssembly.Memory并传递该对象。如果没有创建
memory 对象,在模块实例化的时候将会自动创建,并且传递给实例。

var myMemory = new WebAssembly.Memory(memoryDescriptor);

memoryDescriptor (object)

initial maximum 可选

WASM
有多种实现,包括浏览器和独立系统,它可以用于视频和音频编解码器、图形和
3D、多媒体和游戏、密码计算或便携式语言实现等应用。目前 1.0 版本的 Wasm
已经支持 Chrome、Firefox、Safari 与 Edge 浏览器。

应用

应用

WebAssembly
更适合用于写模块,承接各种复杂的计算,如图像处理、3D运算、语音识别、视音频编码解码这种工作,主体程序还是要用
javascript 来写的。

WebAssembly与JavaScript

webAssembly使用

WebAssembly
与其他的汇编语言不一样,它不依赖于具体的物理机器。可以抽象地理解成它是概念机器的机器语言,而不是实际的物理机器的机器语言。浏览器把
WebAssembly 下载下来后,可以迅速地将其转换成机器汇编代码。

图片 11

快速体验webAssembly

WebAssembly.compile(new Uint8Array(`

  00 61 73 6d   01 00 00 00   01 0c 02 60   02 7f 7f 01

  7f 60 01 7f   01 7f 03 03   02 00 01 07   10 02 03 61

  64 64 00 00   06 73 71 75   61 72 65 00   01 0a 13 02

  08 00 20 00   20 01 6a 0f   0b 08 00 20   00 20 00 6c

  0f 0b`.trim().split(/[srn]+/g).map(str => parseInt(str, 16))

)).then(module => {

  const instance = new WebAssembly.Instance(module)

//使用 WebAssembly.Instance 将模块对象转成 WebAssembly 实例

  const { add, square } = instance.exports

//通过 instance.exports 可以拿到 wasm 代码输出的接口

  console.log('2 + 4 =', add(2, 4))

  console.log('3^2 =', square(3))

  console.log('(2 + 5)^2 =', square(add(2 + 5)))

})

使用C/C++

hello.c

#include 

int main(int argc, char ** argv) {

  printf("Hello Worldn");

  return 0;

}

编译:

emcc hello.c -s WASM=1 -o hello.html

-s WASM=1 —
指定我们想要的wasm输出形式。如果我们不指定这个选项,Emscripten默认将只会生成asm.js。

-o hello.html —
指定这个选项将会生成HTML页面来运行我们的代码,并且会生成wasm模块以及编译和实例化wasim模块所需要的“胶水”js代码,这样我们就可以直接在web环境中使用了。

编译后

图片 12

二进制的wasm模块代码 (hello.wasm)

一个包含了用来在原生C函数和JavaScript/wasm之间转换的胶水代码的JavaScript文件
(hello.js)

一个用来加载,编译,实例化你的wasm代码并且将它输出在浏览器显示上的一个HTML文件
(hello.html)

调用C++中的方法

hello.c

#include 



int main(int argc, char ** argv) {

  printf("Hello Worldn");

}

#ifdef __cplusplus

extern "C" {

#endif

int EMSCRIPTEN_KEEPALIVE myFunction(int argc, char ** argv) {

  printf("MyFunction Calledn");

}

#ifdef __cplusplus

}

#endif

如果想调用hello2.c中的myFunction方法,则需要将ccall方法从Moudule导出。使用下面的编译命令:

 emcc -o hello2.html hello2.c -O3 -s 

 'EXTRA_EXPORTED_RUNTIME_METHODS=["ccall"]'  

-s WASM=1 --shell-file html_template/shell_minimal.html

html_template/shell_minimal.html 指定为HTML模板。 -s
‘EXTRA_EXPORTED_RUNTIME_METHODS=[“ccall”]’ 从Module中导出 ccall

将 ccall 方法导出之后,就可以使用 Module.ccall来调用C++中的函数了。

var result = Module.ccall(

    'funcName',     // 函数名

    'number',        // 返回类型

    ['number'],      // 参数类型

    [42]);            // 参数

首当其冲的,是需要支持多线程。现代的计算机都是多核的,通过多线程能够更好的利用计算机的计算能力。SIMD(单指令多数据)。通过SIMD,能够将一组内存划分成不同的执行单元,就像多核一样。64位寻址。借助64位寻址,能够使用更多的内存,这对一些内存敏感性的应用是非常有利的。流式编译。前面提到了,提升加载的速度,其实我们有更好的办法,就是刚下载的时候就开始编译,这将是巨大的提升。HTTP缓存。如何两个浏览器加载相同的WebAssembly代码,将会编译成相同的机器码,因此可以将编译后的机器码保存在HTTP缓存中,这样就可以跳过编译的过程,复用机器码。现状多线程:一个草案已经接近完成,其中的关键SharedArrayBuffers,已经被否决了。SIMD:正在开发中…64位寻址:wasm-64即将登场流式编译:Firefox已经在2017年支持,其他浏览器也即将支持

系统”>开发前准备工作(MAC系统)

1.安装 cmake brew install cmake

2.安装 pyhton brew insatll python

3.安装 Emscripten
(调整下电脑的休眠时间,不要让电脑进入休眠,安装时间较长)

安装步骤如下:

git clone https://github.com/juj/emsdk.git

cd emsdk

./emsdk install --build=Release sdk-incoming-64bit binaryen-master-64bit

./emsdk activate --global --build=Release sdk-incoming

    -64bit binaryen-master-64bit

执行 source
./emsdk_env.sh,并将shell中的内容添加到环境变量中(~/.bash_profile):

执行: source ~/.bash_profile

4.安装 WABT(将.wast文件转成 .wasm文件)

git clone https://github.com/WebAssembly/wabt.git

cd wabt

make install gcc-release

5.浏览器设置

Chrome: 打开 chrome://flags/#enable-webassembly,选择 enable。

Firefox: 打开 about:config 将 javascript.options.wasm 设置为 true。

如果浏览器太旧,请更新浏览器,或者安装激进版浏览器来体验新技术。

6.一个本地web服务器.

Emscripten,它基于 LLVM ,可以将 C/C++ 编译成 asm.js,使用 WASM
标志也可以直接生成 WebAssembly 二进制文件(后缀是 .wasm)

图片 13

         Emscripten

source.c   ----->  target.js



     Emscripten (with flag)

source.c   ----->  target.wasm

注:emcc 在 1.37 以上版本才支持直接生成 wasm 文件

Binaryen
是一套更为全面的工具链,是用C++编写成用于WebAssembly的编译器和工具链基础结构库。WebAssembly是二进制格式(Binary
Format)并且和Emscripten集成,因此该工具以Binary和Emscript-en的末尾合并命名为Binaryen。它旨在使编译WebAssembly容易、快速、有效。

图片 14

wasm-as:将WebAssembly由文本格式编译成二进制格式;
wasm-dis:将二进制格式的WebAssembly反编译成文本格式;
asm2wasm:将asm.js编译到WebAssembly文本格式,使用Emscripten的asm优化器;
s2wasm:在LLVM中开发,由新WebAssembly后端产生的.s格式的编译器;
wasm.js:包含编译为JavaScript的Binaryen组件,包括解释器、asm2wasm、S表达式解析器等。

WABT工具包支持将二进制WebAssembly格式转换为可读的文本格式。其中wasm2wast命令行工具可以将WebAssembly二进制文件转换为可读的S表达式文本文件。而wast2wasm命令行工具则执行完全相反的过程。

wat2wasm: webAssembly文本格式转换为webAssembly二进制格式(.wast 到
.wasm) wasm2wat:
将WebAssembly二进制文件转换为可读的S表达式文本文件(.wat) wasm-objdump:
print information about a wasm binary. Similiar to objdump. wasm-interp:
基于堆栈式解释器解码和运行webAssembly二进制文件 wat-desugar: parse .wat
text form as supported by the spec interpreter wasm-link: simple linker
for merging multiple wasm files. wasm2c:
将webAssembly二进制文件转换为C的源文件

JS和WASM能够更快的相互调用。因为要将WASM代码作为模块继承到现存的JS应用中,需要他们能够更快的相互调用,Firefox中已经有了巨大的提升快速而容易的数据转换。在JS和WASM相互调用时,需要传递数据,要想实现上面的两个目标,非常的难:WASM只理解数字,那就需要将各种数据格式转换成数字ES
module。集成WASM模块,通常在JS中使用import,export关键词,因此,浏览器需要内置ES
module。工具链。在JS中,可以使用npm,brower等工具,但是在WASM中,好像没有这个工具…兼容性。前端开发,都逃不了兼容性的问题。现状Firefox中,JS和WASM能够很快的调用引用类型草案登场,其增加了一种新的,WASM函数能够接收和返回的类型,这个类型引用一个外部的object,可以是JS的Object。一个ES
module的草案被提及,浏览器厂商正在支持。Rust生态的wasm-pack能够像npm一样支持包管理借助wasm2js工具,能够让WASM在旧版的浏览器中得到支持

asm.js

asm.js 是 javascript
的子集,是一种语法。用了很多底层语法来标注数据类型,目的是提高
javascript 的运行效率,本身就是作为 C/C++
编译的目标设计的(不是给人写的)。 WebAssembly
借鉴了这个思路,做的更彻底一些,直接跳过 javascript
,设计了一套新的平台指令。

目前只有 asm.js 才能转成 wasm,普通 javascript 是不行的。虽然 Emscripten
能生成 asm.js 和 wasm ,但是却不能把 asm.js 转成 wasm 。想要把 asm.js
编译成 WebAssembly,就要用到他们官方提供的 Binaryen 和 WABT (WebAssembly
Binary Toolkit) 工具。

           Binaryen                WABT

math.js   -------->   math.wast   ------->   math.wasm

WebAssembly不仅仅支持C/C++,同时也希望支持更多的高级语言,因此,需要一个语言无关的编译目标,就像汇编语言一样,支持任何语言编译成汇编语言。这个编译目标有如下的特点:

未来功能

直接操作DOM
支持多数据(SIMD):SIMD的使用可以获取大的数据结构,例如不同数目的向量,并且同时将相同的指令应用于不同的部分。这样,它可以大大加快各种复杂计算的游戏或VR的运行速度。
ES6模块集成:浏览器目前正在添加对使用script标签加载JavaScript模块的支持。
添加此功能后,即使URL指向WebAssembly模块, <

在前端开发中,大量涉及的框架及编译成JS的语言都将是WASM发挥作用的场景。所以就有两种选择了:1,使用WASM来重写现有的Web框架;2,将Reasonml,Elm等语言编译成WASM。为了实现这些功能,需要WASM提供更多高级语言的特性,包括:

WebAssembly仍在持续的发展,还有大量的特性即将到来。其最早发明出来是为了将C++的转译成JS,然后在浏览器中运行起来,这样就能把大量现有的C++代码在浏览器中复用。被转译后的JS代码比原生的JS代码要慢,Mozilla的工程师发现一种类型系统,可以让被转译后的JS运行得更快,这就是asm.js.
同时,其他浏览器厂商发现asm.js的运行速度非常快,也把这种优化加入到他们的浏览器引擎中。这仅仅是开始,工程师们仍在持续努力,但是,不是将其他语言编译成JS,而是一种新的语言,那就是WebAssembly。

来自: