2013-07-07 69 views
0

字节码是汇编代码和机器代码之间的中间形式的代码吗?字节码与目标码相同吗?字节码究竟是什么?

这就是我的想法 - 高水平的语言 - >大会语言 - >机器代码/对象代码(0和1为不同的CPU不同。)

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

我读过这个 - SO- bytecode vs assembly language code,但需要了解更好

+0

一般来说(术语的含义通常取决于您正在讨论的特定开发/执行环境)“对象代码”是指已编译并驻留在“对象模块”中的代码 - 包含两者的文件机器指令和其他“支持”数据,例如重定位信息和调试信息。 “机器代码”OTOH指的是已经“加载”(可能来自“目标模块”)到执行它们的合适位置的机器指令。 –

+0

[汇编代码和字节码有什么区别?](https://stackoverflow.com/questions/1782415/what-is-the-difference-between-assembly-code-and-bytecode)可能的重复 – roottraveller

回答

4

字节码只不过是虚拟机的指令集。这个实现可能涉及或不涉及机器码的JIT。通常情况下,它不会。例如,官方的Lua实现解释字节码,而不是将其转换为机器码。 .NET和Java实现几乎总是将“热路径”编译成机器代码,以实现更高效的执行。最终,这是一个虚拟机实现细节,与字节码本身无关,这只是虚拟机的指令。

对象代码AFAIK始终是机器代码。

-1

是,Bytecode是机器预代码;然后由虚拟运行时保持谨慎,并转换为机器代码(转换为0/1)。在Java的情况下,它是bytecode和.NET的情况下,它是IL/CIL

Here

字节码两者,也称为p代码(可移植代码),是由软件 解释器设计用于高效执行 指令集的形式。不同于人可读的源代码,字节代码是编码的解析和事物 像类型,范围和程序对象的嵌套深度语义分析的结果紧凑 数字代码,常数,和参考文献(通常数字地址) 。因此,它们比直接解释 源代码具有更好的性能。

+0

Qbasic有相同的东西吗?因为是翻译? –

+0

downvoted它的人 - 关心解释为什么? –

+0

是不是我(虽然我知道downvote因为有人问为什么downvote)。然而,字节码转换为机器码并不普遍。 –

1

Java平台: 高级语言 - >字节码 字节码是由VM如JVM

执行

.Net平台: 高级语言 - > CIL(通用中间语言)---就在编译(JIT)--->本机代码

本地编译时间: 高级语言 - >目标代码(本机代码)---连接 - >可执行文件(本机代码) 链接负责修复变量之间的地址引用r事情。

1

据官方称,由于(至少不是在Java中)“字节码”没有这样的事 - 这是简单的“代码”。 (您不会在Java虚拟机规范中的任何位置找到“字节码”。)

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

虚拟机指令的概念一般同意源于UCSD Pascal的“p代码”以及一些相关的早期Pascal语言实现。基本上,这些是编译器“intermediate language”的一种形式,可以直接由“virtual machine”解释,与需要额外编译步骤以转换为本机机器码相对。通常,虚拟机指令集被设计为(尽可能地)是“机器独立的”,并且不特定于任何特定的操作系统或硬件指令集。

字节码指令通常是对“stack architecture”的简单操作。堆栈体系结构非常方便,因为它易于编译,允许“指令”非常简单,易于解释,并且是常规编译器场景中后续优化和代码生成步骤的方便“源”。 (一个明显的例外是虚拟机,其指令集不是堆栈架构,而是基于寄存器的架构。)

在Java中,Java程序最常见的情况是最初是“解释“,其中字节代码由JVM解释器”执行“。然后,如果单独的方法被确定为“热”(高度使用),则使用“即时编译器”(JITC)将各个方法编译到“目标”硬件的指令集中。其他语言实现可以保持完全解释或可以立即翻译成机器指令。