【问题标题】:Java bytecode interpreterJava 字节码解释器
【发布时间】:2011-07-15 23:39:39
【问题描述】:

我知道首先编译 java 程序并生成一个独立于平台的字节码。但是我的问题是为什么这个字节码在下一阶段被解释而不被编译,即使编译比一般解释要快??

【问题讨论】:

  • 您可以考虑为某些未知处理器使用bytecode 汇编程序。然后,通过结合为运行字节码的底层硬件生成的解释和(高度)优化代码来模拟处理器。
  • @isha - Cliff Click 在A JVM Does That 中关于 JIT 编译的部分可能会让您感兴趣。
  • @McDowell,我认为这是一块不错的手表,虽然它对于普通大众来说可能有点太先进了。

标签: java


【解决方案1】:

您回答了自己的问题。字节码与平台无关。如果编译后的代码被执行,那么它不会在每个操作系统上运行。这就是 C 所做的,这就是为什么每个操作系统都必须有一个版本的原因。

正如其他人所建议的,JVM 确实使用JIT 编译代码。它只是没有保存在任何地方。这是一个很好的总结

在字节码编译系统中,源代码被翻译成 称为字节码的中间表示。字节码不是 任何特定计算机的机器代码,并且可以在 计算机体系结构。然后字节码可以被解释,或者 在虚拟机上运行。 JIT 编译器读取字节码 许多部分(或很少完整)并以交互方式将它们编译成 机器语言,让程序运行得更快

【讨论】:

  • 事实上有些JVM会编译字节码来执行;它只是没有存储在任何地方:JIT (Just In Time) 编译
  • 好点!我的印象是 JIT 只编译选定的代码行,这些代码行执行了很多。也许它编译的不止这些。
  • AFAIK 这取决于 VM 的实现。 V.g,Sun 的 VM 在“服务器”模式下结合了解释和 JIT。无论如何,不​​知道其他JVM是如何工作的。我只想指出,编译代码的想法并没有被Java忽视,即使它坚持字节码和VM的优势。
  • 谢谢大家!!讨论让我清楚了编译过程和jit
【解决方案2】:

Java 字节码通常通过Just-In-Time (JIT) compilation 编译。

所以你最终仍然会执行完全编译的本机代码,唯一的区别是这个本机代码是由 JVM 在运行时生成的,而不是在编译源代码时静态生成的(就像发生在C/C++)。

这给 Java 带来了两大优势:

  • 通过将编译延迟到运行时,字节码保持完全可跨平台移植
  • 在某些情况下,JIT 编译器实际上可以生成更优化的本机代码,因为它能够利用通过在运行时检查代码的执行部分收集的统计信息。

当然,缺点是 JIT 编译器需要在应用程序启动时完成它的工作,这就解释了为什么 JVM 应用程序的启动时间比本机编译的应用程序的启动时间稍长。

【讨论】:

    【解决方案3】:

    您问题的基本前提不正确。大多数现代 Java 虚拟机都会将代码的频繁执行部分编译为本机机器码。

    这称为just-in-time compilation,简称 JIT。

    可以在here 找到对相关 Sun(现在是 Oracle)技术的很好的介绍。

    【讨论】:

      【解决方案4】:

      JVM 使用即时编译http://en.wikipedia.org/wiki/Just-in-time_compilation,因此比纯解释要快得多。

      【讨论】:

        【解决方案5】:

        字节码与平台无关。一旦编译成字节码,它就可以在任何系统上运行。

        正如维基百科所说,

        Just-in-time compilation (JIT),又称动态翻译,是 一种提高计算机程序运行时性能的方法。

        我建议您阅读这篇文章。它为 Java VM 提供了 basic working of JIT compiler

        JIT 编译器通过直接编译稍微改变了 VM 的角色 将 Java 字节码转换为原生平台代码,从而减轻 VM 的 它需要手动调用底层的原生系统服务。这 然而,JIT 编译器的目的并不是让 VM 放松。经过 将字节码编译为本机代码,执行速度可以大大提高 改进,因为本机代码可以直接在 底层平台。

        当安装了 JIT 编译器时,而不是 VM 调用 底层本机操作系统,它调用 JIT 编译器。 JIT 编译器反过来生成可以传递给 用于执行的本机操作系统。这样做的主要好处 安排是 JIT 编译器对 除了虚拟机之外的一切。

        【讨论】:

          猜你喜欢
          • 2018-10-08
          • 2010-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-08
          • 2010-12-05
          • 1970-01-01
          相关资源
          最近更新 更多