什么是字节码?

5

字节码是否是汇编代码和机器代码之间的中间形式?字节码与目标代码是否相同?

我认为应该是这样的 - 高级语言 -> 汇编语言 -> 机器代码/目标代码(0和1。对于不同的CPU是不同的)

是这样吗? 高级语言 -> 汇编语言 -> 字节码(将由虚拟机处理,将其转换成机器代码) -> 机器代码

我已经阅读过这篇文章 - SO- bytecode vs assembly language code,但需要更好地理解它。


一般来说(术语的含义通常取决于您所讨论的特定开发/执行环境),“目标代码”是指已编译并驻留在“目标模块”中的代码 - 一个包含机器指令和其他“支持”数据(如重定位信息和调试信息)的文件。另一方面,“机器码”指的是已经被“加载”(可能是从“目标模块”中)到适当位置以便执行它们的机器指令。 - Hot Licks
可能是汇编代码和字节码有什么区别?的重复问题。 - roottraveller
4个回答

9
字节码只是虚拟机的指令集。其实现可能涉及JIT转化为机器码,也可能不需要。例如,官方Lua实现会解释字节码而非将其转换成机器码。.NET和Java实现通常会将“热点路径”编译成机器码以获得更高效的执行。最终,这是虚拟机实现的细节,与字节码本身无关,它只是虚拟机的指令。
据我所知,目标代码始终是机器码。

1
Java平台: 高级语言 -> 字节码 字节码由虚拟机(如JVM)执行
.Net平台: 高级语言 -> CIL(通用中间语言)--即时编译(JIT)-->本地机器码
本地编译: 高级语言 -> 目标代码(本地机器码)---连接到--->可执行文件(本地机器码) 链接负责修复变量等地址引用。

1

官方上来说,在Java中并不存在所谓的“字节码”(至少没有这个术语)——它只是“代码”。(在Java虚拟机规范中找不到“字节码”一词。)

但非正式地,它是应用于Java .class文件中Java方法定义的“Code”属性中的虚拟机“指令”的术语。该术语也被应用于几种其他语言(如C ++)的虚拟机指令(可能没有更多的“严格性”)。

虚拟机指令的概念通常认为起源于UCSD Pascal的“p-code”和几个相关的早期Pascal语言实现。基本上,它们是一种编译器“中间语言”,可以直接由“虚拟机”解释,而无需额外的编译步骤来转换为本机机器码。通常,虚拟机指令集被设计为尽可能“与机器无关”,而不特定于任何特定的操作系统或硬件指令集。

字节码指令通常是针对“堆栈架构”上的简单操作。堆栈架构非常方便,因为易于编译,允许“指令”非常简单,易于解释,并且是常规编译器场景中后续优化和代码生成步骤的方便“源”。(一个显著的例外是安卓Dalvik虚拟机,其指令集不是堆栈架构,而是基于寄存器的架构。)
在Java中,最常见的是Java程序最初被“解释”,使用JVM的解释器“执行”字节码。然后,如果确定个别方法是“热点”(高度使用),则使用“即时编译器”(JITC)将个别方法编译成“目标”硬件的指令集。其他语言实现可能完全解释或立即转换为机器指令。

-1

是的,Bytecode 是预先的机器码;然后由虚拟运行时处理并转换为机器码(0/1)。在 Java 中是 bytecode,在 .NET 中是 IL/CIL

摘自这里

字节码,也称为 p-code(可移植代码),是一种指令集,旨在通过软件解释器进行高效执行。与人类可读的源代码不同,字节码是紧凑的数字代码、常量和引用(通常是数字地址),它们编码了对程序对象的类型、范围和嵌套深度进行解析和语义分析的结果。因此,它们比直接解释源代码具有更好的性能。


QBasic有同样的东西吗?因为它是一个解释器? - huseyin tugrul buyukisik
不是我(虽然我以前可能因为有人问“为什么要踩我”而踩过)。但是,并非普遍适用的是字节码会被转换成机器码。 - Hot Licks

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