1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-23 20:02:22 +00:00

Merge pull request #567 from iGmainC/master

ch1-02 优化排版
This commit is contained in:
chai2010 2022-01-06 08:22:31 +08:00 committed by GitHub
commit 6a3bee08c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -8,9 +8,9 @@
## 1.2.1 B 语言 - Ken Thompson, 1972
首先是B语言B语言是Go语言之父贝尔实验室的Ken Thompson早年间开发的一种通用的程序设计语言设计目的是为了用于辅助UNIX系统的开发。但是因为B语言缺乏灵活的类型系统导致使用比较困难。后来Ken Thompson的同事Dennis Ritchie以B语言为基础开发出了C语言C语言提供了丰富的类型极大地增加了语言的表达能力。到目前为止它依然是世界上最常用的程序语言之一。而B语言自从被它取代之后则就只存在于各种文献之中成为了历史。
首先是 B 语言B 语言是 Go 语言之父贝尔实验室的 *Ken Thompson* 早年间开发的一种通用的程序设计语言,设计目的是为了用于辅助 UNIX 系统的开发。但是因为B语言缺乏灵活的类型系统导致使用比较困难。后来*Ken Thompson* 的同事 *Dennis Ritchie* B 语言为基础开发出了 C 语言C 语言提供了丰富的类型极大地增加了语言的表达能力。到目前为止它依然是世界上最常用的程序语言之一。而B语言自从被它取代之后则就只存在于各种文献之中成为了历史。
目前见到的B语言版本的“Hello World”一般认为是来自于Brian W. Kernighan编写的B语言入门教程Go核心代码库中的第一个提交者名字正是Brian W. Kernighan程序如下
目前见到的 B 语言版本的“Hello World”一般认为是来自于 *Brian W. Kernighan* 编写的 B 语言入门教程Go 核心代码库中的第一个提交者名字正是 *Brian W. Kernighan*),程序如下:
```c
main() {
@ -23,15 +23,15 @@ b 'o, w';
c 'orld';
```
由于B语言缺乏灵活的数据类型只能分别以`a/b/c`全局变量来定义要输出的内容并且每个变量的长度必须对齐到了4个字节有一种写汇编语言的感觉。然后通过多次调用`putchar`函数输出字符,最后的`'!*n'`表示输出一个换行的意思。
由于 B 语言缺乏灵活的数据类型,只能分别以 `a``b``c` 全局变量来定义要输出的内容,并且每个变量的长度必须对齐到了 4 个字节(有一种写汇编语言的感觉)。然后通过多次调用 `putchar` 函数输出字符,最后的 `'!*n'` 表示输出一个换行的意思。
总体来说B 语言简单,功能也比较简陋。
## 1.2.2 C 语言 - Dennis Ritchie, 1974 ~ 1989
C语言是由Dennis Ritchie在B语言的基础上改进而来它增加了丰富的数据类型并最终实现了用它重写UNIX的伟大目标。C语言可以说是现代IT行业最重要的软件基石目前主流的操作系统几乎全部是由C语言开发的许多基础系统软件也是C语言开发的。C系家族的编程语言占据统治地位达几十年之久半个多世纪以来依然充满活力。
C 语言是由 *Dennis Ritchie* B 语言的基础上改进而来,它增加了丰富的数据类型,并最终实现了用它重写 UNIX 的伟大目标。C 语言可以说是现代 IT 行业最重要的软件基石,目前主流的操作系统几乎全部是由 C 语言开发的,许多基础系统软件也是 C 语言开发的。C 系家族的编程语言占据统治地位达几十年之久,半个多世纪以来依然充满活力。
在Brian W. Kernighan于1974年左右编写的C语言入门教程中出现了第一个C语言版本的“Hello World”程序。这给后来大部分编程语言教程都以“Hello World”为第一个程序提供了惯例。第一个C语言版本的“Hello World”程序如下
*Brian W. Kernighan* 1974 年左右编写的 C 语言入门教程中,出现了第一个 C 语言版本的“Hello World”程序。这给后来大部分编程语言教程都以“Hello World”为第一个程序提供了惯例。第一个 C 语言版本的“Hello World”程序如下
```c
main()
@ -40,9 +40,9 @@ main()
}
```
关于这个程序,有几点需要说明的:首先是`main`函数因为没有明确返回值类型,默认返回`int`类型;其次`printf`函数默认不需要导入函数声明即可以使用;最后`main`没有明确返回语句但默认返回0值。在这个程序出现时C语言还远未标准化我们看到的是上古时代的C语言语法函数不用写返回值函数参数也可以忽略使用printf时不需要包含头文件等。
关于这个程序,有几点需要说明的:首先是 `main` 函数因为没有明确返回值类型,默认返回 `int` 类型;其次 `printf` 函数默认不需要导入函数声明即可以使用;最后 `main` 没有明确返回语句,但默认返回 0 值。在这个程序出现时C 语言还远未标准化,我们看到的是上古时代的 C 语言语法:函数不用写返回值,函数参数也可以忽略,使用 `printf` 时不需要包含头文件等。
这个例子同样出现在了1978年出版的《C程序设计语言》第一版中作者正是Brian W. Kernighan 和 Dennis M. Ritchie简称K&R。书中的“Hello World”末尾增加了一个换行输出
这个例子同样出现在了 1978 年出版的《C 程序设计语言》第一版中,作者正是 *Brian W. Kernighan**Dennis M. Ritchie*(简称 *K&R*。书中的“Hello World”末尾增加了一个换行输出
```c
main()
@ -53,7 +53,7 @@ main()
这个例子在字符串末尾增加了一个换行C 语言的 `\n` 换行比 B 语言的 `'!*n'` 换行看起来要简洁了一些。
在K&R的教程面世10年之后的1988年《C程序设计语言》第二版终于出版了。此时ANSI C语言的标准化草案已经初步完成但正式版本的文档尚未发布。不过书中的“Hello World”程序根据新的规范增加了`#include <stdio.h>`头文件包含语句,用于包含`printf`函数的声明新的C89标准中仅仅是针对`printf`函数而言,依然可以不用声明函数而直接使用)。
*K&R* 的教程面世 10 年之后的 1988 《C 程序设计语言》第二版终于出版了。此时 ANSI C 语言的标准化草案已经初步完成但正式版本的文档尚未发布。不过书中的“Hello World”程序根据新的规范增加了 `#include <stdio.h>` 头文件包含语句,用于包含`printf`函数的声明(新的 C89 标准中,仅仅是针对`printf`函数而言,依然可以不用声明函数而直接使用)。
```c
#include <stdio.h>
@ -75,12 +75,11 @@ main(void)
}
```
至此C语言本身的进化基本完成。后面的C92/C99/C11都只是针对一些语言细节做了完善。因为各种历史因素C89依然是使用最广泛的标准。
至此C 语言本身的进化基本完成。后面的 C92、C99、C11 都只是针对一些语言细节做了完善。因为各种历史因素, C89 依然是使用最广泛的标准。
## 1.2.3 Newsqueak - Rob Pike, 1989
Newsqueak是Rob Pike发明的老鼠语言的第二代是他用于实践CSP并发编程模型的战场。Newsqueak是新的squeak语言的意思其中squeak是老鼠吱吱吱的叫声也可以看作是类似鼠标点击的声音。Squeak是一个提供鼠标和键盘事件处理的编程语言Squeak语言的管道是静态创建的。改进版的Newsqueak语言则提供了类似C语言语句和表达式的语法和类似Pascal语言的推导语法。Newsqueak是一个带自动垃圾回收的纯函数式语言它再次针对键盘、鼠标和窗口事件管理。但是在Newsqueak语言中管道是动态创建的属于第一类值因此可以保存到变量中。
Newsqueak *Rob Pike* 发明的老鼠语言的第二代,是他用于实践 CSP 并发编程模型的战场。Newsqueak 是新的 squeak 语言的意思,其中 squeak 是老鼠吱吱吱的叫声也可以看作是类似鼠标点击的声音。Squeak 是一个提供鼠标和键盘事件处理的编程语言Squeak语言的管道是静态创建的。改进版的 Newsqueak 语言则提供了类似 C 语言语句和表达式的语法和类似 Pascal 语言的推导语法。Newsqueak 是一个带自动垃圾回收的纯函数式语言,它再次针对键盘、鼠标和窗口事件管理。但是在 Newsqueak 语言中管道是动态创建的,属于第一类值,因此可以保存到变量中。
Newsqueak 类似脚本语言,内置了一个 `print` 函数它的“Hello World”程序看不出什么特色
@ -210,7 +209,7 @@ init(ctxt: ref Draw->Context, args: list of string)
## 1.2.6 Go 语言 - 2007~2009
贝尔实验室后来经历了多次动荡,包括Ken Thompson在内的Plan9项目原班人马最终加入了Google公司。在发明Limbo等前辈语言诞生10多年之后在2007年底Go语言三个最初的作者因为偶然的因素聚集到一起批斗C++传说是C++语言的布道师在Google公司到处鼓吹的C++11各种牛逼特性彻底惹恼了他们他们终于抽出了20%的自由时间创造了Go语言。最初的Go语言规范从2008年3月开始编写最初的Go程序也是直接编译到C语言然后再二次编译为机器码。到了2008年5月Google公司的领导们终于发现了Go语言的巨大潜力从而开始全力支持这个项目Google的创始人甚至还贡献了`func`关键字让他们可以将全部工作时间投入到Go语言的设计和开发中。在Go语言规范初版完成之后Go语言的编译器终于可以直接生成机器码了。
贝尔实验室后来经历了多次动荡,包括 *Ken Thompson* 在内的 Plan9 项目原班人马最终加入了 Google 公司。在发明 Limbo 等前辈语言诞生十多年之后,在 2007 年底Go 语言三个最初的作者因为偶然的因素聚集到一起批斗 C++(传说是 C++ 语言的布道师在 Google 公司到处鼓吹的 C++11 各种牛逼特性彻底惹恼了他们),他们终于抽出了 20% 的自由时间创造了 Go 语言。最初的 Go 语言规范从 2008 3 月开始编写,最初的 Go 程序也是直接编译到 C 语言然后再二次编译为机器码。到了 2008 5 Google 公司的领导们终于发现了 Go 语言的巨大潜力从而开始全力支持这个项目Google 的创始人甚至还贡献了`func`关键字),让他们可以将全部工作时间投入到 Go 语言的设计和开发中。在 Go 语言规范初版完成之后Go 语言的编译器终于可以直接生成机器码了。
### 1.2.6.1 hello.go - 2008 年 6 月
@ -291,7 +290,6 @@ func main() {
Go 语言终于移除了语句末尾的分号。这是 Go 语言在 2009 年 11 月 10 号正式开源之后第一个比较重要的语法改进。从 1978 年 C 语言教程第一版引入的分号分割的规则到现在Go 语言的作者们花了整整 32 年终于移除了语句末尾的分号。在这 32 年的演化的过程中必然充满了各种八卦故事,我想这一定是 Go 语言设计者深思熟虑的结果(现在 Swift 等新的语言也是默认忽略分号的,可见分号确实并不是那么的重要)。
## 1.2.7 你好, 世界! - V2.0
在经过半个世纪的涅槃重生之后Go 语言不仅仅打印出了 Unicode 版本的“Hello, World”而且可以方便地向全球用户提供打印服务。下面版本通过 `http` 服务向每个访问的客户端打印中文的“你好, 世界!”和当前的时间信息。