在寻找源代码、字节码、汇编代码、机器代码、编译器、链接器、解释器、汇编器等所有含义的各种差异时,我只对字节码和汇编代码之间的区别感到困惑。
特别是这篇描述 CIL 的维基百科文章的介绍让我感到困惑,因为它似乎可以互换使用这两个术语(汇编代码和字节码),这让我认为它们的含义可能完全相同。
汇编代码通常确实意味着机器本机语言(所谓的机器语言)的人类可读形式。另一方面,字节码通常是一种可以被字节码解释器解释的语言——所以它不是处理器的本地语言。
那为什么会混乱呢?您不能以这种方式比较汇编语言与字节码。当然,字节码也可以有汇编代码——意味着它的人类可读形式,因为“汇编语言”并不一定意味着它适用于真实机器——但它是某种本地语言的人类可读形式——对于处理器,这种本地语言是机器代码——但你也可以拥有伪(或解释)机器的汇编代码,如字节码。
另见: 汇编语言
当然,进一步的痛苦也随之而来——就像您在此处的所有讨论中看到的那样——因为 IT 人员(包括我自己)往往措辞松懈。在谈到机器代码时,经常使用“汇编语言”。这当然不是完全正确的,因为汇编语言只是某些机器代码的人类可读形式。
我记得自从微控制器和微处理器出现以来,Assembly 这个词就被用来以人类可读的方式指定机器代码。在我看来,微软通过使用相同的词“Assembly”来命名他们的 dotNET Framework 编译器生成的 ByteCode 引起了混乱。因此,在这种情况下,我会说“字节码”对 Java 运行时的含义类似于“Assembly”一词的新用法对 Microsoft dotNET 运行时环境的含义。我认为这是错误的吗?
Assembly code
通常用于指代一旦编译为,就可以在虚拟机中Machine Code
由 CPU 执行的代码。bytecode
对 CIL 造成混淆的原因可能与machine code
CPU X 可以由运行在 CPU Y 上的虚拟机解释(例如)有关。
请注意,可以制作虚拟机实现来解释任何机器代码和/或字节码:它留给开发人员和他们的愿望(以及他们手中的时间);-)
汇编代码可以在具有特定指令集的 CPU 上运行,而字节码可以在可以运行 VM 的任何 CPU 上的虚拟机(例如 Java 运行时)中执行。
汇编程序是一种宏语言。它是一组用于指示 CPU 或其他设备的指令。它被翻译成机器代码,这些机器代码是 CPU 可读的指令。
字节码是虚拟机要被解释的指令,在执行之前仍然需要翻译成机器码。
字节码主要是为了平台独立,需要虚拟环境才能运行。
汇编代码是由 CPU 直接运行的人类可读的机器代码(在更高级别)。
字节码不是机器/硬件特定的(直接处理硬件),但汇编代码是机器/硬件特定的。
汇编代码是(代表)您正在编程的处理器的本机代码。
字节码是“命令”的二进制版本的术语,被编译为由解释器或虚拟机执行。
本质上,字节码定义了虚拟处理器的操作码,而汇编由物理处理器的操作码组成。(我们现在将忽略 CPU 内的微码 :-))