【问题标题】:What exactly is bytecode?究竟什么是字节码?
【发布时间】:2013-07-07 11:56:23
【问题描述】:

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

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

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

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

【问题讨论】:

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

标签: assembly programming-languages bytecode


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    Java 平台: 高级语言 -> 字节码 字节码由JVM等VM执行

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

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

    【讨论】:

      【解决方案3】:

      正式地,没有“字节码”之类的东西(至少在 Java 中没有)——它只是“代码”。 (您在 Java 虚拟机规范中的任何地方都找不到“字节码”。)

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

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

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

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

      【讨论】:

        【解决方案4】:

        是的,Bytecode 是机器前代码;这又由虚拟运行时处理并转换为机器代码(转换为 0/1)。如果是 java,它是 bytecode,如果是 .NET,它是 IL/CIL

        取自Here

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

        【讨论】:

        • Qbasic有同样的东西吗?因为是口译员?
        • 不是我(虽然我知道投反对票是因为有人问为什么投反对票)。但是,字节码转换为机器码并不是普遍正确的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        • 2012-08-27
        • 2010-11-12
        • 2011-03-18
        • 2011-01-22
        • 1970-01-01
        相关资源
        最近更新 更多