什么是字节码?

时间:2013-07-07 11:56:23

标签: assembly programming-languages bytecode

字节代码是汇编代码和机器代码之间的代码的中间形式吗?字节码和目标代码是一样的吗?

这就是我的想法 - 高级语言 - >汇编语言 - >机器代码/对象代码(0和1,不同CPU的不同)

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

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

4 个答案:

答案 0 :(得分:6)

字节码只不过是VM的指令集。执行此操作可能会或可能不会涉及JIT到机器代码。通常,它没有。例如,官方Lua实现解释字节码而不是将其转换为机器代码。 .NET和Java实现几乎总是编译"热路径"进入机器代码以实现更高效的执行。最终,这是一个VM实现细节,与字节码本身无关,它只是VM的指令。

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

答案 1 :(得分:1)

Java平台: 高级语言 - >字节码 字节代码由VM执行,例如JVM

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

原生编译: 高级语言 - >对象代码(本机机器代码)---链接到 - >可执行文件(本机代码) 链接负责修复变量的地址引用等。

答案 2 :(得分:1)

官方说来,没有“字节码”这样的东西(至少在Java中没有) - 它只是“代码”。 (您不会在Java虚拟机规范中的任何位置找到“字节码”。)

但非正式地,它是在Java .class文件中的Java方法定义的“Code”属性中应用于虚拟机“instructions”的术语。这个术语也适用于其他几种语言(如C ++)的虚拟机指令(可能不再“严格”)。

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

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

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

答案 3 :(得分:-1)

是的,Bytecode是机器前代码;反过来由虚拟运行时处理并转换为机器代码(进入0/1)。对于java,它是bytecode,而对于.NET,它是IL/CIL

取自Here

  

字节码,也称为p码(便携式码),是一种形式   设计用于软件高效执行的指令集   翻译。与人类可读的源代码不同,字节码是紧凑的   数字代码,常量和引用(通常是数字地址)   它编码事物的解析和语义分析的结果   类似于程序对象的类型,范围和嵌套深度。他们   因此,比直接解释更好   源代码。