[译] 关于 WebAssembly 你应该知道的 7 件事

粗略翻译, 推荐看原文


了解 WebAssembly, 了解 Web 的将来

这里不支持链接,代码展现也不好,建议看原文。

介绍

如果你不熟悉 WebAssembly 后面的概念, 可以读一下:

考虑到本文的目标, 这里加上个简短的术语表:

  • 源码(Source code): 开发者写的.

  • 编译器(Compiler): 一个应用程序, 用于把源码转换为汇编,字节码或者机器码

  • 汇编(Assembly): 低级的类似源码的语言, 针对特定机器或特定应用程序

  • 字节码(Bytecode): 低级的二进制的代码形式, 可以被其他应用程序执行

  • 机器码(Machine code): 代码的二进制形式, 可以由硬件直接执行

WebAssembly 的目标是 Web 的字节码. 未来的开发者会这样使用 WebAssembly:

  1. 开发一个应用(源码用任何可以编译到 WebAssembly 的语言)

  2. 用编译器把源码转换到 WebAssembly 字节码(可能只要的话转化成汇编)

  3. 在浏览器加载字节码并执行

640?wx_fmt=png

真相 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 和已有的类库

...

结论

过去几年出现了大量的框架, 编译器和其他类型的方案,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值