在2019年,智能合约无疑是 计算机 编程中的新范式转变。 本指南旨在成为创建在分散式区块链中部署和运行的计算机程序的入门途径。
一段历史…早在1950年代,在计算的早期,如果您想编写一段代码来执行一个简单的求和运算(考虑到Motorola 6502 8位 CPU ),您将最终 像这样:18 A9 01 69 02 85 31 F6
上面的十六进制数字表示CPU可以理解以执行操作的机器语言。
CPU有一个“指令集”,这意味着每个数字都是一个导致处理器执行操作的命令:加,减,除,乘,加载, 存储 ,跳转等。
程序员需要记住操作代码,从而记住哪个数字相当于哪个命令。效率不高。
很快,很明显,需要一种更人性化的方法。 这是创建高级语言的运动的开始,高级语言看起来更像口头语言。
因此,首先出现了被称为助记符的东西:
CLC
LDA #$01
ADC #$02
STA $31F6
对于每个计算机操作代码,现在都有一个相关的单词或符号有助于理解。因此,CLC(清除进位)等于18、LDA(负载累加器)为A9、ADC(加进位)为69、STA(存储累加器)为85。
这种编程方法被称为汇编语言,它是简化编程的第一步,使程序员摆脱了繁琐的任务,例如记住数字代码。
上面的程序清除进位,将值01加载到累加器中,将02加到累加器中,然后将结果数存储在 存储器 地址31F6中。 现在以一种更容易理解的方式供人类理解。
随着时间的流逝,新的工具被创造出来以提高编程效率,因此开发环境发生了很大的变化。 高级语言一词出现了。
这意味着编程语言的等级越高,它与人的口头语言越相似。 同样底层语言是更接近计算机指令集本身的语言。
与计算机语言的这种发展同时,在此过程中发生了一些范式转换。
首先将计算机程序直接注入到内存地址中,然后需要告知计算机程序将开始执行的位置。 这是原始的机器语言计算机代码,就像本文开头显示的那样。
随着助记符的出现,我们创建了所谓的汇编器-一款负责解码人类可读助记符,将其转换为机器语言代码,将其注入正确的内存地址并告诉CPU启动的软件。
尽管这对编写和调试软件有很大帮助,但它仍然适得其反。 我们需要一种更简单的编程方法。
“ B ASIC ”语言
初学者的通用符号指令代码(BASIC)是发明于1964年的第一款高级,人性化的计算机语言,其目标是易于使用。
常见的BASIC程序如下所示:
10 A = 1
20 B = 2
30 SUM = A + B
40 PRINT(SUM)
RUN
在BASIC语言中,由序号(10,20,30,…)标识的每一行都存储一个命令。 这些命令将依次运行,一次运行一次,然后下一次运行。
当用户在计算机屏幕上键入命令RUN时,程序将执行。 在这里,我们有了第一个编程范例转变。
有一种叫做解释器的东西,它的功能是将代码的每一行实时转换为机器语言的等效代码,然后执行它。
另外,请注意,命令现在由一个英语单词(例如print)表示。CPU 寄存器 (例如累加器)和存储器地址被变量替换。 这样编程变得容易得多!
BASIC尽管是一种功能非常强大的高级语言,但执行起来太慢,因为解释器需要将所有内容实时转换为机器语言。
这需要解决。
编译语言
再次发生了范式转换,为我们带来了当今我们所知的编译语言。
编译意味着我们现在在执行计算机代码方面又迈出了一步。编译器是一款软件,可以将高级语言编写的程序转换为完全机器语言,但不能实时转换(例如BASIC)。
相反,用户必须等待该过程完成。最后,当程序被转换(编译)并可以运行时,用户要求启动可执行文件。
区别在于它的运行速度比旧的解释程序要快得多-生产率更高且节省时间。另一个潜在的好处是可执行文件无需源代码即可共享,从而避免了版权问题。
这是一个新时代的曙光,许多编译语言在生态系统中蓬勃发展。
一些示例:Ada,ALGOL,SMALL,Visual Basic,PureBasic,C,C ++,Objec ti ve-C,Sw if t,D,C#(to by te code), Java (to bytecode),CLEO,COBOL,Cobra,Crystal,eC,Eiffel, Sather,Ubercode,Erlang(to bytecode),F#(to bytecode),Factor(更高版本),Forth,Fortran,Go,Haskell,Haxe(to bytecode或C ++),JO VIA L,Julia, LabVIEW ,G,Lisp,Common Lisp ,Lush,Mercury,ML,Alice,OCaml,Nim(针对C,C ++或Objec TI ve-C),Open-URQ,Pascal,Object Pascal,Delphi,Modula-2,Modula-3,Oberon,PL / I,RPG ,Rust,Seed7,S PI TBOL,Visual Foxpro,Visual Prolog,W,Zig以及许多其他许多…
软件继续发展。 并且,正如1960年代初期一些计算机科学家(即艾伦·凯和伊万·萨瑟兰德)所建议的那样,实施了一种新的系统开发方法,以便计算机程序可以更好地代表我们的现实世界。
面向对象编程(OOP)诞生了。另一个范式转移。
现在,我们有了类和方法的概念:
class Math()
{
method sum(op1, op2)
{
return op1+op2;
}
method subtract(op1, op2)
{
return op1-op2;
}
method mul TI ply(op1, op2)
{
return op1 * op2;
}
}
M ai n:
Math myMath = new Math(); # Instan TI ates an object of class Math.
Integer mySum = myMath.sum(1, 2); # Calls a method f rom Math class.
System.out.println(mySum); # Outputs the result.
尽管我们已经看到了所有这些新的,丰富的,不同的软件交付方法以及如何设计体系结构,但还是有一样:在将代码编译成机器语言后,它取决于特定的CPU。
换句话说,在IBM PC上创建的软件将无法在Apple计算机上运行,因为每个人都有一个带有不同指令集的不同处理器。
互操作性
另一个范式转变为我们带来了所谓的互操作语言,例如Java和.NET。
这背后的想法很简单:创建一个中间(虚拟)指令集,并将程序的源代码编译为中间指令集。
然后,在每个计算机家族中,您将拥有一个特定的编译器/解释器,从这些中间指令到每个计算机品牌的特定指令集。一种“两步编译器”形式,可以共享一组通用指令。
这套中间指令集称为字节码。字节码在JVM(Java虚拟机)或CLR(公共语言运行时)上运行。这样就可以一次编写一个程序,然后在任何地方运行它(这是Sun Mi crosystems for Java创建的口号)。
尽管在每个计算机都是孤立的世界中,计算机语言和软件体系结构的这种演变是有意义的,但我们很快就开始通过网络连接设备。
网络协议的诞生是为了允许机器之间通过电子通信通道进行通信。
1989年, TI m Berne rs -Lee发明了万维网。 现在该软件需要通过网络分发,我们不知道连接了哪种类型的计算机。
创建了解决该问题的新标准,并将客户端-服务器体系结构引入了编程语言。这种方法认为计算机软件现在将驻留在服务器上,该服务器将根据某些请求将信息传递给客户端。
这种新的范式转变完全改变了我们使用软件和编程的方式。我们必须注册在线托管服务才能发布我们的软件。然后,将该软件每天24小时上传到服务器,以响应用户的请求。
上面的段落描述了Internet和客户端服务器软件的最新时代。它完全改变了我们所知道的世界,并由此改变了我们生产,分发和使用计算机程序的方式。
尽管好处是毋庸置疑的,但它仍然是基于集中化的环境,容易受到攻击,检查和失败的影响。 该软件取决于服务器是否始终在线。
即使通过使用计算机网络云解决了性能和可伸缩性问题,它仍然存在中间人的问题–中间人。
中介通常会给您带来障碍,并给通用共享解决方案的用户带来麻烦。 这可以是高额费用,执照,地区规则,政府审查制度的形式; 总会以某种方式伤害消费者。
为了一个自由的世界,越分散越好。尽管区块链本身的成本和可扩展性仍然远远低于其对应的区块链,但通常在出现破坏性技术时,消费者获得解决方案的成本会急剧下降。
举个例子,想想现在用 比特币 给另一个国家的亲戚汇款是多么便宜和容易。
新时代
我们正处于一个新时代的开始–分散式区块链时代。 有人可能将其称为Internet 3.0。
这是我们最近的模式转变,随着智能合约的出现,为我们带来了一种创建计算机软件的新方式。
智能合约是在分散环境中运行的程序。它们是破坏性技术,因为它们消除了某些现实世界过程中对中间人(中间人)的需求,从而使其更便宜,更易访问且更高效。
适用于被智能合约取代的常见应用:保险,遗嘱,定期付款时间表,医疗保健计划, 自动驾驶 汽车经济,游戏,财产交换,资产代币化,抵押,投票等。
发布智能合约时,其副本将驻留在世界各地的每个区块链服务器上。而且正如程序员在引入面向对象的体系结构时曾经不得不改变他们创建软件的方式一样,我们现在必须再次适应这种新方法。
您将无法在智能合约中进行股票期权Black-Scholes公平价格计算,这不是要进行的事情。
结论
本文是该系列文章的第一部分,旨在通过一个完全在线的环境IDE,使用基于 Python 的语言来讲解智能合约编程的基础知识,该IDE允许在区块链中编辑, 测试 ,调试和运行智能合约。
在本系列的第二部分中,我们将针对那些已经具有计算机编程经验但有逐步的简单示例的用户,开始一种务实的方法。
最后,您将能够有能力对智能合约进行编码。
责任编辑:ct