EOS 新增的 WebAssembly 解释器,是什么鬼?

Daniel Larimer 在最近的博客中透露,EOS 新增了官方的 WebAssembly 解释器,用来解释执行 WebAssembly 智能合约,加上之前的编译执行,EOS 智能合约有了两种执行方式。

对于很多没有中间语言的(字节码)的编程语言来说,根本不存在解释执行与编译执行的选项,比如传统 C/C++ 只能编译执行,直接将代码编译成为可执行的二进制机器码,我们电脑上 .exe 文件就是编译的成果。再比如 python 和 javascript 只能解释执行,用户拿到的就是原始的代码,解释器会像翻译员一样,一行一行地执行代码。

为什么 WebAssembly 智能合约有两种执行方式?因为 WebAssembly 类似 java,会生成中间语言:字节码,字节码既可以编译成机器码后执行,又可以使用解释器直接执行。中间语言赋予了 WebAssembly 灵活的执行方式。这就是为什么 EOS 的智能合约不能直接上传 c++ 文件,而是需要上传编译后的 .wasm 文件,这就是 WebAssembly 的中间语言(字节码)。

编译执行的优点是执行速度快,但缺点是每次智能合约有更新时,见证人的服务器都要重新编译生成二进制机器码,对于执行次数不多的智能合约,是不划算的。解释执行正好相反,不需要提前编译,但执行时速度比编译执行慢很多,Daniel 说速度仅仅是原来的20%,也就是比原来慢5倍,不过 Daniel 还说明,WebAssembly 在整个智能合约执行中只占很小的一部分,对于真正系统性能的影响大约在 5%。

所以折腾了半天,效果还没有原来好吗?Daniel 说,引入 WebAssembly 的官方解释器是给智能合约的结果提供了一个权威参考,当各个见证人的编译执行结果不一致时,就可以使用解释器得到参考结果。而且解释器也会给编译执行做后补,以防 WASM 编译器出问题时维持系统稳定。

目前来看,不论是 EOS 系统,还是 WebAssembly 技术 都还在快速发展阶段,还没有针对性能做更细致的优化,我认为 WebAssembly 可以参考 Java 的 JIT(Just In Time) 技术,对高频执行的代码进行编译优化,对低频代码直接解释执行。不过鉴于 WebAssembly 并不是系统性能的最主要瓶颈,现在看来这方面的需求并不迫切。

参考文献:

1. EOSIO Development Update

https://medium.com/@bytemaster/eosio-development-update-272198df22c1

2. WebAssembly/binaryen

https://github.com/WebAssembly/binaryen

3. 编译中的一些事儿(讲解主流的编译技术,包括WebAssembly)

http://blog.csdn.net/qq_33280027/article/details/69944498

4. 几张图让你看懂WebAssembly

http://www.sohu.com/a/141587149_464084

圆方圆区块链汇集大批区块链名师,采取导师值班制,为学员实时解决技术疑难。请关注圆方圆区块链知识星球与导师。(培训咨询请联系船长13826054890微信手机同号)

作者小笛 ,专注于 EOS 技术研究与区块链智能合约开发.是圆方圆区块链的导师,更多小笛老师的文章和视频请关注圆方圆链圈公众号。

原文地址:http://blog.51cto.com/13625500/2107544

时间: 2024-11-09 17:19:43

EOS 新增的 WebAssembly 解释器,是什么鬼?的相关文章

PhpStorm 配置 PHPUnit

配置说明 全局安装phpunit代码 composer global require phpunit/phpunit 该代码会自动保存在 /User/你的用户名/.composer/vendor/phpunit 全局安装phpunit命令脚本 从上一步安装结果可以得知当前环境PHP版本可兼容的phpunit的版本,我这里的PHP是5.6的,最大可兼容phpunit5.7 wget https://phar.phpunit.de/phpunit-5.7.phar chmod +x phpunit-

设计模式是什么鬼(解释器)

原文链接:https://www.javazhiyin.com/24976.html 解释,一定是针对某种语言的拆解.释意,并按照文法翻译.转换成另一种表达形式以达到目标能够理解的目的.比如我们都知道Java编程语言是人类可以理解的语言,程序写好后要先进行编译生成字节码(class文件),然后对此文件解释成机器码,最终机器才可以理解并执行,这就是解释器存在的意义. 就拿我们人类的自然语言来举例,比如我们要进行英文翻译工作,首先要对一句话(表达式)进行拆解,而拆开后的单词就成了不可再分的终极表达式

PHP5.2至5.6的新增功能详解

截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注].因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征. PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数

LINUX服务器上新增用户名

最近所里的机群停了,需要用老板的服务器跑程序,这里首先得在老板的服务器上新增一些用户名.新增用户名方法如下: 1.利用useradd添加用户名,并指定用户名目录.脚本解释器.用户名 sudo useradd -d /home/kx   -m -s "/bin/bash"  kx 这里用户名为kx,用户对应目录为:/home/kx ,脚本解释器采用的是/bin/bash 2.修改kx的密码 sudo passwd kx 3.为了远程登录,需要进行一些配置 sudo vi /etc/ssh

设计模式的征途—23.解释器(Interpreter)模式

虽然目前计算机编程语言有好几百种,但有时人们还是希望用一些简单的语言来实现特定的操作,只需要向计算机输入一个句子或文件,就能按照预定的文法规则来对句子或文件进行解释.例如,我们想要只输入一个加法/减法表达式,它就能够计算出表达式结果.例如输入“1+2+3-4+1”时,将输出计算结果为3.像C++,Java或C#都无法直接解释类似这样的字符串,因此用户必须自定义一套文法规则来实现对这些语句的解释,即设计一个自定义语言.如果所基于的编程语言是面向对象语言,此时可以使用解释器模式实现自定义语言. 解释

nonlocal(非局部变量)---python 3.x 新增关健词

Python里只有2种作用域:全局作用域和局部作用域.全局作用域是指当前代码所在模块的作用域,局部作用域是指当前函数或方法所在的作用域.其实准确来说,Python 3.x引入了nonlocal关键字,可以用于标识外部作用域的变量. 局部作用域里的代码可以读取外部作用域(包括全局作用域)里的变量,但不能更改它.一旦进行更改,就会将其当成是局部变量.而如果在更改前又进行了读取操作,则会抛出异常. 为了解决这个问题,Python 3.x引入了nonlocal关键字(详见The nonlocal sta

“字节序”是个什么鬼?

“字节序”是个什么鬼? http://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=2650652324&idx=1&sn=5502d3ab977b9894f50592266544b30c&scene=0 大端.小端引发的思考.论顺序的重要性1.做饭的故事今天女朋友加班,机智的她早已在昨晚准备好食材,回家只需下锅便可.谁知开会就是个无底洞,到了B1,还有B2,无穷匮也.辛苦如她,为了能让她一回家就吃上热腾腾的饭菜,我准备亲自下厨

Python 3.5发布:新增模块,性能优化,对开发者更友好

Python 3.5.0在9月13号正式发布,与3.4相比,有哪些让人期待的新特性呢? PEP441,优化Python对zip压缩包的支持.从2.6版本开始,Python支持将文件或zip形式的压缩包作为脚本执行,对于有必要作为一个文件发布又复杂到要分模块管理的应用来说,这个功能很实用.但是这个功能却鲜有人知,原因之一是当时没有很好地宣传,只在What's New中提到,没有写到文档中:原因之二是Windows没有为这种形式的文件(.zip)提供相应地Python扩展名(类似.py).所以这一次

自定义python startup脚本使交互解释器支持tab和删除键

python2.7中启动python解释器需要shift+del键才能删除,不支持backspace键,不支持tab补齐.反正用起来是非常的不方便.解决这个问题可以通过指定一个python startup脚本来解决. 第一步:新增PYTHONSTARTUP的环境变量 echo "export PYTHONSTARTUP=$HOME/.pythonstartup" >> /etc/profile 第二步:创建.pythonstartup脚本 cat >> $HOM