一、前言
区块链概念如今正被炒得火热,连带着区块链相关的词汇也被热烈得讨论着,什么去中心化、可溯源、智能合约、超级账本等等等等...同样的,在开发方面,区块链相关的开发语言也逐渐进入人们的视野,比如GO语言。下图是百度指数的统计结果,仅以最近30天的搜索结果来看,Go语言搜索数量在不断地增长。我们来讨论一下,为什么区块链选择了Go。
二、Go的发展历程
Google有一个项目叫做20%兼职项目,即相关员工利用 20% 的空余时间来做一些工作之外的研究项目,依照个人兴趣来选择项目。而Go语言正是诞生自这个20%项目。Go语言诞生自2007年,于2009年正式对外发布,领导项目的是三位著名的IT工程师:贝尔实验室Unix团队成员,参与Plan9、Inferno操作系统、Limbo编程语言的设计开发,Go语言项目总负责人:Rob Pike;参与开发Java HotSpot虚拟机的Robert Griesemer;C语言、Unix和Plan 9创始人之一、贝尔Unix团队成员:Ken Thompson,他还与RobPike共同开发了UTF-8字符集规范。
Go大事纪:2008 年年中,Ian Lance Taylor 加入团队并于 2008 年 5 月创建了一个 gcc 前端。Russ Cox 加入开发团队后着手语言和类库方面的开发,也就是 Go 语言的标准包。在 2009 年 10 月 30 日,Rob Pike 以 Google Techtalk 的形式第一次向人们宣告了 Go 语言的存在。2009 年 11 月 10 日,开发团队将 Go 语言项目以 BSD-style 授权(完全开源)正式公布在 Linux 和 Mac OS X 平台上的版本。同年 11 月 22 日Hector Chu 公布了 Windows 版本。2010 年 1 月 8 日:当选 2009 年年度语言2010 年 5 月:谷歌投入使用2011 年 5 月 5 日:Google App Engine 支持 Go 语言2014年,以太坊募集完成,开始进行开发。其中有多个团队开发了不同语言版本的以太坊区块链结构,最终,go-ethereum成为了以太坊的官方推荐......
三、Go的优势与区块链的选择
我们来看一下Go语言的特性演变:
Go语言的特性演变
虽然Go语言有时候被描述为“C类似语言”,或者是“21世纪的C语言”。Go从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。但从上图可以看出,不仅仅是C,Go语言吸收了诸多前辈语言的特性,诸多编程语言在40年的发展历程上诞生了无数的设计理念、架构、以及对各种复杂问题的解决方案,Go可以说是站在巨人肩膀上诞生的一个新兴语言。当然,我们也可以从Go中发现很多创新的设计。比如Go语言的切片为动态数组提供了有效的随机存取的性能,这可能会让人联想到链表的底层的共享机制。还有Go语言新发明的defer语句。
每一个编程语言被设计出来都是为了解决特定的问题,Go当然也不例外,Go语言项目是在Google公司维护超级复杂的几个软件系统遇到的一些问题的反思,设计Go语言是为了解决当时Google开发遇到的以下这些问题:
1、大量的C++代码,同时又引入了Java和Python
2、成千上万的工程师
3、数以万计行的代码
4、分布式的编译系统
5、数百万的服务器
其主要有以下几个方面的痛点:
1、编译慢
2、失控的依赖
3、每个工程师只是用了一个语言里面的一部分
4、程序难以维护(可读性差、文档不清晰等)
5、 更新的花费越来越长
6、交叉编译困难
为了解决上述的问题,Go具有了如下的一些特性:
1、没有继承的OO
2、强一致类型
3、Interface但是不需要显示申明(Duck Type)
4、Function 和Method
5、没有异常处理(Error is value)
6、基于首字母的可访问特性
7、不用的Import或者变量引起编译错误
8、完整而卓越的标准库包
Go语言的优势:
1、部署简单Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了。
2、静态类型语言,但是有动态语言的感觉
静态类型的语言就是可以在编译的时候检查出来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高。
3、并发性&通道
Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个 Go 应用也能有效的利用多个 CPU 核,并行执行的性能好。语言层面支持并发,这个就是Go的特色,天生的支持并发。
4、垃圾回收机制
内置runtime,支持垃圾回收,这属于动态语言的特性之一,虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况。
5、良好的语言设计
Go 非常简单,且易于学习。Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go关键字是25个,但是表达能力很强大,几乎支持大多数你在其他语言见过的特性:继承、重载、对象等。工程的角度讲,Go 的设计是非常优秀的:规范足够简单灵活。正是由于 Go 的简单性,任何的 Python、Elixir、C++、Scala 或者 Java 开发者皆可在一月内组建成一个高效的 Go 团队。
6、标准库&工具
Go目前已经内置了大量的库,特别是网络库非常强大。更重要的是 Go 自带完善的工具链,大大提高了团队协作的一致性。比如 gofmt 自动排版 Go 代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。把编辑器配置成在编辑存档的时候自动运行 gofmt,这样在编写代码的时候可以随意摆放位置,存档的时候自动变成正确排版的代码。此外还有 gofix, govet 等非常有用的工具。
7、内置强大的工具
Go语言里面内置了很多工具链,gofmt工具,自动化格式化代码,能够让团队review变得如此的简单,代码格式一模一样,想不一样都很困难。
8、跨平台编译,如果你写的Go代码不包含cgo,那么就可以做到window系统编译linux的应用,如何做到的呢?Go引用了plan9的代码,这就是不依赖系统的信息。
9、内嵌C支持,Go里面也可以直接包含C代码,利用现有的丰富的C库。
区块链的选择:
下图是区块链项目与主流编程语言的统计:
区块链项目与主流编程语言的统计
以太坊和超级账本 Fabric作为区块链 2.0 以来最成功的公链和联盟链代表,无一例外都选择使用 Go 作为开发语言,这两大超级区块链不仅在生态中占比巨大,并且在某种程度上也成为了区块链的开发标准,不论是公链中的智能合约,还是联盟链的技术,都绕不开以太坊和 Fabric。
剑桥大学:《2019全球区块链生态调查报告》
对于想要做区块链技术的公司来说,技术选型最快捷的方式自然是参考现有的主流项目,更简捷的方案是基于现有开源代码进行修改,自然 Go 语言就成为后来者的首选,换一种代码进行重新实现的难度较高,而且如果选择一些创新但不是非常成熟的语言还会缺失一些特定库的支持从而导致项目无法开展。另一方面虽然区块链涉及到的算法、功能应用这些C++语言都可以解决,但是繁琐的开发会导致成本过高,用其它上层语言,如Java、Python等虽然能降低开发成本,但是性能及区块链的算力较Go和C++来说有所欠缺,所以很多企业在开发区块链技术的时候,就会选择开发成本低并且开发性能客观的Go语言作为首选语言。
四、总结
Go语言本身的特质和优势为其做好了铺垫,而以太坊和超级账本两个超级区块链项目的加持也让Go语言成为了很多区块链项目的首选,这既是当前区块链2.0时代的选择,也是经历了诸多程序语言之后的众多架构师、程序员的共同选择。说句玩笑话:区块链选择Go语言,即有历史的偶然性,又有历史的必然性。
链乔教育在线旗下学硕创新区块链技术工作站是中国教育部学校规划建设发展中心开展的“智慧学习工场2020-学硕创新工作站 ”唯一获准的“区块链技术专业”试点工作站。专业站立足为学生提供多样化成长路径,推进专业学位研究生产学研结合培养模式改革,构建应用型、复合型人才培养体系。
- end -