22
33在创世纪章节中我们简单介绍了Go语言的演化基因族谱,对其中来自于贝尔实验室的特有并发编程基因做了重点介绍,最后引出了Go语言版的“Hello, World”程序。其实“Hello, World”程序是展示各种语言特性的最好的例子,是通向该语言的一个窗口。这一节我们将沿着各个编程语言演化的时间轴,简单回顾下“Hello, World”程序是如何逐步演化到目前的Go语言形式、最终完成它的革命使命的。
44
5- ![ ] ( ../images/ch1-01 -go-history.png )
5+ ![ ] ( ../images/ch1.2-1 -go-history.png )
66
77## 1.2.1 B语言 - Ken Thompson, 1972
88
99首先是B语言,B语言是Go语言之父贝尔实验室的Ken Thompson早年间开发的一种通用的程序设计语言,设计目的是为了用于辅助UNIX系统的开发。但是因为B语言缺乏灵活的类型系统导致使用比较困难。后来,Ken Thompson的同事Dennis Ritchie以B语言为基础开发出了C语言,C语言提供了丰富的类型,极大地增加了语言的表达能力。到目前为止它依然是世界上最常用的程序语言之一。而B语言自从被它取代之后,则就只存在于各种文献之中,成为了历史。
1010
1111目前见到的B语言版本的“Hello World”,一般认为是来自于Brian W. Kernighan编写的B语言入门教程(Go核心代码库中的第一个提交者名字正是Brian W. Kernighan),程序如下:
1212
13+ * 代码 1.2-1*
14+
1315``` c
1416main () {
1517 extrn a, b, c;
@@ -31,6 +33,8 @@ C语言是由Dennis Ritchie在B语言的基础上改进而来,它增加了丰
3133
3234在Brian W. Kernighan于1974年左右编写的C语言入门教程中,出现了第一个C语言版本的“Hello World”程序。这给后来大部分编程语言教程都以“Hello World”为第一个程序提供了惯例。第一个C语言版本的“Hello World”程序如下:
3335
36+ * 代码 1.2-2*
37+
3438``` c
3539main ()
3640{
4246
4347这个例子同样出现在了1978年出版的《C程序设计语言》第一版中,作者正是Brian W. Kernighan 和 Dennis M. Ritchie(简称K&R)。书中的“Hello World”末尾增加了一个换行输出:
4448
49+ * 代码 1.2-3*
50+
4551``` c
4652main ()
4753{
5359
5460在K&R的教程面世10年之后的1988年,《C程序设计语言》第二版终于出版了。此时ANSI C语言的标准化草案已经初步完成,但正式版本的文档尚未发布。不过书中的“Hello World”程序根据新的规范增加了` #include <stdio.h> ` 头文件包含语句,用于包含` printf ` 函数的声明(新的C89标准中,仅仅是针对` printf ` 函数而言,依然可以不用声明函数而直接使用)。
5561
62+ * 代码 1.2-4*
63+
5664``` c
5765#include < stdio.h>
5866
6472
6573然后到了1989年,ANSI C语言第一个国际标准发布,一般被称为C89。C89是流行最广泛的一个C语言标准,目前依然被大量使用。《C程序设计语言》第二版的也再次印刷新版本,并针对新发布的C89规范建议,给` main ` 函数的参数增加了` void ` 输入参数说明,表示没有输入参数的意思。
6674
75+ * 代码 1.2-5*
76+
6777``` c
6878#include < stdio.h>
6979
@@ -82,6 +92,8 @@ Newsqueak是Rob Pike发明的老鼠语言的第二代,是他用于实践CSP并
8292
8393Newsqueak类似脚本语言,内置了一个`print`函数,它的“Hello World”程序看不出什么特色:
8494
95+ *代码 1.2-6*
96+
8597```go
8698print("Hello,", "World", "\n");
8799```
@@ -92,6 +104,8 @@ print("Hello,", "World", "\n");
92104
93105Newsqueak语言并发版本的“素数筛”程序如下:
94106
107+ * 代码 1.2-7*
108+
95109``` go
96110// 向管道输出从2开始的自然数序列
97111counter := prog (c:chan of int ) {
@@ -150,6 +164,8 @@ Newsqueak语言中并发体和管道的语法和Go语言已经比较接近了,
150164
151165Alef语言并发版本的“Hello World”程序如下:
152166
167+ * 代码 1.2-8*
168+
153169``` c
154170#include < alef.h>
155171
@@ -182,6 +198,9 @@ Limbo(地狱)是用于开发运行在小型计算机上的分布式应用的
182198
183199Limbo语言版本的“Hello World”程序如下:
184200
201+
202+ *代码 1.2-9*
203+
185204```go
186205implement Hello;
187206
@@ -208,6 +227,8 @@ init(ctxt: ref Draw->Context, args: list of string)
208227
209228### 1.2.6.1 hello.go - 2008年6月
210229
230+ * 代码 1.2-10*
231+
211232``` go
212233package main
213234
@@ -221,6 +242,8 @@ func main() int {
221242
222243### 1.2.6.2 hello.go - 2008年6月27日
223244
245+ * 代码 1.2-11*
246+
224247``` go
225248package main
226249
@@ -233,6 +256,8 @@ func main() {
233256
234257### 1.2.6.3 hello.go - 2008年8月11日
235258
259+ * 代码 1.2-12*
260+
236261``` go
237262package main
238263
@@ -245,6 +270,8 @@ func main() {
245270
246271### 1.2.6.4 hello.go - 2008年10月24日
247272
273+ * 代码 1.2-13*
274+
248275``` go
249276package main
250277
@@ -259,6 +286,8 @@ func main() {
259286
260287### 1.2.6.5 hello.go - 2009年1月15日
261288
289+ * 代码 1.2-14*
290+
262291``` go
263292package main
264293
@@ -273,6 +302,8 @@ Go语言开始采用是否大小写首字母来区分符号是否可以被导出
273302
274303### 1.2.6.7 hello.go - 2009年12月11日
275304
305+ * 代码 1.2-15*
306+
276307``` go
277308package main
278309
@@ -290,6 +321,8 @@ Go语言终于移除了语句末尾的分号。这是Go语言在2009年11月10
290321
291322在经过半个世纪的涅槃重生之后,Go语言不仅仅打印出了Unicode版本的“Hello, World”,而且可以方便地向全球用户提供打印服务。下面版本通过` http ` 服务向每个访问的客户端打印中文的“你好, 世界!”和当前的时间信息。
292323
324+ * 代码 1.2-16*
325+
293326``` go
294327package main
295328
0 commit comments