Go简史
Go源于Rob Pike在2007年9月25号,星期二,下午3:12回复给Robert Griesemer、Ken Thompson的有关编程语言讨论主题的邮件,邮件正文大意为:在开车回家的路上我得到了些灵感。给这门编程语言取名为“go”,它很简短,易书写。工具类可以命名为:goc、gol、goa。交互式的调试工具也可以直接命名为“go”。语言文件后缀名为.go等等。这就是Go语言名字的来源,自此之后Robert、Rob和Ken三个人开始在Google内部进行了研发,一直到了2009年,Go正式开源了,Go项目团队将2009年11月10日,即该语言正式对外开源的日字作为其官方生日。源代码最初托管在 Google Code 上,之后几年才逐步的迁移到GitHub上。
后来Russ Cox在2008年带着他的语言设计天赋和编程技巧加入了刚成立不久的Go团队。Russ发现Go方法的通用性意味着函数也能拥有自己的方法,这直接促成了http.HandlerFunc的实现,这是一个让Go一下子变得无限可能的特性。Russ还提出了更多的泛化性的想法,比如io.Reader和io.Writer接口,奠定了所有IO库的整体结构。接下来,安全专家Adam Langley帮助Go走向Google外面的世界。Docker的公司使用Go进行项目开发,并促进了计算机领域的容器行业,进而出现了像Kubernetes这样的项目。这些历史是Go语言如今辉煌的基石。
《Go语言圣经》中给出的Go语言的基因图谱,我们可以从中看到有哪些编程语言对Go语言产生了影响:
首先看基因图谱的左边一支。可以明确看出Go语言的并发特性是由贝尔实验室的Hoare于1978年发布的CSP理论演化而来。其后,CSP并发模型在Squeak/NewSqueak和Alef等编程语言中逐步完善并走向实际应用,最终这些设计经验被消化并吸收到了Go语言中。业界比较熟悉的Erlang编程语言的并发编程模型也是CSP理论的另一种实现。
再看基因图谱的中间一支。中间一支主要包含了Go语言中面向对象和包特性的演化历程。Go语言中包和接口以及面向对象等特性则继承自Niklaus Wirth所设计的Pascal语言以及其后所衍生的相关编程语言。其中包的概念、包的导入和声明等语法主要来自于Modula-2编程语言,面向对象特性所提供的方法的声明语法等则来自于Oberon编程语言。最终Go语言演化出了自己特有的支持鸭子面向对象模型的隐式接口等诸多特性。
最后是基因图谱的右边一支,这是对C语言的致敬。Go语言是对C语言最彻底的一次扬弃,不仅仅是语法和C语言有着很多差异,最重要的是舍弃了C语言中灵活但是危险的指针运算。而且,Go语言还重新设计了C语言中部分不太合理运算符的优先级,并在很多细微的地方都做了必要的打磨和改变。当然,C语言中少即是多、简单直接的暴力编程哲学则被Go语言更彻底地发扬光大了(Go语言居然只有25个关键字,sepc语言规范还不到50页))。
Go语言其它的一些特性零散地来自于其他一些编程语言;比如iota语法是从APL语言借鉴,词法作用域与嵌套函数等特性来自于Scheme语言(和其他很多编程语言)。Go语言中也有很多自己发明创新的设计。比如Go语言的切片为轻量级动态数组提供了有效的随机存取的性能,这可能会让人联想到链表的底层的共享机制。还有Go语言新发明的defer语句(Ken发明)也是神来之笔。