多年来我一直在学习计算机编程,抽象层使我的理解变得模糊。假设我编译了一些源代码并且我有可执行的机器代码。一旦计算机运行此代码,会发生什么?
例如,假设我运行一个简单的 if then else 语句并拥有机器代码。执行此指令的计算机电路中发生了什么?
这取决于语言,但对于常规的可执行文件(如您从 C/C++ 获得的),机器代码是位模式,CPU 会将其解释为直接指令。如果您已经完成任何汇编,这些机器语言指令将与汇编指令一对一映射(如果您获得了 CS 学位,您最终应该参加一两门学习汇编的课程,甚至可能需要在汇编之间手动翻译和机器语言使用 CPU 参考)。
其他语言(如 Java 和 C#)稍微有点棘手,其中有一个中间“字节码”,在程序运行时将其解释并转换为机器代码,从而使它们能够实现一定的平台独立性。
至于指令本身做什么,它取决于CPU,但其中一些可以是如下所示:
可能更多。
*寄存器是存在于 CPU 中的一些非常小但非常快的内存空间;某些寄存器用于某些指令。其中之一是当前指令寄存器,它保存要执行的下一条指令的地址。直接改变这个值会跳转到一个新的地址,类似于一个goto语句。
**堆栈是一个内部堆栈,可以以先进后出的方式从中存储和检索值。这就是函数调用的实现方式。像 Hansel 和 Gretel 一样,我们在身后留下面包屑的痕迹,以便我们可以找到回家的路。
此外,关于如何组织指令集有两种“思想流派”:RISC 和 CISC(精简指令集计算机和复杂指令集计算机)。在 RISC 计算机中,功能较弱的指令要少得多,程序员或编译器可以使用它们的组来完成更复杂的事情。在 CISC 计算机中,有越来越多的强大指令,但有一些冗余。基于 Intel 的 CPU 是 CISC。
也可以看看: