因为它相当于人的大脑,我们教给计算机的指令实际上就是 CPU 在一条一条地执行,执行过程中会读写内存里的数据,会调用各种外设的接口(通过一种叫做“设备驱动”的软件模块)来完成数据的输入输出(I/O)操作。
[x] CPU 的本质是什么?
CPU 是一种计算机芯片。
[x] 有哪些芯片?它们之间有何不同?
芯片可以执行的指令是在设计时就定好的,不同芯片有不同的指令集,固化在硬件里,一般无法改变。因为大小、发热和功耗等问题,芯片的指令集不能面面俱到,而是有所侧重,比如一般计算机里 CPU 芯片比较擅长整数的运算,而 GPU(图形处理芯片,也就是显卡)比较擅长浮点数的运算,计算机图形处理尤其是 3D 图形处理会涉及大量的浮点运算,所以通常交给 GPU 去做,又快又省电;后来人们发现除了 3D 图形处理,人工智能等领域的一些科学计算也多是浮点运算,所以 GPU 也被拿来做这些计算工作。而我们的手机里的芯片,是把 CPU/GPU 还有其他一些做特殊工作的芯片集成在一块硅晶片上,这样可以节省空间,也能节约功耗,这种高度集成的芯片就叫 SoC(System on Chip)。
3. 了解 汇编
[x] CPU 可以执行的代码长啥样?
_add: ## @add
push rbp
mov rbp, rsp
mov dword ptr [rbp - 4], edi
mov dword ptr [rbp - 8], esi
mov esi, dword ptr [rbp - 4]
add esi, dword ptr [rbp - 8]
mov eax, esi
pop rbp
ret
_main: ## @main
push rbp
mov rbp, rsp
sub rsp, 16
mov dword ptr [rbp - 4], 0
mov edi, 27
mov esi, 15
call _add
add rsp, 16
pop rbp
ret
- [x] 这种代码叫什么名字?
> 汇编指令(assembly)。
- [x] CPU 实际执行的指令是什么?
> 机器指令(machine code)。
- [x] CPU 可以执行的代码——汇编指令(assembly)和 CPU 实际执行的指令——机器指令(machine code)之间有什么关系?
> 汇编指令(assembly)和 机器指令(machine code)几乎一样了,只是机器语言是二进制的,全是 01011001 这样,而汇编将其翻译成了我们稍微看得懂的一些指令和名字。
- [x] 汇编指令集包含多少指令?
> 机器可以直接执行的指令其实不多,在 Intel 官方的 x64 汇编文档 里列出的常用指令码只有 20 多个,上图中的 mov push pop add sub call ret 等都是。
- [x] 计算机执行的这些指令是什么意思?
> - 把数放到某地方,可能在 CPU 内部也可能在内存里;
> - 对某地方的数进行特定运算(通常是加减乘除);
> - 跳转到另一个地方执行一段指令;
> - 返回原来的位置继续执行。 如此这般。
## 4. 了解 编译器
- [x] 既然 CPU 实际上就只会这种语言,别的它都听不懂,那对于那些涉及复杂的逻辑流程的任务,难道我们要直接写汇编代码来操作计算机吗?那写起来也太费劲了吧?
> 想来想去,是不是有可能我们用某种方式写下我们解决问题的方法,然后让计算机把这些方法翻译成上面那种计算机懂的指令呢?这种翻译的程序肯定不好写,但是一旦写好了以后所有人都可以用更接近人话的方式表达,计算机也能自己翻译给自己并且照做了,所谓辛苦一时享受一世,岂不美哉。程序员的典型思维就是这样:如果有个对人来说很麻烦的事情,就要试试看是不是可以让计算机来做。
>
> 这个想法早已被证明完全可行,这样的翻译程序叫做“编译器(compiler)”。现在存在于世的编程语言有数百种,每一种都对应一个编译器,它可以读懂你用这语言写的程序,经过词法分析(tokenizing)、语法分析(parsing)、语义分析(semantic analysis)、优化(optimization)和代码生成(code emission)等环节,最终输出像上面那样机器可以看懂和执行的指令。
- [x] 那上面的汇编代码是 "什么语言" 通过 "什么编译器" 翻译出来的?
> 是如下的 C 语言代码通过 LLVM/Clang 编译器的处理生成的:
```c
int add(int a, int b) {
return a + b;
}
int main() {
return add(27, 15);
}
[x] C 语言是什么样的一种语言?
C 语言被公认是最接近机器语言的“高级编程语言”,因为 C 语言对内存数据的管理方式几乎和机器语言是一样的“手工操作”,需要编程者非常了解 CPU 对内存的管理模式。但尽管如此,C 语言还是高级编程语言,很接近我们人类的语言,基本上一看就懂。
1. 了解 “程序”、“编程语言” 和 “编程”
2. 了解 计算机系统和 CPU
3. 了解 汇编
_main: ## @main push rbp mov rbp, rsp sub rsp, 16 mov dword ptr [rbp - 4], 0 mov edi, 27 mov esi, 15 call _add add rsp, 16 pop rbp ret
5. 了解 解释器和解释运行
6. 总结
Logging
2020-02-13 20:31:13 initialize