字节码是汇编代码和机器代码之间的一种中间形式的代码吗?字节码和目标码一样吗?
这就是我的想法-高级语言->汇编语言->机器代码/目标代码(0和1。不同的CPU不同)
是这样吗?高级语言->汇编语言->字节码(由虚拟机处理,将其转换为机器码)->机器码
我读过这个 - SO- 字节码与汇编语言代码,但需要更好地理解它
字节码是汇编代码和机器代码之间的一种中间形式的代码吗?字节码和目标码一样吗?
这就是我的想法-高级语言->汇编语言->机器代码/目标代码(0和1。不同的CPU不同)
是这样吗?高级语言->汇编语言->字节码(由虚拟机处理,将其转换为机器码)->机器码
我读过这个 - SO- 字节码与汇编语言代码,但需要更好地理解它
字节码只不过是 VM 的指令集。这个的实现可能会也可能不会涉及到机器代码的 JIT。通常,它不会。例如,官方的 Lua 实现解释字节码而不是将其转换为机器码。.NET 和 Java 实现几乎总是将“热路径”编译为机器代码,以便更有效地执行。归根结底,这是一个虚拟机实现细节,与字节码本身无关,它只是虚拟机的指令。
目标代码,AFAIK,始终是机器代码。
Java 平台:高级语言 -> 字节码 字节码由 JVM 等 VM 执行
.Net平台:高级语言->CIL(通用中间语言)---即时编译(JIT)--->本机机器码
本机编译:高级语言 -> 目标代码(本机机器代码)---链接到--> 可执行文件(本机机器代码) 链接负责修复变量的地址引用等。
正式地,没有“字节码”之类的东西(至少在 Java 中没有)——它只是“代码”。(您在 Java 虚拟机规范中的任何地方都找不到“字节码”。)
但非正式地,它是应用于 Java .class 文件中 Java 方法定义的“代码”属性中的虚拟机“指令”的术语。而且该术语也适用于(可能不再“严格”)用于其他几种语言(如 C++)的虚拟机指令。
虚拟机指令的概念被普遍认为起源于UCSD Pascal的“p-code”和一些相关的早期 Pascal 语言实现。基本上,这些是编译器“中间语言”的一种形式,可以直接由“虚拟机”解释,而需要额外的编译步骤才能转换为本地机器代码。通常,虚拟机指令集被设计为(尽可能地)“机器独立”,并且不特定于任何特定的操作系统或硬件指令集。
字节码指令通常是对“堆栈架构”的简单操作。堆栈架构很方便,因为它易于编译,允许“指令”非常简单,易于解释,并且是常规编译器场景中后续优化和代码生成步骤的方便“源”。(一个值得注意的例外是 Android Dalvik虚拟机,其指令集不是堆栈架构,而是基于寄存器的架构。)
在 Java 中,最常见的是 Java 程序最初被“解释”,字节码由 JVM 的解释器“执行”。然后,如果单个方法被确定为“热”(高度使用),则使用“即时编译器”(JITC)将单个方法编译到“目标”硬件的指令集中。其他语言实现可能保持完全解释或可能立即转换为机器指令。
是的,Bytecode
是预机器码;这反过来由虚拟运行时处理并转换为机器代码(转换为 0/1)。在 java 的bytecode
情况下是,在 .NET 的情况下是IL/CIL
.
取自这里
字节码,也称为 p-code(可移植代码),是一种指令集形式,旨在由软件解释器高效执行。与人类可读的源代码不同,字节码是紧凑的数字代码、常量和引用(通常是数字地址),它们对程序对象的类型、范围和嵌套深度等事物的解析和语义分析结果进行编码。因此,它们允许比直接解释源代码更好的性能。