首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当JIT同时编译字节码时,为什么Java同时被编译和解释呢?

当JIT同时编译字节码时,为什么Java同时被编译和解释呢?
EN

Stack Overflow用户
提问于 2014-01-02 10:20:07
回答 7查看 19.4K关注 0票数 14

我读到,java源代码被编译成‘字节码’,然后JIT又把它‘编译’成‘机器代码’。也就是说,源代码首先编译成独立于平台的字节码,然后再编译成机器特定的代码。那么为什么它被称为解释语言和编译语言呢?解释在哪里进行的?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-01-02 10:25:12

这里有点误会。

在正常情况下,java编译器(javac)将java代码编译成字节码,java解释器(java)则对这些字节码(逐行)进行解释,并将其转换为机器语言并执行。

JIT(Just in time)编译器的概念有点不同。JVM维护函数执行次数的计数。如果它超过了极限,那么JIT就会出现在画面中。java代码直接编译成机器语言,并在此基础上执行该函数。

票数 19
EN

Stack Overflow用户

发布于 2014-01-02 10:25:30

Java是一种编程语言。

它有一个规范( JLS),它定义了Java程序应该如何工作。

作为一种语言本身,它没有指定应该如何在不同的平台上执行。它的运行方式,无论是使用JIT还是不使用JIT,都是完全基于实现的。

  • 如果我明天编写了一个根本不做JIT编译的Java运行时,我可以调用Java解释器。
  • 如果我使用使用Java字节码作为程序集的Java (人们认真地制造了),我可以调用Java严格编译。

许多其他语言都这样做:

  • python是一种解释语言吗?(CPython)还是JITed (PyPy)?
  • Lua是被解释的(旧的lua解释器)还是编译的(LuaJIT)?
  • 是解释JavaScript (IE6样式)还是编译它(v8)?
票数 9
EN

Stack Overflow用户

发布于 2014-01-02 10:25:30

为了精确起见,让我们明确这不是一个Java编程语言问题,而是一个JVM特性。

在JVM最初的实现中,JIT不存在,字节码总是被解释。这是由于一项设计决定,即使编译后的代码独立于运行java的物理机器和操作系统,直到今天仍然有效。

作为以后的改进,JIT是在JVM实现中引入的,以获得更快的执行速度,但是字节码必须仍然有效,并在转换为二进制文件之前通过所有验证。这样,您就可以保持平台的独立性、所有的健全性和安全性检查,从而获得性能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20880716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档