WebAssembly的前世今生

最近由于ICO很火,很多朋友后台留言或者加我好友问很多问题,特别是在很多白皮书中出现的一些专有名词,看起来很高大上,其实原理还是比较简单的,今天说说很多人问的WebAssembly

首先WebAssembly不是区块链范畴的技术,属于浏览器前端技术,估计是那个写白皮书的把以太坊EVM里面EVM2.0提到的性能提升WebAssembly实现展望学了进去。

计算机语言的发展

诚然,目前区块链很多技术发展非常快,基本上用到了目前业界正在测试和评估的很多前沿技术,WebAssembly就是其中之一,WebAssembly其实是多家主流浏览器厂商竞争后的妥协,从字面理解可以看做是“Web的汇编语言”,要了解汇编语言需要你有计算机专业的学习背景,简单来说汇编语言可以理解为机器可以直接执行的代码,或者叫做字节码,或者“机器语言”等等,其优点是执行效率非常快,基本上属于指令集范畴,当然其缺点是可读性和代码编写非常困难,所以人们发明“高级程序语言”让代码编写和阅读更符合人类的逻辑习惯,C/C++/JAVA等你能熟知的都是属于高级语言范畴,当然机器是无法识别高级程序语言的,所以人们发明了“编译器”,通过编译器把高级程序语言转化为汇编语言,让机器可以执行,现在你知道所谓程序语言的来龙去脉了吧。

在计算机语言的发展过程中,有两大发展方向,一个是解释型语言,一个是编译型语言。最早的Basic语言是解释型语言的代表,因为解释型语言可以逐条执行,不要编译过程,所以设计简单,非常适合简单的程序逻辑环境,所以后期一般把解释语言成为“脚本语言”,现在流行的javascript语言从字面就可以知道这是一种脚本语言,但是,由于当时的CPU运算能力限制,解释型语言的效率不是那么好,应用面比较小,其优点是可以很容易修改和执行。


而编译型语言可以通过编译器直接将大量高级语言代码一次性编译成机器码,所以最终的执行效率非常高,在Web应用没有大发展时,基本上主流语言是编译型语言的天下。


但是就像衣服和鞋帽的流行时尚一样,过了那么几年,总要转回去一样,随着互联网的发展,大量的Web应用涌现,CPU效率的提升,解释语言的效率弱点被硬件的发展掩盖,于是乎PHP/ruby/javascript等解释语言重新崛起,其易于编写和实时修改不需要编译就可以执行的特点被放大,所以大量应用开始使用解释语言进行编写,包括一些非常复杂的逻辑应用。


其中以javascript为最(以下简称js),其实从语言本身上来说js是非常垃圾的语言,没有强类型,约束也不严谨,效率也不好,最初就是为浏览器设计的简单脚本语言,但就是这个原因,由于web应用的发展,js一跃成为事实的标准,各种js框架的发展在一定程度上弥补了js语言本身的不足,比较著名的有node.js,使用这个框架居然可以编写本地和服务端应用,这本来都是传统编译型语言的阵地,可见为了照顾大量js程序员,框架的力量有多厉害,可谓得程序员者得天下。

WebAssembly的诞生

山不转水转,js因为是浏览器默认的语言(最早微软的IE可以执行Basic语言),所以js得到了很大的发展,但是因为其出身问题,效率低下其实是所有浏览器厂商知道的,比如进行MD5等加密运算,大量的图形处理等,只能勉强应付。最早发现并尝试解决这个问题的是adobe公司,他们开发了flash插件(微软搞过Silverlight),扩展了浏览器功能,所以你能见到很多用flash开发的网页游戏应用,由于adobe不是浏览器厂商,同时flash被设计成为插件机制,安全性存在很多问题,更为主要的是flash是商业产品,当时乔布斯大神都很抵制,主流浏览器厂商迫切需要一个开放的标准,于是乎HTML5诞生了,HTML5解决了很多浏览器的功能和性能标准问题,但是HTML5仍然沿用了js作为主要语言,这样问题就出来了。

性能问题仍然没有得到很好的解决,比如你无法在HTML5应用中看到主流的3D游戏等等,所以各大浏览器厂商开始乱搞,纷纷开始尝试在浏览器中实现编译型语言的机制,以此提升效率,期间Mozilla在推asm.js,谷歌支持PNaCI,苹果在开发FLTJIT,而微软好像在发呆没有推出任何东西。而后来,所有四个主要的浏览器供应商一致同意创建一种面向Web的二进制格式WebAssembly或WASM。可以简单将其称为字节码,由于运行于浏览器容器中,它并不是传统意义上的机器字节码,实际上是一个经过压缩的AST编码(AST是语法抽象树的意思)。

就这样WebAssembly诞生了,它就是为解决性能瓶颈而设计的东西,如果用在区块链上可以提升基于Web的Dapp性能,但是如果不用在Web应用上,我不知道为什么要用它,不如直接使用C语言本地代码来的快,特别是在专业环境中的EVM虚拟机中,所以以太坊在EVM2.0中要使用WebAssembly这点上是值得商榷的,更别提那些只知道堆砌名词的ICO白皮书中去学以太坊中利用的技术,更值得深入探讨了。

WebAssembly简介

WebAssembly (简称 wasm ) 是一种适合于编译到 Web 的, 新的可移植的, 大小和加载时间高效的格式. 这是一个新的平台无关的二进制代码格式,  目标是解决 JavaScript 性能的问题. 这个新的二进制格式远小于 JavaScript, 可由浏览器 的 JavaScript 引擎直接加载和执行, 这样可节省从 JavaScript 到字节码, 从字节码到执行前的机器码所花费的及时编译 JIT (Just-In-Time) 时间. 作为一种低级语言, 它定义了一个抽象语法树 (Abstract Syntax Tree, AST) , 开发人员可以以文本格式进行调试.

WebAssembly 描述了一个内存安全的沙箱执行环境, 可以在现有的 JavaScript 虚拟机中实现. 当嵌入到 Web 中时, WebAssembly 将强制执行浏览器的同源和权限安全策略. 因此, 和经常出现安全漏洞的 Flash 插件相比, WebAssembly 是一个更加安全的解决方案.

WebAssembly 可由 C/C++ 等语言编译而来. 此外, WebAssembly 由 Google, Mozilla, Microsoft 以及 Apple 牵头的 W3C 社区组共同努力, 基本覆盖主流的浏览器厂商, 因此其可移植性相较 Silverlight 等有极大提升, 平台兼容问题将不复出现.

在 Web 平台的很多项目中, 对于原生新功能的支持需要 Web 浏览器或者 Runtime 提供复杂的标准化的 API 来实现, 但是 JavaScript API 往往较慢. 使用 WebAssembly, 这些标准 API 可以更简单, 并且操作在更低的水平. 例如, 对于一个面部识别的 Web 项目, 对于访问数据流我们可以由简单的 JavaScript API 实现, 而把面部识别原生 SDK 做的事情交由 WebAssembly 实现.

需要了解的是, WebAssembly 不是将 C/C++ 等其他语言编译到 JavaScript, 更不是一种新的编程语言

下图比较好的描述了WebAssembly的结构

WebAssembly的前世今生

由于WebAssembly是目前正在发展的技术,不是专业人员可以不用仔细了解其中的主要原理,本文旨在科普一下,今后您在遇到白皮书中提到这个名词有个感性的认识,如果对这方面感兴趣,推荐阅读更为专业的资料,或者直接看W3C相关标准定义。

本文来源于互联网:WebAssembly的前世今生

原创文章,作者:酷毙编辑,如若转载,请注明出处:http://www.dailybtc.cn/webassembly%e7%9a%84%e5%89%8d%e4%b8%96%e4%bb%8a%e7%94%9f/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

邮件:[email protected]

工作时间:周一至周五,9:30-18:30,节假日休息

QR code