Auth0 是一家企业级网络认证服务提供商,致力于为用户提供流畅可扩展的认证解决方案。近日,该公司的工程师Seba Peyrott在文章中为我们介绍了 关于WebAssembly技术你需要了解的7件事情 。
WebAssembly是一项由Mozilla、谷歌、微软及苹果联合开发的项目,致力于为各种语言定义一种二进制形式的编译目标格式,并设计一种可与当前的Web平台集成并在Web环境中执行的方案,最终实现在各类平台上以接近原生的速度调用常见的硬件功能。如果你尚未接触过WebAssembly,可以阅读发表于InfoQ的译文《 WebAssembly:面向Web的通用二进制和文本格式 》稍作了解,也可查看WebAssembly团队发布于Github的 相关设计文档 进行深入探究。
Seba Peyrott首先定义了五个与WebAssembly有关的词:源代码、编译器、汇编、字节码、机器码,其中字节码是一种可运行于其它应用中的低阶二进制代码表示,机器码是可直接运行于硬件之上的二进制代码表示。而WebAssembly所做的正是为Web打造一套专用的字节码,这项标准在未来应用场景可能是这样的:
而你需要了解的这七个事实分别是:
WebAssembly比CPU汇编代码更简单易懂。WebAssembly所以描述的结构是 抽象语法树(abstract syntax tree,简称AST) ,它同时也提供一些高阶结构,例如:循环和分支。如果了解语法规则,你可以手写WebAssembly结构,将编译后的二进制文件反编译的结果也是可读的,WebAssembly甚至支持在已编译文件中添加调试信息。下面有两段WebAssembly示例可以参考:
类 s-表达式 AST, 完整示例
;; 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)) )
另一种表示方法, 完整示例
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); }
无论在官方文档还是在其它文章中,我们一直关注如何在Web平台上应用WebAssembly技术,往往忽略了通过这个平台同时也实现了JavaScript与其它语言互相调用的可能性。总而言之,WebAssembly刚刚起步,同时它是多个主流厂商共同支持的解决方案,念念不忘,必有回响,我们继续期待着。
感谢徐川对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群 )。