WebAssembly 的介绍

2016-03-18 23:17:28 +08:00
 livecoding

WebAssembly 是最下一代的浏览器语言。终于将写在浏览器上的汇编语言变成了现实了。大家可以了解一下相关的工作。 同时也欢迎大家踊跃注册账号。

观看视频

7362 次点击
所在节点    程序员
28 条回复
bramblex
2016-03-19 02:16:58 +08:00
是下一代的浏览器目标语言……
yeyeye
2016-03-19 08:48:41 +08:00
你说是就是啦 我还说下一代浏览器语言是 php 呢
vanxining
2016-03-19 11:59:56 +08:00
JS 统一前后端的梦想要破灭?
wizardforcel
2016-03-19 19:33:05 +08:00
如果浏览器普遍支持 webasm ,其他语言也能编译成 webasm bytecode ,我估计就没人写 js 了吧。
youxiachai
2016-03-19 21:51:07 +08:00
@wizardforcel 我倒是感觉。。到了那时候。。写 js 的人。。已经非常得多了。。。具体参考 vb 。。。
wizardforcel
2016-03-19 22:41:58 +08:00
@youxiachai 为何不能参考 ios ? obj-c 到 swift ,大家都选了接受,而 swift1 和 2 差别也挺大的,大家也选择了拥抱变化。

除了 php 之外, js 恐怕是坑最多的语言,这样才有转型的动力。

而且都是前端,一个是移动一个是 web 。
YuJianrong
2016-03-19 23:02:46 +08:00
@wizardforcel 听到 JS 是除 php 之外坑最多的语言, C++笑了……

大家是不是还没搞懂 WebAssembly 是啥…… WebAssembly 其实是二进制的 JS 而已啊…… JS 要在 JS 引擎上跑需要 JS->ByteCode(类似)->机器码 这样的流程,那直接塞 ByteCode 就又快又小,这就是 WebAssembly 了。

所以这其实是相当于 JVM/.net 一样的东西,但是最后无论是哪个还是最早的那个语言(java/C#)用的人最多。

顺便其实浏览器早就普遍支持 asm.js 了,其他语言早就可以编译成 JS, 最后也没见哪个语言真的动摇了 JS 的地位呢……
youxiachai
2016-03-19 23:55:00 +08:00
@wizardforcel 其实。。举 ios 这个案例。。其实跟这个差得挺远的。。不过。刚想回复你的时候。。楼下已经有人回复了。。其实 WebAssembly 本质是一堆 ast 文本( https://medium.com/javascript-scene/what-is-webassembly-the-dawn-of-a-new-era-61256ec5a8f6#.2dp2i8g8n )。。然后干的事情好像汇编的样子。。实际上并不是真汇编。。就好比上面有人提到的 jvm 。。。
sagnitude
2016-03-20 00:27:28 +08:00
替代 JS 的各位
https://github.com/WebAssembly/design/blob/master/FAQ.md#is-webassembly-trying-to-replace-javascript
https://github.com/WebAssembly/design/blob/master/FAQ.md#is-webassembly-only-for-cc-programmers

web 开发只有 JS 的现状很好,没有必要整其他语言,只会让局面变混乱
webassembly 只是为了加速计算密集的模块

@wizardforcel JS 一直在变化,现在的情况下, web 只有 JS 一个语言,都已经这么混乱了,举个例子,如果现在 objective-c 那边有人出了一个 obj-c 2.0 ,你觉得会怎么样?
而且 iOS 开发的标准,只有苹果有发言权,哪怕 swift 不好用, bug 一堆,苹果依然能宣布 xcode x.0 工具链不支持 objective-c ,并且 AppStore 只接受 swift 开发的 app
web 的标准是大家一起维护的,如果连一个语言标准都无法维持了,那就真乱成一团了
wizardforcel
2016-03-20 09:34:47 +08:00
@YuJianrong 我觉得拿 js 当中间语言的人,也就是写 ts 或者 coffee 的人,不算“真正使用” js 。

就好比你的程序最终要编译成汇编才能执行,你能说你用汇编写程序吗?

之前 js 地位不动摇是因为它是浏览器唯一指定的脚本语言。现在有 webasm 了。

@sagnitude

我不知道你有什么动机不接受类型安全,而且有 class 语法糖的 ts 。
wizardforcel
2016-03-20 09:45:28 +08:00
唯一的问题就是考虑到兼容性,还是支持直接嵌入 js 文本这种方式,那么还是可能有人为了图省事,愿意按照老方法写 js ,因为 js 可以直接写,其他语言都需要编译。不过这也是没有办法的事,不兼容的话现有的页面就都没法正常显示了。

假设 js 和 ts 都需要编译成 webasm 才能运行,我相信只要是对技术有点追求的人都不会选择 js 吧。我是这个意思。
sagnitude
2016-03-20 10:45:07 +08:00
@wizardforcel 我的理由是:因为 js 一直在变化。 class , import 都已经在 ES6 里出现并在浏览器中获得支持; ES7 连 int float 都有了

1. 像 coffeescript 或者 underscore 这种工具,只要对语言有利的,大家都会使用的功能, JS 就会整合进去
我写过一段时间的 coffeescript ,最终放弃了,因为下一代 JS 已经吸收了一些重要特性(语法上的)。

2. 而 TS 和 Coffee 不是编译成 webasm 去运行,而是转译成 javascript 去执行,引擎运行的依然是 javascript ,不是 webasm ,只是增加了一个运行和调用 webasm 功能的模块

3. 另外, webasm 设计目标是提供类似于 nodejs c++ extension 的功能,上面我贴的链接里也提到了,“让 javascript 代码 import C++模块像引入 javascript 模块一样方便”

4. 至于类型安全,我想了一下,首先我认为 JS 已经很慢了,加类型检查不好;另外,我不想在浏览器里写 java , javascript 是动态的,写起来很灵活,我很享受这一点;况且,现在我可以选择 C++编写模块了,重载的功能不会也不应该使用 js 编写,作为一个粘合语言,还有什么地方需要类型安全呢?
wizardforcel
2016-03-20 11:01:49 +08:00
@sagnitude

1. 的确。。 es6 和 ts 的区分度已经不大了。那么,如果 webasm 支持 python ,你更倾向用哪一个呢?

2. 之前由于没有 webasm ,也就没有字节码,这东西必然要编译成 js 。但是现在, webasm 的出现提供了其他语言直接编译成字节码的可能性。我相信微软为了扩大 ts 的影响力,一定会这么做。就算微软不做,三方的团队也会做出解决方案。

3. webasm 的设计目标?谷歌微软苹果都想在浏览器中运行自己家的语言,于是就推了个字节码,然后他们自己家的语言可以编译成字节码来运行。当然这种方案是兼容 js 的,因为 js 也能编译成字节码。

4. js 带上 jit 不慢。(当然也有部分情况比较慢)。

http://my.oschina.net/kaixindewo/blog/49956
jesse_luo
2016-03-20 12:03:56 +08:00
@sagnitude 说真的, Objective-C 现在就是 2.0 ……
YuJianrong
2016-03-21 00:34:35 +08:00
@wizardforcel 你还是没搞懂我在说什么。

我说其他语言早就可以编译成 JS ,说的不是 TS/CoffeeScript 这种方案,而是早就有的 emscripten 这种把 LLVM Bytecode 编译成 JS 的方案。

现在的 webasm 实现,其实也是一样用 emscripten 编译成二进制 JS ,和 emscripten 编译成 asm.js 格式的 JS 一模一样,提高的是传输大小和 parse 时间,也就是说如果你只是把几百 K 的 C++项目编译成 JS 来跑的话,没有 webasm 也是一样的(几百 K 的 JS 大小和 parse 时间不成问题),但好几年过去了我没见到这种方案有动摇 JS 地位的可能。

然而如果你要做的是几十 M 的大项目,确实上 webasm 能得到可观的提高,但问题是……你真的会把几十 M 的大项目用 web 方式来做么……再怎么提高,几十 M 的二进制包还是需要很长的时间才能载入的……

所以其实 webasm 一开始出现的时候我就觉得这东西意义不大的。
YuJianrong
2016-03-21 00:39:16 +08:00
@wizardforcel 顺便再重复一下,“之前 js 地位不动摇是因为它是浏览器唯一指定的脚本语言。现在有 webasm 了。 ”——这个观点的错误在于 webasm 其实还是 JS ,只不过是二进制的 JS 而已,其他语言编译成 webasm 和编译成 asm.js 没有本质区别, webasm 带来的只有传输和 parse 的提升,没有在 feature 上有什么以前做不到现在能做到的改变……
tennix
2016-03-21 09:50:10 +08:00
@sagnitude 前端现状很好,只是表面上而已,看看前端技术变化就知道前端有多么糟糕了。前端混乱是因为 JS 设计上有问题,而且各大浏览器标准不统一,当然引入新的技术、语言肯定会在一定程度上增加混乱程度,技术过渡嘛

@YuJianrong
JS 发展到现在已经成了浏览器端的汇编,看看现在基本上主流语言都有所谓的 transpiler 将自身编译成 JS ,然而事实上 JS 并不能胜任这个职位:第一这是一门高级语言;第二这门语言设计上有太多的坑;第三运行性能很成问题。既然 JS 本身不能胜任,为什么不让浏览器真正支持"汇编"呢。如果其它语言能无痛转成浏览器能执行的"汇编",也就没多大必要使用设计不好、用起来蛋疼的 JS 了。

TS 和 CS 转 JS 效果当然很不错,因为它们本身就是在 JS 基础之上构建的(ts/cs 编译器都是 js 写的),但是你用其它语言的 transpiler 就会知道以 JS 为目标语言是多么痛苦了,生成代码庞大,语言自身的一些特性被阉割。 ES 的确在不断演化,变得也越来越好用,然而现在大家不也都是需要将 ES6/ES7 编译到 ES5 才敢往线上放么。 JS 是一门很高级的语言,不适合作为汇编使用,只有出来一个低级底层一点的语言,其它语言才可以无痛 compile/transpile 到这个目标语言。

没记错的话 asm.js 只是 js 的一个子集,而且似乎并不是一个标准, mozilla 最先搞的,其它厂商并不一定买帐,而 webassembly 则是各大浏览器厂商共同制定标准。

有了 webassembly 这种格式,以前可能需要十几兆甚至更大的 JS 才能实现的功能,以后经过编译优化可能只需要几百 k ,性能也会有很大提升,所以以前写 JS 不敢想象的东西和功能,以后 webassembly 就变得现实。

说这么多其实我并不是前端,也没写过几行 JS ,上面只是基于个人的一些认识,至于未来是否就是 webassembly 统一前端也只有时间能说明了
sagnitude
2016-03-21 10:40:27 +08:00
@tennix 前端环境现在已经很好了,至少我现在已经把 IE10 以下的兼容性代码都干掉了…之前想都不敢想

console 不存在、 JSON 不存在、 XHR 需要兼容各种类型、判断千奇百怪的 UA ,连 hasOwnProperty 都不能直接用, requestAnimationFrame 也是坑爹货,等等等等

而现在我开发已经不需要考虑这些了,相比之前简直太幸福了
sagnitude
2016-03-21 10:43:05 +08:00
@YuJianrong 现在 webasm 还在早期开发,所以还在用 emscripten 编译,并且现在已经提供了一种直接编译的方法

https://github.com/WebAssembly/binaryen#cc-source--webassembly-llvm-backend--s2wasm--webassembly
wizardforcel
2016-03-21 10:48:02 +08:00
@YuJianrong

webasm 不是 js ,而是 webasm bytecode ,你也可以理解成 js bytecode 。就好比 java 和 java bytecode 一样,你能说这两个东西一样吗?单从长相上来说就不一样。如果你不懂编译和字节码这块,当我没说。

@tennix

同意。研究过逆向的人都知道, bytecode 实际上和高级语言是多句对一句的关系,语句之间的界限并不像汇编那样模糊。但是其效果就是比预处理(此处实话说真的不能叫编译)成 js 好的多。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/264611

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX