【问题标题】:is bytecode treated as instruction set for JVM?字节码是否被视为 JVM 的指令集?
【发布时间】:2014-02-07 08:10:42
【问题描述】:

我在wiki 中阅读了有关instruction set 的内容,我偶然发现了这一段:

一些支持字节码作为 ISA 的虚拟机,例如 Smalltalk、Java 虚拟机和微软的通用语言 运行时,通过翻译常用的字节码来实现 本机机器代码的代码路径。此外,这些虚拟 机器通过解释执行不常用的代码路径 (参见:即时编译)。 Transmeta 实现了 x86 以这种方式在 VLIW 处理器上设置指令集。

这到底是什么意思? 是bytecodesISA 用于JVMJVM 依次支持ISA 的处理器。

【问题讨论】:

    标签: java jvm bytecode processor instruction-set


    【解决方案1】:

    是的,正如你所猜测的那样。 JVM/JRE 使用 Java 字节码作为其指令集,每个 JVM 都需要在本机/本地硬件(以及本地指令集)上进行编译和运行。我认为这张来自维基百科的图表很好地说明了这一点:

    JRE/JVM 需要针对其运行的特定硬件进行编译,尽管 JVM 本身的 Java 字节码定义和解释保持不变。正如您所指出的,Java 字节码可以看作是 Java 源代码和本地机器/二进制代码之间的一种抽象层。它确实允许在典型的 Java 程序员和需要了解任何特定于机器的东西之间分离关注点,因为几乎所有这些都由 JVM/JRE 处理。

    【讨论】:

    • 我不会将“Java API”放在 JVM 组件下方,因为大多数 Java API 都是用 Java 实现的,并且与应用程序代码通过相同的链。
    【解决方案2】:

    字节码是 JVM 的 ISA

    字节码是JVM的指令。

    而 JVM 又支持处理器的 ISA。

    但是真正的处理器做真正的工作,所以 JVM 把这些变成本地指令。首先,它进行了交互,这很简单,但执行速度较慢,并且一旦优化了代码(这很昂贵),代码就可以像原始本机指令一样快速运行。

    【讨论】:

    • 那么说JVM在本机指令和字节码之间提供了一层抽象是正确的吗?
    【解决方案3】:

    JVM 基本上为 Java 程序模拟 CPU。就像 CPU 在硬件上本地执行组装的操作码一样,JVM 执行 Java 操作码,但严格在软件中执行。

    这到底是什么意思?字节码是 JVM 和 JVM 的 ISA 反过来支持处理器的 ISA。

    ISA(指令集架构)指定了适用于编写直接在 CPU 上运行的低级软件的一整套规则和技术。它包括一组操作码,它们是不可组合的直接 CPU 命令。 JVM 识别它自己的一组字节码(即 8 位操作码),这些字节码指导 JVM 执行解释器原语指令。所以,是的,字节码规范构成了 JVM ISA 的一部分。

    JVM 使用自己的内存逐个遍历执行它们的操作码列表 模拟硬件组件(例如堆栈、寄存器、主存储器)并使用原始算术和逻辑运算来模拟 ALU。这些模拟的组件也构成了 JVM 的 ISA。这是任何解释器的基本结构,给予或接受。然而,为了提高 Java 应用程序的运行时间,JVM 将“热点”编译为特定于机器的代码以获得最佳性能。热点是经常运行的代码部分。这称为“即时”编译,可以在程序执行时完成。这种技术使 Java 的性能更接近于编译语言。 JIT 也用于 .NET 框架。

    每个操作系统都有自己的 JVM 实现,这也可能因设备的 ISA 而异。例如,您可能有一个为 Linux-Arm、Linux-x86 或 Windows-x86 编写的 JVM。 JVM 本身可以用 C 之类的独立于平台(无论如何)的语言编写,但它的 JIT 编译器必须支持编译到设备的指令集。

    【讨论】:

    • 我想为新处理器编写 JVM 会很困难,一方面要处理 ISA 处理处理器,另一方面处理字节码!
    • @user1988876: 嗯...是的,你可以这么说:) 也许有一个成熟的开发人员团队,它不会那么糟糕。设计语言本身是困难的部分。
    • @user1988876:为字节码实现解释器或 JIT 编译器并不难,因为您只需要翻译大约 200 条指令。但让它真正工作意味着实现对象模型、内存管理、线程和同步、低级 I/O 部分等等。结果会是很多东西,在看到字节码部分是多么简单时,会消耗最初产生的热情。
    • 对不起,事实上不正确。 JVM 在任何意义上都不会“模拟 CPU”,字节码也不是假装处理器的指令。我对此表示反对,但您应该考虑删除您的答案,因为就目前而言,这根本不是真的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2019-12-22
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多