我们以 Python 为例。如果我没记错的话,当你在其中编程时,计算机首先将代码“翻译”为 C。然后再从 C 到汇编。汇编是用机器代码编写的。(这只是我对此的一个模糊想法,如果我错了,请纠正我)但是机器代码是用什么写的,或者更准确地说,处理器如何处理它的指令,它如何“找出”要做什么?
4 回答
如果我没记错的话,当你在其中编程时,计算机首先将代码“翻译”为 C。
不,它没有。C 没有什么特别之处,只是它是用于系统编程的最广泛的编程语言。
Python 解释器将 Python 代码翻译成由虚拟机执行的所谓 P 代码。该虚拟机是读取 P-Code 的实际解释器,P-Code 的每个 blip 都会使解释器执行预定义的代码路径。这与本机二进制机器代码控制 CPU 的方式并无太大区别。一种更现代的方法是将 P 代码翻译成本地机器代码。
CPython 解释器本身是用 C 语言编写的,并已编译为本机二进制文件。基本上,本机二进制文件只是一长串数字(操作码),其中每个数字指定一个特定的操作。一些操作码告诉机器它后面定义的数字不是操作码而是参数。
CPU 本身包含一个所谓的指令解码器,它按数字读取本机二进制数,并且对于它读取的每个操作码,它都会为执行此特定操作码的 CPU 电路供电。有地址内存的操作码,将数据从内存加载到寄存器的操作码等等。
处理器如何处理它的指令,它如何“找出”要做什么?
对于每个只是二进制模式的操作码,CPU 上都有自己的电路。如果操作码的模式与启用此操作码的“开关”匹配,则其电路会对其进行处理。
这是一本关于它的 WikiBook: http ://en.wikibooks.org/wiki/Microprocessor_Design
几年前,有人用简单的功能逻辑和内存 IC 构建了一个完整的工作计算机,即不涉及微控制器或类似设备。整个名为“Big Mess o' Wires”的项目或多或少是一个从头开始构建的 CPU。唯一更书呆子的就是用单个晶体管构建那个东西(实际上并没有那么困难)。他还提供了一个模拟器,让您可以查看 CPU 在内部如何工作,解码每条指令并执行它:Big Mess o' Wires Simulator
编辑:自从我最初写这个答案以来,已经完成了从现代分立组件构建一个成熟的 CPU:为了您的考虑,构建了一个 MOS6502(为 Apple II、Commodore C64、NES、BBC Micro 等提供动力的 CPU)来自唱片: https ://monster6502.com/
机器代码不“与处理器通信”。
相反,处理器“知道如何评估”机器代码。在 [广泛使用的] Von Neumann架构中,这个机器代码(程序)可以被认为是一个可索引的数组,其中每个单元都包含一个机器代码指令(或数据,但我们现在先忽略它)。
CPU“查看”当前指令(通常由 PC 或程序计数器识别)并决定做什么(这可以直接使用晶体管/“裸机”完成,或者将其转换为更低级别的代码):这被称为fetch-decode-execute循环。
执行指令时会发生副作用,例如设置控制标志、将值放入寄存器或跳转到程序中的不同索引(更改 PC)等。请参阅这个简单的 CPU 概述,它涵盖了上面好一点。
它是对每条指令的评估——当它遇到时——以及导致传统处理器运行的副作用的交互。
(当然,现代 CPU非常复杂,并且可以做很多巧妙而棘手的事情!)
这就是所谓的微码。是 CPU 中的代码读取机器代码指令并将其转换为低级数据流。
例如,当 CPU 遇到add
指令时,微码描述了它应该如何获取这两个值,将它们提供给 ALU 进行计算,以及将结果放在哪里。
电。电路、存储器和逻辑门。
另外,我相信 Python 通常是解释的,而不是通过 C → 汇编 → 机器代码编译的。