守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 639|回复: 0

[WebAssembly] 关于WebAssembly你需要了解的7件事

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51661
    钢镚
    1422

    开源英雄守望者

    发表于 2016-8-17 15:29:44 | 显示全部楼层 |阅读模式

    来源:http://www.infoq.com/cn/news/2015/10/webassembly-7-things

    Auth0是一家企业级网络认证服务提供商,致力于为用户提供流畅可扩展的认证解决方案。近日,该公司的工程师Seba Peyrott在文章中为我们介绍了关于WebAssembly技术你需要了解的7件事情

    WebAssembly是一项由Mozilla、谷歌、微软及苹果联合开发的项目,致力于为各种语言定义一种二进制形式的编译目标格式,并设计一种可与当前的Web平台集成并在Web环境中执行的方案,最终实现在各类平台上以接近原生的速度调用常见的硬件功能。如果你尚未接触过WebAssembly,可以阅读发表于InfoQ的译文《WebAssembly:面向Web的通用二进制和文本格式》稍作了解,也可查看WebAssembly团队发布于Github的相关设计文档进行深入探究。

    Seba Peyrott首先定义了五个与WebAssembly有关的词:源代码、编译器、汇编、字节码、机器码,其中字节码是一种可运行于其它应用中的低阶二进制代码表示,机器码是可直接运行于硬件之上的二进制代码表示。而WebAssembly所做的正是为Web打造一套专用的字节码,这项标准在未来应用场景可能是这样的:

    1. 开发应用,但使用任何一门可被编译为WebAssembly的语言编写源代码。
    2. 用编译器将源代码转换为WebAssembly字节码,也可按需转换为汇编代码。
    3. 在浏览器中加载字节码并运行。

    而你需要了解的这七个事实分别是:

    1. WebAssembly不会替代JavaScript。Sebastián认为,越来越多的语言和平台想在Web上大展手脚,这会迫使JavaScript和浏览器厂商不得不加快步伐来补充缺失的功能,其中某些功能通过复杂的JavaScript语义来实现并不合适,所以WebAssembly可以作为JavaScript的补集加入到Web阵营中来。WebAssembly最一开始的设计初衷就是作为不依赖于JavaScript的编译目标而存在,进而获得了主流浏览器厂商的广泛支持。
    2. WebAssembly由参与组建asm.js和(P)NaCl的团队共同开发。Mozilla的asm.js项目初始目标是制定一套JavaScript子集作为编译目标,然而Google的(P)NaCl((Portable) Native Client)则选择为基于LLVM的Web平台提供一套二进制格式。Web平台不由某一厂商独立控制,理应由大家共同参与维护,所以这些团队目前正共同开发一套跨浏览器的编译目标。
    3. WebAssembly向后兼容。团队会针对老版本浏览器提供polyfill支持,目前已经构建出初始原型,也可以通过demo1和demo2体验最新的技术(注:高能预警,请提前保存所有重要文档,打开demo后会非常卡)。
    4. WebAssembly比CPU汇编代码更简单易懂。WebAssembly所以描述的结构是抽象语法树(abstract syntax tree,简称AST),它同时也提供一些高阶结构,例如:循环和分支。如果了解语法规则,你可以手写WebAssembly结构,将编译后的二进制文件反编译的结果也是可读的,WebAssembly甚至支持在已编译文件中添加调试信息。下面有两段WebAssembly示例可以参考:

      1. 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))
        )
      2. 另一种表示方法,完整示例

        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所需的功能进行扩展。根据项目文档中的最小可行产品(MVP)原则,WebAssembly初期将实现asm.js的所有功能,但是会将其文字表达形式转换为二进制格式,以此来进一步优化加载时间。在未来的版本中,可能有如下几方面的突破:
      • 完整的线程支持
      • 单指令多数据(SIMD)类型与内联函数
      • 零成本异常(堆栈检查与展开)
      • 协同程序
      • 动态连接
      • DOM集成
      • 集成垃圾回收
      • 尾调用优化
      • 多进程支持
    6. 支持在浏览器中开启Source-maps功能调试编译后代码。通过添加Source-maps的支持,可以在调试字节码的过程中有效避免“调试地狱”,WebAssembly也支持在二进制格式文件中直接添加调试信息,简化调试过程是其标准中定义的内容之一。
    7. 即刻行动,无须等待。WebAssembly集asm.js与NaCl二者之精华,如果你想马上体验这些新兴的技术,建议选择asm.js进行体验,Emscripten可以帮助你把其它代码转换成asm.js。由于WebAssembly尚处于孕育期,开发者们仍然会继续维护asm.js,通过它在Github上的仓库你仍可得到相应的支持。

    无论在官方文档还是在其它文章中,我们一直关注如何在Web平台上应用WebAssembly技术,往往忽略了通过这个平台同时也实现了JavaScript与其它语言互相调用的可能性。总而言之,WebAssembly刚刚起步,同时它是多个主流厂商共同支持的解决方案,念念不忘,必有回响,我们继续期待着。


    评分

    参与人数 1金币 +20 收起 理由
    shawn00 + 20

    查看全部评分

    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-7-17 15:23 , Processed in 0.041704 second(s), 34 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表