不懂底层的程序员不是好程序员,解密代码在计算机中运行原理
- 2019 年 12 月 26 日
- 筆記
程序与计算机的关系
还记得Windows的CMD吗?只需向这个黑框框输入指令,计算机即可做出相对应的响应。其实计算机的运行本身就是依靠向CPU下达一条一条的指令,并使计算机按指令运行。计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。
计算机的核心就是CPU,其作用就如同人类的心脏。
计算机基本架构
想要了解程序如何在计算机中运行,以及C/C++编程中设计的内存、地址、指针等概念,就必须要先了解计算机的基本架构;

计算机架构
CPU中主要由寄存器、时钟、CU(控制单元)、ALU(算术逻辑单元)
时钟:是对 CPU 内部操作与系统其他组件进行同步。
CU:协调参与机器指令执行的步骤序列。
ALU:执行算术运算以及逻辑运算。
CPU 通过主板上 CPU 插座的引脚与计算机其他部分相连。分别连接至数据总线、控制总线和地址总线。
寄存器:寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。在C++程序中向函数在实参传递时会将实参存入寄存器,需要反复重复使用的变量也最好放到寄存器中。
内存存储单元:狭义上的内存指的就是我们所说的内存条,但实际上 CPU 也不是直接操作内存的,因为其读写速度远远赶不上 CPU ,因此在内存和 CPU 之间还有“缓存”,如一级缓存、二级缓存, CPU 读取数据时操作的都是缓存。内存主要用于在程序运行时保存指令与数据。它接受来自 CPU 的数据请求,将数据从随机存储器 (RAM) 传输到 CPU,并从 CPU 传输到内存。
Cache:在寄存器和内存中间还有存在着一个叫Cache的高速缓冲存储器。由于CPU的运行速度远高于内存读写速度,因此CPU如果直接从内存中存取数据就需要等待一定时间,但是Cache能保存着CPU刚用过或循环使用的一部分数据,这样当下次CPU使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。
四者之间的关系是:

CPU<->寄存器<->缓存<->内存
代码执行流程
首先通过高级语言编写的程序,需要通过编译和链接翻译成计算机能识别的指令:
比如这样一行C语言代码:puts("VIP会员");,在计算机执行时却是10110000 10101011 00110001 00011100 00110011 00111110 01010011 11110000;
编译流程如图:

编译流程
程序执行的流程可以简单归纳为:取指 (Fetch)、译码 (Decode) 和执行 (Execute)
例如:要执行a = b +c;有两个输入操作数 (b 和 c),—个输岀操作数 (a)。
1、将编译过代码读取缓存区
2、将代码编译成计算机指令
3、CPU 从指令队列区域取得指令,并立即增加指令指针的值。
4、CPU 对指令的二进制位模式进行译码。这种位模式可能会表示该指令有操作数(输入值)。
5、CPU 从寄存器和内存中取得操作数。这步可能会包含地址计算。
6、使用步骤 3 得到的操作数,CPU 执行该指令。同时更新部分状态标志位,如零标志 (Zero)、进位标志 (Carry) 和溢出标志 (Overflow)。
7、输出操作数,若输出也是指令的一部分CPU 还需要存储其结果操作数。

代码执行原理
