首先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程序员,框架的力量有多厉害,可谓得程序员者得天下。
山不转水转,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 (简称 wasm ) 是一种适合于编译到 Web 的, 新的可移植的, 大小和加载时间高效的格式. 这