Go语言精进学习系列 | 了解Go语言的诞生与演进

Posted COCOgsta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言精进学习系列 | 了解Go语言的诞生与演进相关的知识,希望对你有一定的参考价值。

书籍来源:《Go语言精进之路:从新手到高手的编程思想、方法和技巧》

一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:Go语言精进学习系列 | 汇总_COCOgsta的博客-CSDN博客


Go语言诞生于何时?它的最初设计者是谁?它为什么被命名为Go?它的设计目标是什么?它如今发展得怎么样?带着这些问题,我们一起穿越时空,回到2007年9月Go语言诞生的那一历史时刻吧。

1.1 Go语言的诞生

2007年9月20日的下午,在谷歌山景城总部的一间办公室里,谷歌的大佬级程序员Rob Pike[1]启动了一个C++工程的编译构建。按照以往的经验判断,这次构建大约需要一个小时。利用这段时间,Rob Pike与谷歌的另两个大佬级程序员Robert Griesemer[2]和Ken Thompson[3](见图1-1)进行了一次有关设计一门新编程语言的讨论,而这次讨论成为Go语言诞生的“导火索”。

图1-1 Go语言之父(从左到右分别是Robert Griesemer、Rob Pike和Ken Thompson)

当时的谷歌内部主要使用C++语言构建各种系统,但C++复杂性高,编译构建速度慢,在编写服务端程序时不便支持并发。诸如此类的一些问题让三位大佬产生了设计一门新编程语言的想法。在他们的初步构想中,这门新语言应该是能够给程序员带来快乐、匹配未来硬件发展趋势并适合用来开发谷歌内部大规模程序的。

趁热打铁!在第一天的简短讨论后,第二天三人又在总部的一间名为Yaounde的会议室里开了一场有关这门新语言具体设计的会议。会后的第二天,Robert Griesemer发出了一封题为“prog lang discussion”的电邮[4]。这封电邮将这些天来三人对这门新编程语言的功能特性的讨论结果做了归纳总结,其主要思路是:在C语言的基础上,修正一些明显的缺陷,删除一些被诟病较多的特性,增加一些缺失的功能。具体功能和特性如下。

使用import替代include。 去掉宏(macro)。 理想情况是用一个源文件替代.h和.c文件,模块的接口应该被自动提取出来(而无须手动在.h文件中声明)。 语句像C语言一样,但需要修正switch语句的缺陷。 表达式像C语言一样,但有一些注意事项(比如是否需要逗号表达式)。 基本上是强类型的,但可能需要支持运行时类型。 数组应该总是有边界检查。 具备垃圾回收的机制。 支持接口(interface)。 支持嵌套和匿名函数/闭包。 一个简单的编译器。 各种语言机制应该能产生可预测的代码。

这封电邮成为这门新语言的第一版设计稿,三位大佬在这门语言的一些基础语法特性上初步达成一致。

2007年9月25日,Rob Pike在一封回复电邮中把这门新编程语言命名为go[5]。在Rob Pike的心目中,go这个单词短小、容易输入并且在组合其他字母后便可以用来命名Go相关的工具,比如编译器(goc)、汇编器(goa)、链接器(gol)等。(go的早期版本曾如此命名,但后续版本撤销了这种命名方式,仅保留go这一统一的工具链名称。)很多Go语言初学者经常称这门语言为golang,其实这是不对的:golang仅应用于命名Go语言官方网站,当时之所以使用golang.org作为Go语言官方域名,是因为go.com已经被迪士尼公司占用了。

1.2 Go语言的早期团队和演进历程

经过早期讨论,Go语言的三位作者在语言设计上达成初步一致,之后便开启了Go语言迭代设计和实现的过程。

2008年年初,Unix之父Ken Thompson实现了第一版Go编译器,用于验证之前的设计。这个编译器先将Go代码转换为C代码,再由C编译器编译成二进制文件。

到2008年年中,Go的第一版设计基本结束了。这时,同样在谷歌工作的Ian Lance Taylor为Go语言实现了一个GCC的前端,这也是Go语言的第二个编译器。

Ian Lance Taylor的这一成果让三位作者十分喜悦,也很震惊。因为这对Go项目来说不仅仅是鼓励,更是一种对语言可行性的证明。Go语言的这第二个实现对确定语言规范和标准库是至关重要的。随后,Ian Lance Taylor以第四位成员的身份正式加入Go语言开发团队,并在后面的Go语言发展进程中成为Go语言及工具设计和实现的核心人物之一。

Russ Cox也是在2008年加入刚成立不久的Go语言开发团队的,他是Go核心开发团队的第五位成员,他的一些天赋随即在Go语言设计和实现中展现出来。Russ Cox利用函数类型也可以拥有自己的方法这个特性巧妙设计出了http包的HandlerFunc类型,这样通过显式转型即可让一个普通函数成为满足http.Handler接口的类型。Russ Cox还在当时设计的基础上提出了一些更通用的想法,比如奠定了Go语言I/O结构模型的io.Reader和io.Writer接口。在Ken Thompson和Rob Pike先后淡出Go语言核心决策层后,Russ Cox正式接过两位大佬的衣钵,成为Go核心技术团队的负责人。

1.3 Go语言正式发布并开源

2009年10月30日,Rob Pike在Google Techtalk上做了一次有关Go语言的演讲“The Go Programming Language”[6],首次将Go语言公之于众。

Go语言项目在2009年11月10日正式开源,这一天也被Go官方确定为Go语言诞生日。Go语言项目的主代码仓库位于go.googlesource.com/go。最初Go语言项目在code.google.com上建立了镜像仓库,几年后镜像仓库迁移到了GitHub上[7]。

开源后的Go语言吸引了全世界开发者的目光。再加上Go的三位作者在业界的影响力以及谷歌的加持,越来越多有才华的程序员加入Go开发团队,越来越多贡献者开始为Go语言项目添砖加瓦。于是,Go在发布的当年(2009年)就成为著名编程语言排行榜TIOBE的年度最佳编程语言。

在Go开源后,一些技术公司,尤其是云计算领域的大厂以及初创公司,成为Go语言的早期接纳者。经过若干年的磨合,在这些公司中诞生了众多“杀手级”或示范性项目,如容器引擎Docker、云原生事实标准平台Kubernetes、服务网格Istio、区块链公链以太坊(Ethereum)、联盟链超级账本(Hyperledger Fabric)、分布式关系型数据库TiDB和CockroachDB、云原生监控系统Prometheus等。这些项目也让Go被誉为“云计算基础设施编程语言”。Go在近些年云原生领域的广泛应用也让其跻身云原生时代的头部编程语言。

在发布后,Go语言拥有了自己的“吉祥物”(mascot)——一只由Rob Pike的夫人Renee French设计的地鼠(见图1-2),从此地鼠成为世界各地Go程序员的象征。Go程序员也被昵称为Gopher(后文会直接使用Gopher指代Go语言开发者),Go语言官方技术大会被称为GopherCon。国内最负盛名的Go技术大会同样以Gopher命名,被称为GopherChina。

图1-2 Go语言的吉祥物

小结

了解一门编程语言的诞生历史和早期演进史,有助于程序员在学习这门语言时产生或加深对语言的认同感,从而更热情地投入到这门语言的学习和使用当中。同时,这种认同感也能促进程序员在后续的实践中形成语言的原生思维(如Go语言思维),从而更加高效地利用这门语言进行编程,解决实际问题。


[1]Rob Pike,贝尔实验室早期成员,参与了Plan 9操作系统、C编译器以及多种语言编译器的设计和实现,UTF-8编码的发明人之一。

[2]Robert Griesemer,Java的HotSpot虚拟机和Chrome浏览器的javascript V8引擎的设计者之一。

[3]Ken Thompson,图灵奖得主,Unix之父,C语言的发明人之一。

[4]talks.golang.org/2015/gopher…

[5]Rob Pike 将新语言命名为Go:commandcenter.blogspot.com/2017/09/go-…

[6]github.com/golang/talk…

[7]github.com/golang/go

以上是关于Go语言精进学习系列 | 了解Go语言的诞生与演进的主要内容,如果未能解决你的问题,请参考以下文章

Go语言精进学习系列 | 汇总

Go语言精进学习系列 | Go语言的诞生

《Go语言精进之路》读书笔记 | 汇总

《Go语言精进之路,从新手到高手的编程思想方法和技巧1》读书笔记和分享

《Go语言精进之路,从新手到高手的编程思想方法和技巧1》读书笔记和分享

《Go语言精进之路》读书笔记 | 了解map实现原理并高效使用