wasm和javascript

简介: 你是前端吗?你知道WebAssembly吗? 我是前端,很早以前就关注并使用这个技术了。 2015年的时候,还搞过技术分享,那时候还不叫wasm, 那时候确切点说称之为经过llvm编译高度优化过的asm.js . 当时给youku播放器做的加密方案之一,当时有flascc , alchemy等几个不同的方案备选。

你是前端吗?你知道WebAssembly吗?

我是前端,很早以前就关注并使用这个技术了。

2015年的时候,还搞过技术分享,那时候还不叫wasm, 那时候确切点说称之为经过llvm编译高度优化过的asm.js . 当时给youku播放器做的加密方案之一,当时有flascc , alchemy等几个不同的方案备选。最终选择了cheerp和flascc两种方案。

cheerp 也是将c++交叉编译成js的解决方案,和asm.js不同走的是交叉另一条路,区别在于内存模型。后来直到wasm的原型和草案通过,17年底cheerp技术才开始支持到wasm,wast的交叉编译。cheerp原有代码基本上不需要更改就能直接生成wasm字节码。cheerp最新版本是2.0,有win版本。后来搞了一套cheerpj给java开发人员用于移植java的老富客户端应用。

flascc 是adobe公司的 flash as3 交叉编译方案, 之前的叫adobe alchemy. 是通过gcc生成优化过的AS3代码,搞得不是很彻底(没有生成字节码),编译速度很慢。最早是可以支持c开发, 后来全部到flascc 改成了c++ sdk ,体积暴增。随着flash技术没落而完结。

ane adobe的air拓展方案之一,所谓拓展其实在平台上就是dll/so,通过代理技术(类似jni)使用。目前还存在于tv端,移动游戏端。

swig 号称将c++/c 转化成多种语言的拓展,包括不限于(js,tcl,python,lua,java,php,perl)等等等。其实也是类似上面的技术, 公开C函数和符号, 上层加上各种语言的数据包装调用。你如果选用了这个技术,就要忍受他的一些智能的傻逼的行为, 有时候转会造成内存泄漏,比如拷贝大块内存来做包装。

WebAssembly 会是 JavaScript 的末日吗?为什么?

这属于交叉领域的问题。两者关注的点不同,JS属于业务逻辑处理,wasm属于扩展库。完全没有可比性。最终wasm解决的是大型网络游戏,或者c/c++库的移植的方案。永远也取代不了JS。走的是NDK,ANE,SWIG的路子。最后你看这些类似的交叉编译技术SWIG方案,现在还有谁活着?有谁愿意为这些又复杂,开发周期又长,出bug搞死人的技术买单。早些年有把ffmpeg交叉到JS的,浏览器光下载就需要1光年。做好自己领域内的事情就好。

你是否看好 Web Assembly ? 为什么?
说实话,我不太看好。 这是个比较尴尬的技术,15年到现在我一直在用。
第一 定位的问题。 前端不太care这个,靠这个找不到工作。场景有限,除了游戏公司, 然unity3d早就支持了直接输出wasm了, 之前好像虚幻引擎也支持了一阵子。好像白鹭也支持,layaair不太清楚。

第二 学习成本高。 作这个需要对c++ 和 trans的sdk非常了解,web平台也需要了解,差异性很大,难精通 。内存模型不一致, 细节很多,搞不好也内存泄漏。

第三 频繁js交互性能差(可能会发光发热)。 很多人不理解说为毛性能差,不是c++写的吗,不是aot的吗? 比如说调用传参,一般都是堆栈机,js端是弱类型如何区分类型?这里就开始消耗资源了。js所有的类型都是一个number,c端获得后先知道我这个number对应是那种类型,func?int,float?还是复合的object。然后c端开始包装数据。类似还有直接压入2进制数据或者json字串的来做类似的事情, flash早期用xml来做,我现在记得很清楚command或者ExternalInterface的方法,这种性能更恶心。数据返回还需要将原始数据包装,在压回去或者返回后在JS端再包装,返回指针的,返回userdata的,返回二进制数据的。有时候c暴露的接口是某个数据结构类型,有的技术方案编译检查不严格还好说,一个二进制数据复合数据格式的就行,有的技术方案直接就是对不起我是静态类型,我不认识你扔过来的是什么东西。有的在中间做了过程比如luajit,你不认识?好办我先化化妆让你认识一下,你看你要的是这个不?除非你整个程序都是用这个技术来实现, 不然你很有可能会掉坑,花式掉坑。就是说除了对性能要求的极点,比如做游戏或者游戏引擎,整个架构都可以用c++来做 ,webgl和opengles,人家可以一体。然后的编译后的体积, 你要依赖的库
都要编译进来呀(。 而且这项技术限制很多: gc问题(互相引用的无法gc)dom操作目前是不可以的,调试(没错是调试),什么其他语言交叉编译到wasm那是噱头, 多一种语言多一堆人跳坑,他们的标准库就是巨大的坑,而且使用这些被阉割后的语言,你真觉得舒服吗?

第四 搞c,c++的最舒适的平台是linux,绝非web(这条是凑字数)。

关于JS的吐槽, 其实大家有个误解, 就是觉得js很慢。 其实不光js慢,所有语言如果没有良好的设计都会慢(这是另外的范畴),放在对的位置就行了, 用弹弓打飞机不合适吧,用原子弹大小鸟也不合适吧。

一直用的是cheerp那套方案。 对这套技术有兴趣的可以关注下 https://github.com/leaningtech ,没有最牛逼的技术,只有适合场景的技术。

相关文章
|
6月前
|
JavaScript 前端开发
JavaScript基础总结
JavaScript基础总结
27 0
|
4月前
|
存储 JavaScript 前端开发
Javascript基础
Javascript基础
86 0
|
8月前
|
存储 JavaScript 前端开发
JavaScript基础(1)
JavaScript 是 Web 的编程语言。 所有现代的 HTML 页面都可以使用 JavaScript。 本教程将教你学习从初级到高级 JavaScript 知识。
109 1
|
JavaScript 前端开发 开发者
JavaScript中的模块化开发
JavaScript中的模块化开发
|
JavaScript 前端开发 Java
JavaScript的基础使用
JavaScript的基础 一、javascript简介 JavaScript简称js,最初由网景(现在的Mozilla)公司创建,由于商标冲突原因,其标准版本命名为ECMAScript,但是一般人们还是叫JavaScript,只在谈标准的时候说到ECMAScript这个名字。值得注意的是JavaScript与java没有任何关系,就像雷峰塔(神话中镇压白娘子的塔)和雷锋。此外js(JavaScript)和jsp(java servlet pages)也没有关系。   js的工作分为两部分,一部分属于js语言本身的特性,而另一部需要依靠宿主环境(web浏览器)才能完成。 二、javascri
JavaScript的基础使用
|
JavaScript 前端开发 Java
你真的了解JavaScript基础吗?
你真的了解JavaScript基础吗?
74 0
|
存储 移动开发 JavaScript
一篇学完JavaScript基础
前言 学习Javascript也有好长时间了,遂把这一阶段的学习内容整理成笔记,巩固所学知识,同时也会参考一些博客,书籍上的内容,查漏补缺,给自己充充电🔋🔋 文章内容如有错误,欢迎指正批评✔️✔️
一篇学完JavaScript基础
|
存储 移动开发 JavaScript
JavaScript基础(下)
JavaScript基础(下)
130 0
JavaScript基础(下)
|
存储 JavaScript 前端开发
JavaScript基础(上)
JavaScript基础(上)
116 0
JavaScript基础(上)
|
存储 JavaScript 前端开发
JavaScript基础(中)
JavaScript基础(中)
114 0
JavaScript基础(中)