以太坊高级语言简介

EVM是一台虚拟计算机,运行一种特殊形式的 机器代码 ,称为_EVM 字节码_,就像你的计算机CPU运行机器代码x86_64一样。我们将在 [evm] 中更详细地检查EVM的操作和语言。在本节中,我们将介绍如何编写智能合约以在EVM上运行。

虽然可以直接在字节码中编写智能合约。EVM字节码非常笨重,程序员难以阅读和理解。相反,大多数以太坊开发人员使用高级符号语言编写程序和编译器,将它们转换为字节码。

虽然任何高级语言都可以用来编写智能合约,但这是一项非常繁琐的工作。智能合约在高度约束和简约的执行环境(EVM)中运行,几乎所有通常的用户界面,操作系统界面和硬件界面都是缺失的。从头开始构建一个简约的智能合约语言要比限制通用语言并使其适用于编写智能合约更容易。因此,为编程智能合约出现了一些专用语言。以太坊有几种这样的语言,以及产生EVM可执行字节码所需的编译器。

一般来说,编程语言可以分为两种广泛的编程范式:分别是声明式和命令式,也分别称为“函数式”和“过程式”。在声明式编程中,我们编写的函数表示程序的 逻辑 logic,而不是 流程 flow。声明式编程用于创建没有 副作用 side effects 的程序,这意味着在函数之外没有状态变化。声明式编程语言包括Haskell,SQL和HTML等。相反,命令式编程就是程序员编写一套程序的逻辑和流程结合在一起的程序。命令式编程语言包括例如BASIC,C,C++和Java。有些语言是“混合”的,这意味着他们鼓励声明式编程,但也可以用来表达一个必要的编程范式。这样的混合体包括Lisp,Erlang,Prolog,JavaScript和Python。一般来说,任何命令式语言都可以用来在声明式的范式中编写,但它通常会导致不雅的代码。相比之下,纯粹的声明式语言不能用来写入一个命令式的范例。在纯粹的声明式语言中,没有“变量”

虽然命令式编程更易于编写和读取,并且程序员更常用,但编写按预期方式 准确 执行的程序可能非常困难。程序的任何部分改变状态的能力使得很难推断程序的执行,并引入许多意想不到的副作用和错误。相比之下,声明式编程更难以编写,但避免了副作用,使得更容易理解程序的行为。

智能合约给程序员带来了很大的负担:错误会花费金钱。因此,编写不会产生意想不到的影响的智能合约至关重要。要做到这一点,你必须能够清楚地推断程序的预期行为。因此,声明式语言在智能合约中比在通用软件中扮演更重要的角色。不过,正如你将在下面看到的那样,最丰富的智能合约语言是命令式的(Solidity)。

智能合约的高级编程语言包括(按大概的年龄排序):

LLL

一种函数式(声明式)编程语言,具有类似Lisp的语法。这是以太坊智能合约的第一个高级语言,但今天很少使用。

Serpent

一种过程式(命令式)编程语言,其语法类似于Python。也可以用来编写函数式(声明式)代码,尽管它并不完全没有副作用。很少被使用。最早由Vitalik Buterin创建。

Solidity

具有类似于JavaScript,C ++或Java语法的过程式(命令式)编程语言。以太坊智能合约中最流行和最常用的语言。最初由Gavin Wood(本书的合着者)创作。

Vyper

最近开发的语言,类似于Serpent,并且具有类似Python的语法。旨在成为比Serpent更接近纯粹函数式的类Python语言,但不能取代Serpent。最早由Vitalik Buterin创建。

Bamboo

一种新开发的语言,受Erlang影响,具有明确的状态转换并且没有迭代流(循环)。旨在减少副作用并提高可审计性。非常新,很少使用。

如你所见,有很多语言可供选择。然而,在所有这些中,Solidity是迄今为止最受欢迎的,以至于成为了以太坊甚至是其他类似EVM的区块链的事实上的高级语言。我们将花大部分时间使用Solidity,但也会探索其他高级语言的一些例子,以了解其不同的哲学。