Skip to content

Commit b03106c

Browse files
committed
ch1.2: 规范化图和代码编号
1 parent 59058a4 commit b03106c

File tree

20 files changed

+237
-3
lines changed

20 files changed

+237
-3
lines changed

ch1-basic/ch1-02-hello-revolution.md

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
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
1416
main() {
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
3539
main()
3640
{
@@ -42,6 +46,8 @@ main()
4246

4347
这个例子同样出现在了1978年出版的《C程序设计语言》第一版中,作者正是Brian W. Kernighan 和 Dennis M. Ritchie(简称K&R)。书中的“Hello World”末尾增加了一个换行输出:
4448

49+
*代码 1.2-3*
50+
4551
```c
4652
main()
4753
{
@@ -53,6 +59,8 @@ main()
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

@@ -64,6 +72,8 @@ main()
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
8393
Newsqueak类似脚本语言,内置了一个`print`函数,它的“Hello World”程序看不出什么特色:
8494
95+
*代码 1.2-6*
96+
8597
```go
8698
print("Hello,", "World", "\n");
8799
```
@@ -92,6 +104,8 @@ print("Hello,", "World", "\n");
92104

93105
Newsqueak语言并发版本的“素数筛”程序如下:
94106

107+
*代码 1.2-7*
108+
95109
```go
96110
// 向管道输出从2开始的自然数序列
97111
counter := prog(c:chan of int) {
@@ -150,6 +164,8 @@ Newsqueak语言中并发体和管道的语法和Go语言已经比较接近了,
150164

151165
Alef语言并发版本的“Hello World”程序如下:
152166

167+
*代码 1.2-8*
168+
153169
```c
154170
#include <alef.h>
155171

@@ -182,6 +198,9 @@ Limbo(地狱)是用于开发运行在小型计算机上的分布式应用的
182198
183199
Limbo语言版本的“Hello World”程序如下:
184200
201+
202+
*代码 1.2-9*
203+
185204
```go
186205
implement 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
212233
package 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
225248
package 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
237262
package 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
249276
package 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
263292
package 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
277308
package 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
294327
package main
295328

images/ch1.2-1-go-history.png

9.51 KB
Loading

vendor/ch1.1-1/doc_ch1-01.go

Lines changed: 0 additions & 2 deletions
This file was deleted.

vendor/ch1.1-1/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// ch1.1-1
2+
13
package main
24

35
import "fmt"

vendor/ch1.2-1/hello.b

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// ch1.2-1
2+
3+
main() {
4+
extrn a, b, c;
5+
putchar(a); putchar(b); putchar(c);
6+
putchar('!*n');
7+
}
8+
a 'hell';
9+
b 'o, w';
10+
c 'orld';

vendor/ch1.2-10/hello.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// ch1.2-10
2+
3+
// +build ignore
4+
5+
package main
6+
7+
func main() int {
8+
print "hello, world\n";
9+
return 0;
10+
}

vendor/ch1.2-11/hello.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// ch1.2-11
2+
3+
// +build ignore
4+
5+
package main
6+
7+
func main() {
8+
print "hello, world\n";
9+
}

vendor/ch1.2-12/hello.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// ch1.2-12
2+
3+
package main
4+
5+
func main() {
6+
print("hello, world\n")
7+
}

vendor/ch1.2-13/hello.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// ch1.2-13
2+
3+
// +build ignore
4+
5+
package main
6+
7+
import "fmt"
8+
9+
func main() {
10+
fmt.printf("hello, world\n")
11+
}

vendor/ch1.2-14/hello.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// ch1.2-14
2+
3+
// +build ignore
4+
5+
package main
6+
7+
import "fmt"
8+
9+
func main() {
10+
fmt.Printf("hello, world\n") // ;
11+
}

0 commit comments

Comments
 (0)