Go语言起源

就像生物物种, 一个成功的编程语言的后代一般都会继承它们祖先的优点; 当然有时多种语言混合也会产生令人惊讶的特性; 还有一些激进的新特性可能并没有先例. 我们可以通过观察语言的和环境是如何相互促进和影响的演化过程而学到很多.

下图展示了最早期的编程语言对Go语言设计产生的重要影响.

Go有时候被描述为"C类似语言", 或者是"21世纪的C语言". Go从C语言继承了相似的表达式语法, 控制流结构, 基础数据类型, 调用参数传值, 指针等很多思想, 还有C语言一直看中的编译后机器码的运行效率以及和现有操作系统的无缝的适配.

但是在Go语言家的族树中还有其他的祖先. 其中一个有影响的分支来自Niklaus Wirth设计的Pascal语言. Modula-2 激发了包的概念. Oberon 摒弃了模块接口文件和模块实现文件之间的区别. Oberon-2 影响了的包的导入和声明的语法, 还有 面向对象 Oberon 所提供的方法的声明语法等.

Go的另一支祖先, 也是Go区别其他语言的重要特性, 灵感来自贝尔实验室的Tony Hoare的1978年发表的鲜为外界所知的关于并发研究的基础文献communicating sequential processes (CSP). 在CSP中, 程序是一组中间没有共享状态的平行的处理过程, 它们使用管道进行通信和同步. 不过Tony Hoare的CSP只是一个用于描述并发性基本概念的描述语言, 并不是一个编写可执行程序的编程语言.

Rob Pike和其他人开始尝试将CSP引入实际的编程语言中. 第一个语言叫Squeak(老鼠间交流的语言), 一个提供鼠标和键盘事件处理的语言, 它的管道是静态创建的. 然后是Newsqueak, 提供了类似C语言语句和表达式的的语法和Pascal的类似推导语法. 它是一个带垃圾回收的纯函数式语言, 再此针对管理键盘, 鼠标和窗口事件管理. 但是Newsqueak中管道是动态创建的, 属于第一类值, 可以保存到变量中.

在Plan9操作系统中, 这些想法被吸收到一个叫Alef的编程语言中. Alef视图将Newsqueak改造为系统编程语言, 但是因为缺少垃圾回收机制而导致并发处理很痛苦.

Go的其他一些特性零散地来着其他的一些语言; 比如 iota 从 APL 借鉴, 词法作用域与嵌套函数来自 Scheme (和其他很多语言). 我们也可以从Go中发现很多创新的设计. 比如Go的切片为动态数组提供了有效的随机存取性能, 以及可能会让人联想到链表的底层的共享机制. 还有Go自己发明的defer语句.