思考一个问题,如何将我们日常工作中写的代码让计算机识别并执行?

首先明确一个问题,计算机通常是不能够直接“读懂”我们所写的代码,那么就需要我们把代码翻译一遍,变成计算机可以识别的代码,那么这个翻译的过程叫做编译

编程语言的发展

  • 汇编,计算机底层语言,命令式写法,如MOV、JUMP等
  • 高级语言,对底层的封装,利于构造复杂的业务逻辑,如C、Java等

编译原理

以C语言为例,C语言编译器可以将繁琐复杂的程序转换为机器语言, 编译器需要了解语法构成原理。

  • 词法分析:全文扫描进行标记、删除注释等操
  • 语义分析:明确代码含义并转换为中间语言(介于机器语言和源程序)
  • 语法分析:根据C语言的设计规则,作语法分析,拆解变量、函数、表达式、判断等

CPU执行原理

一个有意思的现象,我们都知道光速很快 3×10^8 米每秒,1Ghz=每秒10亿次脉冲,那么一次时钟周期就是1/10 亿秒,光可以走大约30cm。

什么意思呢?由上可知,CPU运算、指令执行需要和其他模块通信,离得越近越好,否则必然带来延迟。所以就可以将全部模块都集成到一个CPU上面么?当然不行!一切都基于电子元件,电子元件工作就会发热,那么最需要解决的就是散热。所以我们取一个折中方案,存储器分级策略,将存储器使用频和距离CPU远近负相关。具体的分级策略按照离CPU由近到远的顺序如下:
image.png
所以离CPU越近,执行效率越高,并且满足向下存储/查找(key-value),即当寄存器没有值时,会顺序连续查找,所以对于连续数据的读写,CPU可以同时操作多个连续的内存地址。

因为无论上面存储器都有存储大小限制,那么思考一下假如寄存器、L1-Cache没有空间了,计算机会如何应对?

这里介绍两个概念:

  • 命中率,从寄存器一直到缓存L3,读写数据的命中率,一般在95%以上,只有5%会穿透到内存中
  • 置换,如果当L1-Cache已满,仍要再L1-Cache中增加数据,那么多余的数据如何置换问题