在寻找源代码、字节码、汇编代码、机器码、编译器、链接器、解释器、汇编器和其他所有含义之间的差异时,我只是对字节码和汇编代码的区别感到困惑。特别是维基百科文章中介绍CIL的部分让我感到困惑,因为它似乎可以交替使用这两个术语(汇编代码和字节码),使我认为它们可能完全相同。
汇编代码通常指的是机器本地语言(即所谓的机器语言)的可读形式。另一方面,字节码通常是一种可以由字节码解释器解释的语言,因此它不是处理器的本地语言。
那么为什么会有混淆呢?你不能这样比较汇编语言和字节码。当然,字节码也可以有汇编代码——即其人类可读形式,因为"汇编语言"并不一定意味着它是为了一个真正的机器而设计的,它只是某种本地语言的人类可读形式——对于处理器来说,这种本地语言就是机器码。但你也可以用伪(或解释性)机器像字节码的汇编代码。
另请参见:汇编语言
当然,IT人员(包括我自己)在措辞上往往比较懒惰,这会带来进一步的困扰——正如你在这里看到的所有讨论一样。 "汇编语言"经常被用来谈论机器码,这当然不完全正确,因为汇编语言只是某些机器代码的人类可读形式。
汇编代码
通常是指一旦编译成机器码
后,可以由CPU执行的代码,而字节码
则是在虚拟机中运行的。可能与CIL相关的混淆源于这样一个事实:对于CPU X的机器码
可以由在CPU Y上运行的虚拟机进行解释(例如)。请注意,虚拟机实现可以被设计为解释任何机器码和/或字节码:这取决于开发人员及其抱负(以及手头的时间);-).jar
文件中?),但如果有的话,我认为它不叫“汇编”。也许是“包”或“库”。有一些东西,比如http://maven.apache.org/plugins/maven-assembly-plugin/,可以将一堆东西(包括文档)收集到一个“装配件”中,类似于.net,但据我所知没有关联。对于操作Java字节码(包括通过反射在运行时进行操作?),有一个名为[tag:java-bytecode-asm]的Java包。 - Peter Cordes汇编代码可以在具有特定指令集的CPU上运行,而字节码可以在任何能够运行虚拟机(如Java运行时)的CPU上执行。
字节码主要用于平台无关性,需要虚拟环境才能运行。
汇编代码是人类可读的机器代码(在稍微高一些的层次上),直接由CPU运行。
字节码不是机器/硬件特定的(直接处理硬件),但汇编代码是机器/硬件特定的。
汇编代码是(代表)您正在编程的处理器的本机代码。
字节码是“命令”的二进制版本的术语,这些命令被编译为由解释器或虚拟机执行。
实质上,字节码定义了虚拟处理器的操作码,而汇编由物理处理器的操作码组成。(现在我们将忽略CPU内部的微码 :-))