diff --git a/chap-1-programming-a-computer/1-example.md b/chap-1-programming-a-computer/1-example.md deleted file mode 100644 index 0de721f7bfafd6e64539e48e422a02376fed201a..0000000000000000000000000000000000000000 --- a/chap-1-programming-a-computer/1-example.md +++ /dev/null @@ -1,31 +0,0 @@ -# Chapter 1: Programming A Computer - -![](imgs/1-programming.2b932230.jpg) - -## 1 What will you learn in this chapter? - -- We will list the different hardware parts of a computer. -- We will see what a program is and how it looks like. -- We will understand how a program is loaded and executed. - -## 2 Technical concepts covered - -- Memory Unit, Arithmetic and Logic Unit, Input/Output, Control Unit -- Central memory, Auxiliary memory -- Volatile and non-volatile memory -- RAM/ROM -- CPU -- High and low-level languages -- Assembly language, assembler -- Compiled and interpreted language - -## 3 Introduction - -This book is about Go. Before jumping into our main subject, you need to know some basic knowledge about computers. - -Experienced programmers can skip this chapter. Beginners should take some time to study it. - -Your programs will run on hardware. Knowing how your hardware is working may improve the design of your programs. - -Firstly we will describe the main components of a computer. Then we will see what a program is and how the machine handles it. - diff --git a/chap-1-programming-a-computer/chap-1-programming-a-computer.md b/chap-1-programming-a-computer/chap-1-programming-a-computer.md new file mode 100644 index 0000000000000000000000000000000000000000..8e87da7ddd522bf08d151f060f819fca0f2b65cc --- /dev/null +++ b/chap-1-programming-a-computer/chap-1-programming-a-computer.md @@ -0,0 +1,212 @@ +# 在计算机上编程 + +![](imgs/1-programming.2b932230.jpg) + +## 1 本章中能学到的内容 +- 我们将列出计算机的不同的硬件部分 +- 我们将了解什么是程序,以及它长什么样 +- 我们将了解程序是如何加载以及运行的 +## 2 本章中提及的技术概念 + +- 存储单元、ALU(算术逻辑单元)、I/O、控制单元 +- 中央存储器、辅助存储器 +- 易失性和非易失性存储器 +- RAM/ROM +- CPU +- 高级语言、低级语言 +- 汇编语言、汇编程序 +- 编译型以及解释型语言 +## 3 介绍 +这是一本关于Go的书。在进入我们的主要内容之前,你需要知道一些基础的计算机知识。 +​ + +有经验的程序员可以跳过这一章节,而初学者应该花费一点事件来学习。 +​ + +你所编写的程序将在硬件上运行。所以了解你的硬件是如何工作的,可能会改进你的程序设计。 +​ + +首先,我们将描述计算机的主要组成部分。然后我们再看看什么是程序,以及机器如何处理它。 +## 4 四大硬件组件 +计算机是由**四**个主要部分构成: + +- **存储单元(MU)**是存储数据和程序的地方。 + - 例如,我们可以将某个大学班级的成绩存储到内存单元中。我们还可以存放一个用来计算班级平均成绩的程序。 +- **算术和逻辑单元(ALU)**的作用是对存储再内存单元中的数据进行算数和逻辑运算,例如加法、递增递减等,这些称为**操作**。一般来说,每个操作需要两个操作数,并输出一个结果。 + - 假设我们想将5和4相加。这两个数就是操作数。这个操作的结果是9。操作数是从 MU 中加载得到。ALU是一个旨在执行操作的电路。 +- **输入输出单元(I/OU)**负责将数据从**输入**设备加载到存储单元上。该单元还将数据从存储单元发送到**输出**设备上。 + - 输入设备是,例如,你的电脑的触摸板,你的键盘,你的鼠标。 + - 输出设备是,例如,你的显示器。 +- **控制单元(CU)**将会接受程序发出的指令并控制其他单元的活动 + +这四个硬件组件代表了计算机组件的**原理图(schematic view)**​ +## 5 存储器 +计算机由两种类型的存储器组成: + +- 中央存储器 +- 辅助存储器 + +存在两类存储器 + +- 易失性 +- 非易失性 +### 5.1 中央存储器 +这种类型的存储器是运行操作系统以及所有跑在你的计算机上的程序所必需的。中央存储器包含两种类型的存储: + +- **RAM**(随机存取存储器)。这类存储器需要电力来存储数据。当你关闭计算机时,这类存储器所包含的数据将被清除。操作系统和你使用的程序都装载在这个存储器中。这类存储器是**易失性的**。 +- **ROM**(只读存储器)。这是一种包含计算机正确运行所需数据的存储器。这类存储器是**非易失性的**(数据不会随着计算机的关闭而被清除)。它被设计为只读,不能被系统更新。 +### 5.2 辅助存储器 +这种类型的存储器**非易失性的**。下面是一些辅存的例子:硬盘、USB、CD、DVD等等 +​ + +与 RAM 相比,这类存储的读写速度要更**慢** +​ + +一些硬盘会顺序地访内存。系统应该遵守一个特定的顺序。遵守这个访问顺序比随机访问地方式需要更长的时间。请注意,有些硬盘允许随机内存访问。 +#### 5.2.1 固态硬盘 +硬盘,也被称为硬盘驱动器(HDD),是由旋转的磁片组成的,数据的读写则是通过一个移动的磁头。读写会导致(磁盘的)旋转和磁头移动,这个过程将会消耗一些时间。 +​ + +固态硬盘的结构与此不同,它既没有磁头,也没有磁片。取值而代的是,数据被存储在闪存单元中。在这种磁盘上,访问数据的速度更快。请注意,固态硬盘的成本也比传统的磁盘更高。 +## 6 CPU +CPU 是**中央处理单元**。CPU 也被成为**处理器**。CPU 包含: + +- ALU +- CU(这两个见上文) + + + +CPU负责执行程序给出的指令。比如,程序可以指示:执行两个数字之间的加法。这些数字将被从内存单元中检索出来并传递给 ALU。程序也可能要求执行一些 I/O 操作,比如从硬盘中读取数据并加载到 RAM 进行进一步的处理。CPU 将执行这些指令。 +​ + +CPU 是计算机的核心部件。 +## 7 什么是程序 +为了让计算机做一些事情,我们需要给它下达精确的指令,这样的一组指令被称为程序。 +​ + +按照更加正式的定义,程序是“使得计算机硬件进行计算的计算机指令和数据定义的组合”[@institute1990ieee] +​ + +举个例子,想象一个需要用户输入两个数字的程序,这个程序将这些数字相加,并将结果显示在显示器上。那么需要编写的指令是: + +1. 在显示器上输出 “请输入你的第一个数字并按回车键”。 +1. 当输入一个数字并按下键盘上的 "Enter" 键时,将该数字存入内存。让我们用`A`来表示这个数字。 +1. 在显示器上输出 "请输入第二个数字并按回车键"。 +1. 当输入一个数字并按下键盘上的 "Enter" 键时,将该数字存储到存储器中。让我们把这个数字表示为`B`。 +1. 将`A`和`B`以及加法运算码发送到 ALU 中,并将结果存到内存中。 +1. 在显示器上输出结果。 + + + +这个过程执行了两种指令: + +- **I/O 操作**:检索存储在内存中的数字,将输入设备(键盘)中得到的数字存储到内存中,从内存中加载数据,并将其显示给用户。 +- **算术操作**:两数相加。 + + + +我们这里有一组用中文编写的指令。但机器并不能理解中文句子,这些句子需要被翻译成机器能理解的语言。那这种语言是什么呢? +## 8 如何与机器对话 +### 8.1 程序设计语言是形式语言 +给予计算机的指令是通过程序设计语言编写的。程序设计语言是**形式语言**,它们是由字母表(一组不同的字符)中的字母构成的词组成的。这些词是按照特定的规则组织的。Go 就是一种编程语言,就像 X86 汇编、Java、C、C++、JavaScript 一样…… +​ + +程序设计语言大致可以分为两类 + +- 高级语言 +- 低级语言 + + + +低级程序设计语言更接近处理单元的指令。高级语言提供了一些结构,使其更容易学习和日常使用。 +​ + +有些高级语言是编译型的,有些是解释型的,有些则介于两者之间。我们将在接下来的章节中看到这两个术语的含义。 +![](imgs/programming_languages_lowHighCompInterp.41e11926.png) + +### 8.2 机器语言 +为了能让计算机的处理单元理解我们的意图,可以使用**机器语言**。机器语言完全由0和1组成的,用机器语言编写的指令是0和1的组合。每个处理器(或者一族处理器)都会定义一个指令列表,称为**指令集**。指令集中就有对数字进行加法、增一、减一、把数据从内存中的一个位置复制到另一个位置……等指令。 +​ + +你可以直接用机器语言编写计算机编写指令,不过,这并不容易。 +### 8.3 汇编语言 +汇编语言是一种**低级程序设计语言**。用汇编语言编写的程序的指令与机器指令相对应。汇编语言使用助记符——对应着机器指令的简短单词——进行编写。比如,`MOV`指令将指示机器把数据从一个位置移动到另一个位置。开发人员还可以对代码进行注释(这在机器语言中是不可能的)。 +​ + +想要用汇编语言创建一个程序,开发人员需要将指令写入一个或多个文件,这些文件称为**源文件**。 +​ + +这是一个用x86 Linux 汇编语言编写的一条指令: +``` +// assembly code +mov eax,1 +int 0x80 +``` +这两行代码将执行一个关闭程序的系统调用("1"是代表“退出程序”的系统调用的数字)。需要注意的是,汇编语言在不同机器上是不同的,这被称作**特定于机器(machine-specific ,或者说不独立于机器)。** +**​** + +**汇编器**是用来将汇编语言编写的源文件转换成目标代码文件,这被称作**汇编(assemble)**。然后,链接器将把这些目标代码文件转化为可执行文件。一个可执行文件包含所有计算机启动程序的必要指令。 +![](imgs/assembly_to_executable.926437cf.png) +### 8.4 高级语言 +市场上有许多高级语言,比如 Go。这些语言不再于机器架构紧密相关。它们提供了一种编写指令的便捷方式。比如,如果我们想要发出一个系统调用来退出程序,我们可以用 Go 这么写: +```go +os.Exit(1) +``` +C语言: +```c +exit(1) +``` +Java: +```java +System.exit(1); +``` +在这个例子中,我们不需要把数字移到寄存器中;我们使用语言的结构(函数、包、方法、变量、类型...)。本书的目的是为你提供这些工具的精确和简洁的定义,以建立Go应用程序。 + + +高级语言程序也被写入文件。文件被命名为 "源文件"。一般来说,编程语言要求在文件名中加入一个特定的扩展名。对于Go程序,我们将在每个文件的末尾添加".go"。在PHP中,扩展名是".php"。 + + +在编写源文件时,它们所定义的程序不能立即执行。源文件需要通过**编译器**进行**编译**。编译器会将源文件转化为可执行文件。编译器也是一个程序。Go是编译语言家族中的一员。 +![](imgs/compiler.adc1a3b1.png) +#### 8.4.1 编译型 vs 解释型 +请注意,有些编程语言是解释性的。当源文件写好后,程序员不需要编译源文件。在源文件写好以后,系统可以通过解释器来执行程序。源文件中的每条指令都由解释器翻译并执行。在某些情况下,解释器将程序的编译后版本存在缓存中以提高性能(不用每次都翻译源文件)。PHP、Python、Ruby、Perl都是解释型语言。 +## 9 自我测试 +### 9.1 问 + +1. 程序存储在哪里? +1. 从硬盘中读取数据比 RAM 慢,是吗? +1. 你能否对 ROM 进行写入? +1. 存储器的类型是哪两种? +1. "易失性存储"的定义是什么? +1. 什么程序会将汇编语言代码翻译成目标代码? +1. 什么程序将目标代码翻译成可执行文件? +1. 说出两点高级语言对比低级语言的优势? +1. Go 是一种解释型语言吗? +### 9.2 答 + +1. MU +1. 是的。从 RAM 中读写数据快的惊人,而硬盘则通常要花费更长时间 +1. 不行。ROM 是只读的,用于存储操作系统 +1. 中央存储器和辅助存储器 +1. 计算机断电后会被清除的存储 +1. 汇编器 +1. 链接器 +1. 更易使用、与机器无关(不依赖于机器的架构,即所谓的可移植性) +1. 错误,Go 是编译型语言 +## 10 要点 + +- 在宏观层面上,计算机是由这些组成的: + - 存储单元 MU:存放数据与程序 + - 算术逻辑单元 ALU:进行计算 + - 输入输出单元 IOU:管理输入和输出设备 + - 控制单元 CU:按照程序执行的指令管理以上三个单元 +- CPU 是由 ALU 和 CU 组成的 +- 一个程序,就是一组指令 +- 开发人员通过程序设计语言编写程序 +- 程序设计语言是由必须按照制定规则排序的单词和字符组成的 +- 分为高级和低级程序设计语言 +- 机器语言和汇编语言都是低级语言,用这些语言编写的指令与硬件组织和能力紧密相连。它们的抽象程度很低 +- Go 是一种编译型的高级程序设计语言 +## 参考书目 + +- [institute1990ieee] Electrical, Institute of, and Electronics Engineers. 1990. “IEEE Standard Glossary of Software Engineering Terminology: Approved September 28, 1990, IEEE Standards Board.” In. Inst. of Electrical; Electronics Engineers. 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