汇编代码和字节码有什么区别?

41
在寻找源代码、字节码、汇编代码、机器码、编译器、链接器、解释器、汇编器和其他所有含义之间的差异时,我只是对字节码和汇编代码的区别感到困惑。特别是维基百科文章中介绍CIL的部分让我感到困惑,因为它似乎可以交替使用这两个术语(汇编代码和字节码),使我认为它们可能完全相同。

如果您可以访问Andrew Tanenbaum的《结构化计算机组织》一书,他将会给出这两个术语的技术正确定义。 - J. Polfer
请参考关于Java类似问题的此答案 - tripleee
请参见https://dev59.com/tHTYa4cB1Zd3GeqPriyt。 - tripleee
7个回答

23

汇编代码通常指的是机器本地语言(即所谓的机器语言)的可读形式。另一方面,字节码通常是一种可以由字节码解释器解释的语言,因此它不是处理器的本地语言。

那么为什么会有混淆呢?你不能这样比较汇编语言和字节码。当然,字节码也可以有汇编代码——即其人类可读形式,因为"汇编语言"并不一定意味着它是为了一个真正的机器而设计的,它只是某种本地语言的人类可读形式——对于处理器来说,这种本地语言就是机器码。但你也可以用伪(或解释性)机器像字节码的汇编代码。

另请参见:汇编语言

当然,IT人员(包括我自己)在措辞上往往比较懒惰,这会带来进一步的困扰——正如你在这里看到的所有讨论一样。 "汇编语言"经常被用来谈论机器码,这当然不完全正确,因为汇编语言只是某些机器代码的人类可读形式。


IT人员(希望)做的是抽象出形式。机器码和汇编之间的映射是为了优化目标受众、CPU或人类而执行的。 - rsp

3
汇编代码通常是指一旦编译成机器码后,可以由CPU执行的代码,而字节码则是在虚拟机中运行的。可能与CIL相关的混淆源于这样一个事实:对于CPU X的机器码可以由在CPU Y上运行的虚拟机进行解释(例如)。请注意,虚拟机实现可以被设计为解释任何机器码和/或字节码:这取决于开发人员及其抱负(以及手头的时间);-)

1
再次强调:汇编代码不是由真正的CPU执行的。被执行的是“机器码”。汇编代码是机器码的人类可读形式(或在某些情况下是字节码)。 - Juergen

3
我记得自从微控制器和微处理器诞生之初,汇编语言一词就被用来指代人类可读的机器码。似乎微软使用相同的“汇编语言”一词来命名其dotNET Framework编译器生成的字节码,导致了混淆。因此,在这种情况下,我认为Java运行时环境中“字节码”的含义类似于Microsoft dotNET运行时环境中“汇编语言”这个新词的含义。我这样假设是错误的吗?

我很确定有关Java的结论是不正确的(尽管其他内容都是正确的)。我不知道Java是否有一个字节码集合的名称(在.jar文件中?),但如果有的话,我认为它不叫“汇编”。也许是“包”或“库”。有一些东西,比如http://maven.apache.org/plugins/maven-assembly-plugin/,可以将一堆东西(包括文档)收集到一个“装配件”中,类似于.net,但据我所知没有关联。对于操作Java字节码(包括通过反射在运行时进行操作?),有一个名为[tag:java-bytecode-asm]的Java包。 - Peter Cordes

1

汇编代码可以在具有特定指令集的CPU上运行,而字节码可以在任何能够运行虚拟机(如Java运行时)的CPU上执行。


"汇编代码"也被称为"机器码",只是为了澄清。请参阅我回答中的链接。 - Juergen
当你提到“汇编代码”时,这当然不是机器码,因为它必须先由汇编器“组装”--然后得到的才是机器码。 - Juergen

0
汇编语言是一种宏语言。它是一组用于指导CPU或其他设备的指令。它被翻译成机器码,这些机器码是CPU可读的指令。
字节码是虚拟机的指令,需要被解释执行,但在执行之前仍需要被翻译成机器码。

1
汇编语言不一定是宏语言。基本形式的汇编语言仅是可读性更高的机器码形式。 - Juergen

-1

字节码主要用于平台无关性,需要虚拟环境才能运行。

汇编代码是人类可读的机器代码(在稍微高一些的层次上),直接由CPU运行。

字节码不是机器/硬件特定的(直接处理硬件),但汇编代码是机器/硬件特定的。


正如其他答案所指出的那样,您可以为字节码编写汇编语言,即字节码的人类可读文本版本。甚至有一个 [tag:java-bytecode-asm] 的 SO 标签。(因此,硬件机器代码的汇编语言通常与其他汇编语言有所区别。) - Peter Cordes

-3

汇编代码是(代表)您正在编程的处理器的本机代码。

字节码是“命令”的二进制版本的术语,这些命令被编译为由解释器或虚拟机执行。

实质上,字节码定义了虚拟处理器的操作码,而汇编由物理处理器的操作码组成。(现在我们将忽略CPU内部的微码 :-))


3
不完全正确。汇编代码是机器码的可读形式。机器码是处理器的本机代码。 - Juergen
@Juergen,您混淆了形式和内容,这是细节或上下文决定“CPU操作码”、“机器语言”、“汇编语言”等术语之间的区别。在OP的问题背景下,它们在我看来是等效的。 - rsp
1
在我看来,你混淆了事情,因为IT人员在措辞方面经常很懒散,导致事情变得混乱。汇编语言是一种人类可读的机器语言表示(也可以是虚拟机——例如字节码)的表现形式。请参阅我在答案中提供的维基百科文章。 - Juergen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接