据我了解,处理器电路从芯片到芯片会有很大差异,因此执行相同高级代码可能需要不同的低级指令。所有程序最终是否都转换为汇编语言后成为原始机器码,或者这一步骤已不再必要?
如果是这样,那么处理器何时开始执行自己独特的指令集?这是代码的最低层次,所以程序指令是否在这一点上按位由处理器执行?
最后,所有架构都需要汇编语言吗?
据我了解,处理器电路从芯片到芯片会有很大差异,因此执行相同高级代码可能需要不同的低级指令。所有程序最终是否都转换为汇编语言后成为原始机器码,或者这一步骤已不再必要?
如果是这样,那么处理器何时开始执行自己独特的指令集?这是代码的最低层次,所以程序指令是否在这一点上按位由处理器执行?
最后,所有架构都需要汇编语言吗?
汇编语言是一种人类可读的表达器处理器执行指令的方式(这些指令是二进制数据,非常难以被人类管理)。因此,如果机器指令不是由人类生成的,则不需要使用汇编步骤,尽管有时出于方便而使用。如果从诸如C ++之类的语言编译程序,则编译器可以直接生成机器代码,而无需经过汇编代码的中间阶段。尽管如此,许多编译器都提供了生成汇编代码的选项,以使人类更容易检查所生成的内容。
许多现代语言(例如Java和C#)被编译成所谓的字节码。这是CPU不直接执行的代码,而是一种中间形式,在程序执行时可能会即时(JIT-ted)编译为机器代码。在这种情况下,会生成与CPU相关的机器代码,但通常不通过人类可读的汇编代码进行。
以下是可能让您感到困惑的一些内容:
#!/bin/sh
脚本中调用echo foo
可以称为“机器指令”。大多数shell甚至不会预编译成字节码,但即使像CPython这样的解释器也不称它们为机器指令,因为硬件不能直接运行它们。也许是“指令”或“字节码指令”。(有一些CPU具有一些硬件辅助运行Java字节码和Lisp机器,这模糊了界限...) - Peter Cordesadd eax,ecx
之类的简单指令变成了单个内部uop,而现代RISC CPU(如ARM或AArch64)可以将它们支持的几乎每个指令作为单个内部操作运行。(这正是RISC哲学的核心点,毕竟,它允许更容易的流水线处理。)现代CPU仅在复杂指令(例如syscall
)或角落情况(例如次标准FP数学)中使用微码。 - Peter Cordes