Golang 起源

  和生物学物种一样,成功的语言会繁衍后代,这些后代语言会从它们的祖先那里汲取各种优点;有时候,语言间的“混血”会产生异常强大的力量;在一些罕见情况下,某个重大的语言特性也可能凭空出现而并无先例。通过考察语言间的影响,我们可以学得不少知识,比如语言为什么会变成这个样子,以及它适合用于哪些环境,等等。

  下图展示了更早出现的程序设计语言对Go产生的最重要影响。


  Go有时会称为“类C语言”或“21世纪的C”。从C中,Go继承了表达式语法、控制流语句、基本数据类型、按值调用的形参传递和指针,但比这些更重要的是,继承了C所强调的要点:程序要编译成高效的机器码,并自然地与所处的操作系统提供的抽象机制相配合。

  可是,Go的家谱中还有其他祖先。产生主要影响的是由Niklaus Wirth设计的、以Pascal为发端的一个语言支流。Modula-2启发了包概念。Oberon消除了模块接口文件和模块实现文件之间的差异。Oberon-2影响了包、导入和声明的语法,并提供了方法声明的语法。

  Go的另一支世系祖先——它使得Go相对于当下的程序设计语言显得卓然不群,是在贝尔实验室开发的一系列名不见经传的研究用语言。这些语言都受到了通信顺序进程(Communicating Sequential Process,CSP)的启发,CSP由Tony Hoare于1978年在发表的关于并发性基础的开创性论文中提出。在CSP中,程序就是一组无共享状态进程的并行组合,进程间的通信和同步采用通道完成。不过,Hoare提出的CSP是一种形式语言,仅用于描述并发性的基本概念,并不是一种用来撰写可执行程序的程序设计语言。

  Rob Pike等人开始动手做一些实验,尝试把CSP实现为真正的语言。第一种这样的语言称为Squeak(“和鼠类沟通的语言”),它是一种用于处理鼠标和键盘事件的语言,其中具有静态创建的通道。紧接着它的是Newsqueak,它具有类C的语句和表达式语法,以及类Pascal的类型记法。它是一种纯粹的函数式语言,具有垃圾回收功能,同样也以管理键盘、鼠标和窗口事件为目标。通道变成了“一等”值(first-class value),它可以动态创建并用变量存储。

  Plan 9操作系统将这些思想都纳入一种称为Alef的语言中。Alef尝试将Newsqueak改造成一种可用的系统级程序设计语言,但垃圾回收功能的缺失使得它在处理并发性时捉襟见肘。

  Go中的其他结构也会不时显示出某些并非来自祖先的基因。例如,iota多多少少有点APL的影子,而嵌套函数的词法作用域则来自Scheme(以及由之而来的大部分语言)。在Go语言中,也可以发现全新的变异。Go中新颖的slice不仅为动态数组提供了高效的随机访问功能,还允许旧式链表的复杂共享机制。另外,defer语句也是Go中新引入的。
Posted by 何敏 on 2017-08-06 01:49:33