WebAssembly的现状与使用
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的原生代码编译器。
dotnet/llilc - Blazor
Blazor 是一个 Web UI 框架,可通过 WebAssembly 在任意浏览器中运行 .Net 。
https://blazor.net/docs/get-started.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » WebAssembly的现状与使用