1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 12:32:21 +00:00

ch1-01: 规范化图和代码的编号

This commit is contained in:
chai2010 2018-08-12 22:42:09 +08:00
parent e4de6b2f20
commit c3db389d0f
6 changed files with 24 additions and 7 deletions

View File

@ -2,9 +2,11 @@
Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明设计新语言的最初的洪荒之力来自于对超级复杂的C++11特性的吹捧报告的鄙视最终的目标是设计网络和多核时代的C语言。到2008年中期语言的大部分特性设计已经完成并开始着手实现编译器和运行时大约在这一年Russ Cox作为主力开发者加入。到了2010年Go语言已经逐步趋于稳定并在9月正式发布Go语言并开源了代码。 Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明设计新语言的最初的洪荒之力来自于对超级复杂的C++11特性的吹捧报告的鄙视最终的目标是设计网络和多核时代的C语言。到2008年中期语言的大部分特性设计已经完成并开始着手实现编译器和运行时大约在这一年Russ Cox作为主力开发者加入。到了2010年Go语言已经逐步趋于稳定并在9月正式发布Go语言并开源了代码。
Go语言很多时候被描述为“类C语言”或者是“21世纪的C语言”。从各种角度看Go语言确实是从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸多编程思想还有彻底继承和发扬了C语言简单直接的暴力编程哲学等。下面是《Go语言圣经》中给出的Go语言的基因图谱我们可以从中看到有哪些编程语言对Go语言产生了影响。 Go语言很多时候被描述为“类C语言”或者是“21世纪的C语言”。从各种角度看Go语言确实是从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸多编程思想还有彻底继承和发扬了C语言简单直接的暴力编程哲学等。图1-1是《Go语言圣经》中给出的Go语言的基因图谱我们可以从中看到有哪些编程语言对Go语言产生了影响。
![](../images/ch1-01-go-family-tree.png) ![](../images/1-1-go-family-tree.png)
*图 1-1 Go语言基因族谱*
首先看基因图谱的左边一支。可以明确看出Go语言的并发特性是由贝尔实验室的Hoare于1978年发布的CSP理论演化而来。其后CSP并发模型在Squeak/NewSqueak和Alef等编程语言中逐步完善并走向实际应用最终这些设计经验被消化并吸收到了Go语言中。业界比较熟悉的Erlang编程语言的并发编程模型也是CSP理论的另一种实现。 首先看基因图谱的左边一支。可以明确看出Go语言的并发特性是由贝尔实验室的Hoare于1978年发布的CSP理论演化而来。其后CSP并发模型在Squeak/NewSqueak和Alef等编程语言中逐步完善并走向实际应用最终这些设计经验被消化并吸收到了Go语言中。业界比较熟悉的Erlang编程语言的并发编程模型也是CSP理论的另一种实现。
@ -20,21 +22,27 @@ Go语言其它的一些特性零散地来自于其他一些编程语言比如
CSP并发模型最经典的实际应用是来自爱立信发明的Erlang编程语言。不过在Erlang将CSP理论作为并发编程模型的同时同样来自贝尔实验室的Rob Pike以及其同事也在不断尝试将CSP并发模型引入当时的新发明的编程语言中。他们第一次尝试引入CSP并发特性的编程语言叫Squeak老鼠的叫声是一个用于提供鼠标和键盘事件处理的编程语言在这个语言中管道是静态创建的。然后是改进版的Newsqueak语言新版老鼠的叫声新提供了类似C语言语句和表达式的语法还有类似Pascal语言的推导语法。Newsqueak是一个带垃圾回收的纯函数式语言它再次针对键盘、鼠标和窗口事件管理。但是在Newsqueak语言中管道已经是动态创建的管道属于第一类值、可以保存到变量中。然后是Alef编程语言Alef也是C语言之父Ritchie比较喜爱的编程语言Alef语言试图将Newsqueak语言改造为系统编程语言但是因为缺少垃圾回收机制而导致并发编程很痛苦这也是继承C语言手工管理内存的代价。在Aelf语言之后还有一个叫Limbo的编程语言地狱的意思这是一个运行在虚拟机中的脚本语言。Limbo语言是Go语言最接近的祖先它和Go语言有着最接近的语法。到设计Go语言时Rob Pike在CSP并发编程模型的实践道路上已经积累了几十年的经验关于Go语言并发编程的特性完全是信手拈来新编程语言的到来也是水到渠成了。 CSP并发模型最经典的实际应用是来自爱立信发明的Erlang编程语言。不过在Erlang将CSP理论作为并发编程模型的同时同样来自贝尔实验室的Rob Pike以及其同事也在不断尝试将CSP并发模型引入当时的新发明的编程语言中。他们第一次尝试引入CSP并发特性的编程语言叫Squeak老鼠的叫声是一个用于提供鼠标和键盘事件处理的编程语言在这个语言中管道是静态创建的。然后是改进版的Newsqueak语言新版老鼠的叫声新提供了类似C语言语句和表达式的语法还有类似Pascal语言的推导语法。Newsqueak是一个带垃圾回收的纯函数式语言它再次针对键盘、鼠标和窗口事件管理。但是在Newsqueak语言中管道已经是动态创建的管道属于第一类值、可以保存到变量中。然后是Alef编程语言Alef也是C语言之父Ritchie比较喜爱的编程语言Alef语言试图将Newsqueak语言改造为系统编程语言但是因为缺少垃圾回收机制而导致并发编程很痛苦这也是继承C语言手工管理内存的代价。在Aelf语言之后还有一个叫Limbo的编程语言地狱的意思这是一个运行在虚拟机中的脚本语言。Limbo语言是Go语言最接近的祖先它和Go语言有着最接近的语法。到设计Go语言时Rob Pike在CSP并发编程模型的实践道路上已经积累了几十年的经验关于Go语言并发编程的特性完全是信手拈来新编程语言的到来也是水到渠成了。
可以从Go语言库早期代码库日志可以看出最直接的演化历程Git用`git log --before={2008-03-03} --reverse`命令查看) 图1-2展示了Go语言库早期代码库日志可以看出最直接的演化历程Git用`git log --before={2008-03-03} --reverse`命令查看)
![](../images/ch1-01-go-log04.png) ![](../images/1-2-go-log4.png)
*图 1-2 Go语言开发日志*
从早期提交日志中也可以看出Go语言是从Ken Thompson发明的B语言、Dennis M. Ritchie发明的C语言逐步演化过来的它首先是C语言家族的成员因此很多人将Go语言称为21世纪的C语言。 从早期提交日志中也可以看出Go语言是从Ken Thompson发明的B语言、Dennis M. Ritchie发明的C语言逐步演化过来的它首先是C语言家族的成员因此很多人将Go语言称为21世纪的C语言。
下面是Go语言中来自贝尔实验室特有并发编程基因的演化过程 图1-3是Go语言中来自贝尔实验室特有并发编程基因的演化过程
![](../images/ch1-01-go-history.png) ![](../images/1-3-go-history.png)
*图 1-3 Go语言并发演化历史*
纵观整个贝尔实验室的编程语言的发展进程从B语言、C语言、Newsqueak、Alef、Limbo语言一路走来Go语言继承了来着贝尔实验室的半个世纪的软件设计基因终于完成了C语言革新的使命。纵观这几年来的发展趋势Go语言已经成为云计算、云存储时代最重要的基础编程语言。 纵观整个贝尔实验室的编程语言的发展进程从B语言、C语言、Newsqueak、Alef、Limbo语言一路走来Go语言继承了来着贝尔实验室的半个世纪的软件设计基因终于完成了C语言革新的使命。纵观这几年来的发展趋势Go语言已经成为云计算、云存储时代最重要的基础编程语言。
## 1.1.2 你好, 世界 ## 1.1.2 你好, 世界
按照惯例介绍所有编程语言的第一个程序都是“Hello, World!”。虽然本教假设读者已经了解了Go语言但是我们还是不想打破这个惯例因为这个传统正是从Go语言的前辈C语言传承而来的。不过Go语言的这个程序输出的是中文“你好, 世界!”。 按照惯例介绍所有编程语言的第一个程序都是“Hello, World!”。虽然本教假设读者已经了解了Go语言但是我们还是不想打破这个惯例因为这个传统正是从Go语言的前辈C语言传承而来的。代码1-1展示的Go语言程序输出的是中文“你好, 世界!”。
*代码 1-1*
```Go ```Go
package main package main

View File

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

2
vendor/1-1/doc_ch1-01.go vendored Normal file
View File

@ -0,0 +1,2 @@
// ch1-01/01
package main

7
vendor/1-1/main.go vendored Normal file
View File

@ -0,0 +1,7 @@
package main
import "fmt"
func main() {
fmt.Println("你好, 世界!")
}