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。
- LLILC
LLILC是为.NET核心(core)提供新的基于LLVM的原生代码编译器。
https://github.com/dotnet/llilc - Blazor
Blazor 是一个 Web UI 框架,可通过 WebAssembly 在任意浏览器中运行 .Net 。
https://blazor.net/docs/get-started.html