diff --git a/chap-1-programming-a-computer/1-programming-a-computer.md b/chap-1-programming-a-computer/1-programming-a-computer.md new file mode 100644 index 0000000000000000000000000000000000000000..8de003d9b50ba3ebe5e6287df15e27e406e424a9 --- /dev/null +++ b/chap-1-programming-a-computer/1-programming-a-computer.md @@ -0,0 +1,253 @@ +# 计算机编程 + +![](imgs/1-programming.2b932230.jpg) + +## 一、在本章中你会学到什么? + +- 我们将列出计算机的不同硬件部分。 +- 我们将看到一个程序是什么以及它的样子。 +- 我们将了解如何加载和执行程序。 + +## 二、 技术概念 + +- 存储器单元,算术和逻辑单元,输入/输出,控制单元 +- 中央内存,辅助内存 +- 挥发性和非易失性内存 +- 随机存取存储器/只读存储器 +- 中央处理器 +- 高级和低级语言 +- 汇编语言编辑程序 +- 编译和解释语言 + +## 三、介绍 + +这本书是关于GO的。 在跳入我们的主要科目之前,您需要了解有关计算机的一些基本知识。 + +经验丰富的程序员可以跳过本章。 初学者应该花一些时间来研究它。 + +您的程序将在硬件上运行。 了解您的硬件如何工作可能会改善程序的设计。 + +首先,我们将描述计算机的主要组成部分。 然后我们将看到程序是什么以及机器如何处理它。 + +## 四、四个硬件组件 + +计算机由`四个`主要部分组成: + +- 存储数据和程序的存储器单元(MU)。 + - 例如,我们可以存储进入大学课程等级的内存单元。 我们还可以持有一个将计算班级平均等级的程序。 + +- 算术和逻辑单元(ALU)。 其作用是对存储到存储器单元的数据执行算术和逻辑操作。 该单元可以执行例如被称为操作的添加,递增,递减。 通常,每个操作需要两个操作数并输出结果。 + - 让我们说我们想要添加 5 和 4 。这两个数字是操作数。 此操作的结果为 9 操作数从存储器单元加载。 ALU是旨在执行操作的电路。 + +- 输入和输出单元(I / OU)将从输入设备负责将数据加载到存储器单元中。 该单元还将来自存储器单元的数据发送到输出设备。 + - 输入设备例如是计算机的触摸板,键盘,鼠标。 + - 输出设备例如是您的监视器。 +- 控制单元(CU)将接收来自程序的指令,并将控制其他单元的活动。 + +四个硬件组件代表计算机组件的示意图。 + +## 五、内存 + +计算机由两种类型的内存组成: + +- 中央存储器 +- 辅助内存 + +存在两类内存: + +- 易变的 +- 非易失性 + +### 5.1 中央存储器 + +这种类型的内存是运行操作系统的必要条件以及计算机将运行的所有其他程序。 中央存储器包含两种类型的存储: + +- **RAM** (Random Access Memory)。这种类型的存储需要电力以持续数据。 关闭计算机后,将删除此类存储类型中包含的内存。 操作系统和您使用的程序将加载到此内存中。 这种类型的存储器是易失性的。 +- **ROM** (Read-Only Memory)。这是一个内存,包含计算机正确运行所需的数据。 这种内存不是易失性(当您关闭计算机时,不会被擦除)。 它旨在仅可读且未更新系统。 + +### 5.2 辅助内存 + +这种类型的内存不挥发。 当电源关闭时,存储的数据将不会被删除。 以下是辅助存储器的一些示例:硬盘驱动器,USB键,CD-ROM,DVD ...等。 + +与RAM相比,读取和写入此类型的内存缓慢。 + +一些硬盘顺序访问内存。 系统应尊重特定序列。 尊重该访问序列需要比随机访问模式更长的时间。 请注意,一些硬盘驱动器允许随机内存访问。 + +#### 5.2.1 SSD硬盘驱动器 + +硬盘驱动器也表示硬盘驱动器(HDD),由旋转的磁盘组成。 由于移动磁头,读写数据。 读取和写入将产生旋转和磁头移动,消耗时间。 + +SSD(固态驱动器)没有那样构造。 磁盘没有磁头。 相反,数据存储在闪存单元中。 数据访问更快地播放此类磁盘。 请注意,SSD还花费超过传统的电磁硬盘驱动器。 + +## 六、CPU + +CPU是中央处理单元的初始。 CPU也表示处理器。 CPU包含: + +- 算术和逻辑单元(ALU) +- 控制单元(CU) + +CPU将负责执行程序给出的指令。 例如,程序可以指示在两个数字之间执行添加。 这些数字将从存储器单元检索并传递给ALU。 该程序还可能需要执行I / O操作,例如从硬盘驱动器读取数据并将其加载到RAM中以进行进一步处理。 CPU将执行这些指令。 + +CPU是计算机的中心组件。 + +## 七、什么是编程? + +让计算机做点什么,我们必须用精确的指示喂它们。 这组指令被称为“程序”。 + +在更官方定义之后,程序是“使计算机硬件的计算机指令和数据定义的组合”[@ Institute1990ieee]。 + +让我们举个例子。 想象一个要求用户键入两个数字的程序。 该程序添加了这些数字,然后在显示器上显示结果。 必须写入的说明是: + +1. 输出“请在显示器上键入您的第一个数字并按Enter键”。 +2. 当键入的数字键入并在键盘上按下“Enter”键时,将数字存储到内存中。 让我们表示这个数字。 +3. 输出“请在显示屏上键入第二个数字并按Enter键”。 +4. 当键入的数字键入并在键盘上按下“Enter”键时,将数字存储到内存中。 让我们表示B这个号码。 +5. 发送到ALU两个数字(A和B)和添加操作码并将结果存储到内存中。 +6. 输出显示器上的结果。 + +执行两种类型的指令: + +- I / O操作:将存储到内存中的数字检索,将数字存储到内存中,从输入设备(键盘),从内存加载数据,并将其显示给用户。 +- 算术运算:添加两个数字。 + +我们这里有一组以简单的英语编写的指令。 机器不懂英语句子。 这些句子需要转换为机器理解的语言。 这是什么语言? + +## 八、如何与机器说话? + +### 8.1 编程语言都是正式语言 + +给予机器的指令是用编程语言编写的。 编程语言是正式语言。它们由由字母表构成的单词(一组不同的字符)组成。 这些单词是在特定规则下组织的。 Go是一个编程语言,如x86汇编,java,c,c ++,javascript ... + +它们是两种类型的编程语言: + +- 低级 +- 高级 + +低级编程语言更接近处理单元的说明。 更高级别的语言提供了构造,使他们更容易学习并在日常使用。 + +编译了一些高级语言,其他语言被解释为,其中一些是介于两者之间。 我们将在下一节中看到这两个术语的意思。 + +![](imgs/programming_languages_lowHighCompInterp.41e11926.png) + +### 8.2 机器语言 + +要与计算机的处理单元交谈,我们可以使用机器语言。 机器语言完全由 0 和 1 组成。 以机器语言编写的指令是 0 和 1 的套件。每个处理器(或处理器系列)将定义称为指令集的指令列表。 有一个指令要添加到数字,递增1,减少一个,将数据复制到内存中的一个位置到另一个地方......等。 + +可以将计算机程序直接写入机器语言。 但是,这并不容易。 + +### 8.3 汇编语言 + +汇编语言是一种低级编程语言。 以汇编语言编写的程序的指令对应于机器指令。 汇编语言使用助记符,这是与机器指令对应的小单词。 例如,*MOV* 将指示机器将数据从一个位置移动到另一个位置。 开发人员也可以评论代码(通过机器语言不可能)。 + +要在汇编语言中创建程序,开发人员将写入一个或多个文件的指令。 这些文件是命名的源文件。 + +以下是用x86 Linux汇编编写的指令的示例: + +```assembly +// assembly code +mov eax,1 +int 0x80 +``` + +软管两条线将执行将关闭程序的系统调用(“1”表示系统呼叫号,这意味着“退出程序”)。 请注意,汇编语言与机器不同。 我们说这是机器特定的。 + +汇编程序用于将以汇编语言编写的源文件转换为对象代码文件。 我们说我们组装该计划。 然后,链接器将将这些对象代码文件转换为可执行文件。 可执行文件包含所有计算机启动程序的必要指令。 + +![](imgs/assembly_to_executable.926437cf.png) + +### 8.4 高级语言 + +市场上有大量的高级别语言,就像 Go 一样。 那些语言不受机器架构密切束缚。 它们提供了一种写入说明的便捷方式。 例如,如果我们想让系统调用退出我们的程序,我们可以写入: + +```go +os.Exit(1) +``` + +通过 C 语言,我们可以写: + +```c +// C Code +exit(1) +``` + +通过 Java 语言,我们可以写: + +```java +// Java Code +System.exit(1); +``` + +在此示例中,我们不必将数字移动到寄存器中; 我们使用语言构造(函数,包,方法,变量,类型......)。 本书的目标是为您提供对构建GO应用程序的那些工具的精确和简明的定义。 + +高级程序也写入文件。 文件名为“源文件”。 通常,编程语言需要为文件名添加特定的扩展名。 对于Go程序,我们将在我们将写入的每个文件的末尾添加“.go”。 在PHP中,扩展名为“.php”。 + +写入源文件时,无法立即执行它们定义的程序。 需要使用编译器编译源文件。 编译器将源文件转换为可执行文件。 编译器也是一个程序。 Go是编译语言系列的一部分。 + +![](imgs/compiler.adc1a3b1.png) + +#### 8.4.1 编译型 vs 解释型 + +请注意,一些编程语言被解释。 当写入源文件时,程序员不需要编译源。 使用源文件准备好,系统可以通过解释器执行程序。 写入源文件的每个指令被解释器转换并由解释器执行。 在某些情况下,解释器在缓存中存储编译版本的程序以提升性能(源文件每次未翻译)。 PHP,Python,Ruby,Perl是解释的语言。 + +## 九、自测 + +### 9.1 问题 + +1. 程序储存在哪里? +2. 从硬盘驱动器读取数据比来自RAM的数据慢。 对或错? +3. 你能写入ROM吗? 对或错? +4. 两种类型的内存是什么? +5. “挥发性内存”的定义是什么? +6. 哪个程序将代码写入汇编语言转换为目标代码? +7. 哪个程序将对象代码转换为可执行文件? +8. 与低级别语言相比,提供高级别语言的两个优点? +9. Go 是一种解释的语言吗? 对或错? + +### 9.2答案 + +1. 程序储存在哪里? + 1. 内存单元(mu) +2. 从硬盘驱动器读取数据比来自RAM的数据慢。 对或错? + 1. 对的。 对RAM的提取和写入数据速度快,而存储存储到硬盘驱动器的数据通常需要更长时间。 +3. 你能写入ROM吗? 对或错? + 1. 错。这种类型的内存只能读。它是用来存储系统的(操作系统)。 +4. 两种类型的内存是什么? + 1. 中央存储器 + 2. 辅助存储器 +5. “挥发性内存”的定义是什么? + 1. 关闭计算机后,将删除易失性存储器。 +6. 哪个程序将代码写入汇编语言转换为目标代码? + 1. 汇编程序将作为输入汇编语言代码和生成机器代码。 +7. 哪个程序将对象代码转换为可执行文件? + 1. 链接器 +8. 与低级别语言相比,提供高级别语言的两个优点? + 1. 它们提供了更易于使用的高级构造。 + 2. 代码不具体到机器的技术架构。 我们说代码是便携式的。 +9. Go 是一种解释的语言吗? 对或错? + 1. 错。Go 是编译型语言。 + +## 十、关键点 + +- 在宏观级别,计算机由以下组成: + - 存储器单元(MU):存储数据和程序 + - 算术和逻辑单元(ALU):执行计算 + - 输入和输出单元(iou):管理输入设备和输出设备。 + - 控制单元(CU)将在执行所执行的程序给出的指令之后管理MU,ALU和IOU + +- CPU意味着中央处理单元(也称为处理器或微处理器)由Alu和Cu组成。 + +- 程序是一组指令。 + +- 开发人员用编程语言编写程序。 + +- 编程语言由单词和字符组成,这些字符必须按照指定的规则订购。 + +- 它们是高级别的节目编程语言。 + +- 机器语言和汇编语言是低级别的。 以这些语言编写的说明与硬件组织和功能密切相关。 他们提供了很少的抽象。 + +- Go是编译的高级编程语言。 + +## 参考文献 + +[Institute1990ieee]电气,和电子工程师。 1990.“软件工程术语的IEEE标准词汇表:1990年9月28日批准,IEEE标准委员会。” 电子工程师。 \ No newline at end of file diff --git a/chap-1-programming-a-computer/imgs/2-the-go-language.49d63fe2.jpg b/chap-1-programming-a-computer/imgs/2-the-go-language.49d63fe2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71e4edcf279dcd24a894e83563cbad85e99d4ddb Binary files /dev/null and b/chap-1-programming-a-computer/imgs/2-the-go-language.49d63fe2.jpg differ diff --git a/chap-1-programming-a-computer/imgs/assembly_to_executable.926437cf.png b/chap-1-programming-a-computer/imgs/assembly_to_executable.926437cf.png new file mode 100644 index 0000000000000000000000000000000000000000..563f2d3f8b32d17063bf6eb31222ca34bfd71148 Binary files /dev/null and b/chap-1-programming-a-computer/imgs/assembly_to_executable.926437cf.png differ diff --git a/chap-1-programming-a-computer/imgs/compiler.adc1a3b1.png b/chap-1-programming-a-computer/imgs/compiler.adc1a3b1.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f71bab388c3c348120dc34a6fc6e8366ad0839 Binary files /dev/null and b/chap-1-programming-a-computer/imgs/compiler.adc1a3b1.png differ diff --git a/chap-1-programming-a-computer/imgs/programming_languages_lowHighCompInterp.41e11926.png b/chap-1-programming-a-computer/imgs/programming_languages_lowHighCompInterp.41e11926.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e9a1a365cb102042a5a39cbc55040dfd9ba132 Binary files /dev/null and b/chap-1-programming-a-computer/imgs/programming_languages_lowHighCompInterp.41e11926.png differ diff --git a/chap-2-the-go-language/2-the-go-language.md b/chap-2-the-go-language/2-the-go-language.md new file mode 100644 index 0000000000000000000000000000000000000000..b9b74656602b75a2340f8ad711f54e32525d7c81 --- /dev/null +++ b/chap-2-the-go-language/2-the-go-language.md @@ -0,0 +1,154 @@ +# GO语言 + +![](imgs/2-the-go-language.49d63fe2.jpg) + +## 一、你在本章中能学到什么? + +- Go的起源:什么时候被创造和谁创造的。 + +- 创造的动机。 +- 语言的主要特征是什么? + +## 二、技术概念 + +- 编译时间 + +- 静态类型的语言 + +- 并发 +- 垃圾收集器 +- 软件依赖项 + +## 三、创造的神话 + +Go创建了一个神话。 这门语言出生在谷歌办公室里面,它发生在一个非常长的构建过程中,花了45分钟。 + +这个故事是Rob Pike 在[@ go-at-google](https://www.practical-go-lessons.com/chap-2-the-go-language#go-at-google)。 它为我们提供了一块关于Go创建背后动机的珍贵信息。 建设时间太长,太痛苦了......他们必须找到一种方法来避免它们;这就是Go Genesis的切入点。 + +Robert Griesemer,Ken Thompson 和 Rob Pike 是开发者,它开始于2007年开始工作。Rob Pike 声称,到2008年年中,该语言 "基本设计完毕,实现(编译器、运行时)开始工作"。 之后,Ian Lance Taylor和Russ Cox于2008年加入了该团队[@ Pike2009Go]。 + +Go是一种开源的编程语言,由其社区和在谷歌工作的核心开发人员团队维护。2011年3月16日是Go的第一次发布日期。它被命名为 "r56")。Go版本1于2012年3月28日发布。 + +## 四、动机 + +Go(或Golang)是由Google建立的,用来解决公司的问题。为了更好地理解其中的原因,值得阅读Rob Pike [@go-at-google] 的主题演讲。 + +世界性大公司的软件有哪些挑战? + +- 谷歌服务的代码库非常庞大。谷歌有数百万行的代码。 + +- 这些行是用不同的语言编写的。C、C++、Java,以及其他语言。 + +- 这些应用程序的构建时间 "已经拉长到许多分钟,甚至几个小时"。 + +- 一些应用程序部分的更新可能是昂贵的。 + +第一批Gophers [1](#refer-anchor-1)的目标是通过以下方式使开发者的生活更轻松。 + +- 大幅度减少程序的构建时间。 + +- 为接触过C、C++或Java的年轻开发者设计一种易于学习、阅读和调试的语言。 + +- 设计一个有效的依赖性管理系统。 + +- 构建一种能够在硬件上产生良好规模的软件的语言。 + +### 4.1 一些概念的定义 + +- **构建时间**:编译器生成机器可读的可执行文件所需的时间。 + +- **静态类型语言**:给这个概念下一个精确的定义现在还为时过早。我们将在接下来的章节中介绍这个术语。 + +- **依赖性**:一个软件被另一个软件所使用。 + +- **可扩展性**:一个程序处理越来越多的任务的能力。例如,如果一个网站能够接受越来越多的请求而不发生停机或增加加载延迟,那么这个网站就可以说是可扩展的。 + +## 五、Go的主要特点 + +Go的创造者将他们的努力集中在几个关键的设计选择上: + +- 编译型语言 + +- 具有易于理解和学习的语义 + +- 静态类型 + +- 有一个内置的并发系统,便于开发者工作 + +- 具有强大的依赖性管理 + +- 有一个垃圾收集器 + +正如Rob Pike所说,其主要目的是为开发人员提供一种易于学习的、用于 "大型软件项目工程 "的语言。 + +### 5.1 一些概念 + +- **并发**:当任务可以不按顺序或按部分顺序执行时,程序就是并发的[2](#refer-anchor-2)。 +- **垃圾收集器(通常称为GC)**:当我们构建程序时,我们需要存储数据并从内存中获取数据。内存不是一个无限的资源。因此,开发人员必须确保存储在内存中的未使用的元素不时地被销毁。将一些数据放入内存称为分配;反过来的动作,包括从内存中删除数据,称为去分配。垃圾收集器的作用是在内存不再被使用时进行去分配。当语言没有任何垃圾收集器时,开发者必须收集他的垃圾并释放不再使用的内存...... 碰巧,Go有一个垃圾收集器。 + +## 六、Go的现状 + +- 该项目发展得非常快,现在有超过一千名贡献者[3](#refer-anchor-3)。 + +- 在撰写本文时(2020年1月8日),Go的最新版本是**1.15.6**。 + +- 很多聚会和会议都是为了联合社区而组织的[4](#refer-anchor-4) + - 2018年,共组织了19次会议:3次在美国,16次在其他国家[5](#refer-anchor-5) + - 在2017年,有13个会议被组织起来 + +- Go被开发者所青睐。 + - 在2018年、2019年和2020年的Stackoverflow开发者调查中,Go是前三名最受欢迎的编程语言[@dev-survy-2018]。 + +## 七、自测 + +### 9.1 问题 + +1. Go语言的诞生日期是什么? +2. 并发是什么意思? +3. 平均而言,Go显示的构建时间非常长?真的还是假的? + +### 9.2答案 + +1. Go语言的诞生日期是什么? + 1. 2007 +2. 并发是什么意思? + 1. 当任务可能在同一时间执行时,程序就是并发的。 +3. 平均而言,Go显示的构建时间非常长?真的还是假的? + 1. 错。该语言是为了解决这个确切的问题而创造的。 + +## 八、关键点 + +- Go 诞生于2007年 + +- Go第一版于2012年发布 + +- 该语言很容易理解。它的语义仍然很简单。 + +- 它是静态类型的 + +- 它是可以编译的 + +- 你可以用Go编写并发程序。 + +
+- [1] 这是Go程序员的昵称。 + +
+- [2] 我们将在另一章中深入探讨这一概念。定义取自https://en.wikipedia.org/wiki/Concurrency_(computer_science) + +
+- [3] 2019年8月13日,Go项目有1,349名贡献者 + +
+- [4] 查看此页https://github.com/golang/go/wiki/coferences + +
+- [5] 这些数字摘自网页https://github.com/golang/go/wiki/Conferences,于2019年8月13日检查。 + +## 参考文献 + +- [go-at-google] ---。2012. "Go at Google: 为软件工程服务的语言设计。" https://talks.golang.org/2012/splash.article。 +- [pike2009go] Pike, Rob. 2009. "Go编程语言"。在Google的技术讲座上发表的演讲。 +- [go-at-google] ---。2012. "Go在谷歌。为软件工程服务的语言设计。" https://talks.golang.org/2012/splash.article。 +- [dev-survy-2018] "Stackoverflow开发者调查2018。" 2018年。https://insights.stackoverflow.com/survey/2018/。 + diff --git a/chap-2-the-go-language/imgs/2-the-go-language.49d63fe2.jpg b/chap-2-the-go-language/imgs/2-the-go-language.49d63fe2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71e4edcf279dcd24a894e83563cbad85e99d4ddb Binary files /dev/null and b/chap-2-the-go-language/imgs/2-the-go-language.49d63fe2.jpg differ diff --git a/chap-2-the-go-language/imgs/assembly_to_executable.926437cf.png b/chap-2-the-go-language/imgs/assembly_to_executable.926437cf.png new file mode 100644 index 0000000000000000000000000000000000000000..563f2d3f8b32d17063bf6eb31222ca34bfd71148 Binary files /dev/null and b/chap-2-the-go-language/imgs/assembly_to_executable.926437cf.png differ diff --git a/chap-2-the-go-language/imgs/compiler.adc1a3b1.png b/chap-2-the-go-language/imgs/compiler.adc1a3b1.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f71bab388c3c348120dc34a6fc6e8366ad0839 Binary files /dev/null and b/chap-2-the-go-language/imgs/compiler.adc1a3b1.png differ diff --git a/chap-2-the-go-language/imgs/programming_languages_lowHighCompInterp.41e11926.png b/chap-2-the-go-language/imgs/programming_languages_lowHighCompInterp.41e11926.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e9a1a365cb102042a5a39cbc55040dfd9ba132 Binary files /dev/null and b/chap-2-the-go-language/imgs/programming_languages_lowHighCompInterp.41e11926.png differ