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