美文网首页程序员
WebAssembly的现状与使用

WebAssembly的现状与使用

作者: 我不叫奇奇 | 来源:发表于2019-01-25 18:04 被阅读35次

    WebAssembly的现状与实战。

    原文链接: https://www.ibm.com/developerworks/cn/web/wa-lo-webassembly-status-and-reality/index.html

    该文章介绍了WebAssembly出现的 背景 / 原理 / 用js写WebAssembly的例子 / 展望。

    总结起来就是:

    • js性能较弱,开发大型项目困难。微软,谷歌,火狐各有各自的解决办法。为了统一他们的解决方案,所形成的标准就是WebAssembly。
    • 各种语言使用WebAssembly的方法都是
      高级语言 -> 底层虚拟机LLVM认识的中间语言(LLVM IR) -> WebAssembly 字节码
    • WebAssembly 作为一种底层字节码,除了能在浏览器中运行外,还能在其它环境运行。
    • WebAssembly 的性能优于js,但是低于nodejs的原生模块或者是c的原生模块。所以如果不是运行在浏览器环境中,不用特意的转化成WebAssembly 。
      例如: c -> node js环境

    WebAssembly 标准虽然已经定稿并且得到主流浏览器的实现,但目前还存在以下问题:

    • 浏览器兼容性不好,只有最新版本的浏览器支持,并且不同的浏览器对 JS WebAssembly 互调的 API 支持不一致;
    • 生态工具不完善不成熟,目前还不能找到一门体验流畅的编写 WebAssembly 的语言,都还处于起步阶段;
    • 学习资料太少,还需要更多的人去探索去踩坑。

    总之现在的 WebAssembly 还不算成熟,如果你的团队没有不可容忍的性能问题,那现在使用 WebAssembly 到产品中还不是时候, 因为这可能会影响到团队的开发效率,或者遇到无法轻易解决的坑而阻塞开发。

    WebAssembly的构建方法

    原文链接: https://blog.csdn.net/m549393829/article/details/81839822

    • 直接汇编文本编写
      WebAssembly使用S-表达式作为文本格式
      S表达式用于表示一棵树。树上的每个一个节点都有一对小括号包围。括号内的第一个标签告诉你该节点的类型,其后跟随的是由空格分隔的属性或孩子节点列表
      劣势显而易见,编码逻辑不容易理解

    • 移植一个C/C++程序


    这张图是官网上的构建流程图,构建过程中使用了Emscripten——一个基于llvm的编译器,目的是把c/c++编译为asm.js(js的一个真子集)
    我们知道,c和js语法十分相似。所以在c到js的编译过程中,要解决的最重要的问题主要是两点:

    • C/C++是静态类型,js是动态类型
    • C/C++需要程序员手动管理内存,js则有自己的一套垃圾回收机制

    因此,就出现了asm.js。asm.js只有两种静态类型(i32, f64),并取消js的垃圾回收(手动管理内存)。浏览器加载到asmjs时,不进行语法分析,直接翻译为机器码执行
    实际上,asm.js就是WebAssembly的一种文本格式,但不同于之前提到的s表达式。这一点类比于c,汇编语言,机器码之间的关系
    由于WebAssembly当前不能直接调用Web API(如存取DOM),它只能调用JavaScript,因此需要一段js胶水代码使WebAssembly能够调用到Web API
    移植代码缺点在于需要较复杂的依赖,相比之下,汇编编写依赖都由程序员自己定义

    C#对WebAssembly的使用

    理论上高级语言只要能转换到底层虚拟机LLVM认识的中间语言(LLVM IR),就能转换成WebAssembly。

    相关文章

      网友评论

        本文标题:WebAssembly的现状与使用

        本文链接:https://www.haomeiwen.com/subject/dadujqtx.html