智能合约虚拟机

在了解智能合约虚拟机之前,我们先来看看两种不同的编程语言,一种是编译型语言,一种是解释型语言。这两者究竟有什么明显的差别呢?会影响到我们要讲的虚拟机。

首先,我们先解释一下两个术语,编译和解释。

何谓编译?编译指将目标语言编写的程序翻译成目标程序二进制文件的过程。

何谓解释?解释是运行时必需用解释器把程序一行一行执行,运行比较慢,因为是运行时才把程序解析并执行。优点是移植性,不同的机器只要有解释器就可以运行相同的程序。

这样我们就更容易理解编译型语言和解释型语言了。

编译型语言编写的代码,经过编译后,由机器直接执行;解释型语言编写的代码,先转换成通用字节码后再由虚拟机执行。

编译型语言编写的代码编译后因为可以直接执行,所以效率高,但和平台相关;解释型语言需要由虚拟机来执行,相当于间接由可执行程序来执行,所以肯定慢一些,但是因为虚拟机的间接性和封装性,可以做到跨平台。

那看看我们熟悉的Java语言呢?其实 Java 的代码并不是直接由虚拟机执行的,而是先编译转换成.class 的字节码文件,再通过虚拟机边解释边执行的。

那虚拟机对于解释型的编程语言,到底意味着什么呢?

虚拟机,复用硬件,虚拟出一个机器,具备实体机器的基础功能。虚拟机作为物理机与中间代码的桥梁,作为物理机的代理,使用物理机的CPU及其他计算存储资源,实现中间代码的执行。于解释型程序而言,虚拟机实现了一个解释器中的执行器。

要实现虚拟机,一般都需要设计一套字节码。虚拟机作为执行器,执行对象主要还是中间代码,而不是源码。

那回到智能合约虚拟机,智能合约支持的语言有多种,那虚拟机是不是也要有多种呢?的确是的。针对一类智能合约语言,应该有与之对应的一类虚拟机,只有匹配的虚拟机才能正确执行智能合约程序。

我们已经知道,智能合约编程语言主要有Solidity、Go、Rust、C++、Node.js、Java、TinyGo、Move、Vyper等,那这些编程语言对应的虚拟机都是什么呢?

Solidity的虚拟机是EVM。Solidity 是合约的执行语言,Solidity 被 solc 编译后,变成类似于汇编的 EVM 指令。EVM 是一个状态执行的机器,输入是 Solidity 编译后的指令和节点的状态数据,输出是节点状态的改变。

Vyper的虚拟机也是EVM。Vyper 是一种应用于以太坊虚拟机上的面向合约的 python 风格的编程语言。Vyper 代码编译成字节码后在 EVM 上运行。

长安链下Go的虚拟机是DOCKER_GO。使用Go语言编写智能合约时,必须提前部署和运行Docker_VM虚拟机,以支持Go语言合约的执行。长安链下Rust的虚拟机是WASMER。

Move的虚拟机是Move VM。Move VM 执行以 Move 字节码表示的交易。

额......

总之,每一类语言都需要执行的虚拟机环境。针对编程语言和字节码语言都相同的语言,其虚拟机大概也是相同的底层,不过可能命名不一样罢了。