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 ,没有最牛逼的技术,只有适合场景的技术。

相关文章
|
jenkins Java Linux
Linux(centos 7.5)安装Jenkins
Linux(centos 7.5)安装Jenkins
422 0
|
消息中间件 人工智能 监控
从传统家电到智能生活,海尔智家的服务治理实践
海尔与阿里云的合作不仅推动了自身的技术革新和服务升级,更为整个智能家居行业树立了典范。在未来的发展道路上,双方将继续携手共进,共同迎接 AI 时代的到来,为全球用户创造更加美好的智慧生活。
1160 111
|
缓存 前端开发 JavaScript
Webpack 动态加载的原理
【10月更文挑战第23天】Webpack 动态加载通过巧妙的机制和策略,实现了模块的按需加载和高效运行,提升了应用程序的性能和用户体验。同时,它也为前端开发提供了更大的灵活性和可扩展性,适应了不断变化的业务需求和技术发展。
|
人工智能 安全 新能源
祝贺!零跑汽车交付超40万台 ,携手阿里云打造新一代智能座舱
祝贺!零跑汽车交付超40万台 ,携手阿里云打造新一代智能座舱
849 10
|
数据采集 网络安全 文件存储
快速部署 OpenFOAM 社区版
OpenFOAM(Open Source Field Operation and Manipulation)是对连续介质力学问题进行数值计算的软件。可进行数据预处理、后处理和自定义求解器,常用于计算流体力学领域。本文介绍如何通过计算巢快速部署OpenFOAM社区版服务。
快速部署 OpenFOAM 社区版
|
机器学习/深度学习 人工智能 自然语言处理
Element UI【级联选择器】el-cascader 获取选中内容的 label 数据,鼠标悬浮显示超长内容
Element UI【级联选择器】el-cascader 获取选中内容的 label 数据,鼠标悬浮显示超长内容
2411 3
|
SQL 存储 关系型数据库
Hive 和 HDFS、MySQL 之间的关系
Hive是Hadoop上的数据仓库工具,用HiveQL进行大数据查询;HDFS是分布式文件系统,用于存储大规模数据,常与Hive结合,提供数据存储和高可靠性。MySQL是RDBMS,适用于结构化数据管理,在大数据环境里可存储Hive的元数据,提升查询效率和元数据管理。三者协同处理数据管理和分析任务。
1421 0
|
SQL 存储 关系型数据库
【MySQL】DDL的表操作详解:创建&查询&修改&删除
【MySQL】DDL的表操作详解:创建&查询&修改&删除
|
存储 消息中间件 监控
SpringCloud Alibaba常见组件
Spring Cloud Alibaba是一套基于Spring Cloud的微服务解决方案,它集成了多个常见的组件,每个组件都有特定的功能和用途。以下是Spring Cloud Alibaba的常见组件及其解决的问题:
3654 0