首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java编译到底是如何进行的呢?

java编译到底是如何进行的呢?
EN

Stack Overflow用户
提问于 2010-08-04 23:12:23
回答 3查看 47.4K关注 0票数 63

被java编译过程弄糊涂了

好的,我知道这一点:我们编写java源代码,平台无关的编译器将其翻译成字节码,然后平台相关的jvm将其翻译成机器码。

因此,从一开始,我们就编写java源代码。编译器javac.exe是一个.exe文件。这个.exe文件到底是什么?java编译器不是用java写的,怎么会有.exe文件来执行它呢?如果编译器代码是用java编写的,那么编译器代码是如何在编译阶段执行的,因为执行java代码是jvm的工作。语言本身如何编译自己的语言代码?在我看来,这一切都像是鸡和蛋的问题。

现在,.class文件到底包含什么内容?它是文本形式的抽象语法树吗?是表格信息吗?它是什么?

谁能告诉我清楚和详细的方法,我的java源代码是如何转换成机器码。

EN

回答 3

Stack Overflow用户

发布于 2010-08-04 23:19:05

好吧,javac和jvm通常是本机二进制文件。它们是用C或其他语言写的。当然也可以用Java编写它们,只是您首先需要一个本机版本。这就是所谓的“引导”。

有趣的事实:大多数编译为本机代码的编译器都是用自己的语言编写的。然而,它们都必须首先有一个用另一种语言(通常是C)编写的本地版本。相比之下,第一个C编译器是用汇编语言编写的。我假设第一个汇编程序是用机器代码编写的。(或者,using butterflies ;)

.class文件是由javac生成的字节码。它们不是文本的,它们是类似于机器代码的二进制代码(但具有不同的指令集和体系结构)。

jvm在运行时有两种选择:它可以解释字节码(伪装成CPU本身),或者可以即时(just-in- time )将其编译成本机代码。后者当然更快,但更复杂。

票数 5
EN

Stack Overflow用户

发布于 2010-08-04 23:39:33

在安装Java运行时之前,Windows不知道如何调用Java程序,Sun选择使用本机命令来收集参数,然后调用JVM,而不是将jar后缀绑定到Java引擎。

票数 1
EN

Stack Overflow用户

发布于 2010-08-04 23:27:50

编译器最初是用C语言编写的,带有一些C++代码,我假设它现在仍然是这样(为什么您认为编译器也是用Java语言编写的?)。javac.exe只是编译器的C/C++代码。

顺便说一下,你可以用java编写编译器,但你是对的,你必须避免鸡和蛋的问题。要做到这一点,您通常需要编写一个或多个类似于C的引导工具,以便能够编译编译器。

.class文件包含字节码,javac编译过程的输出,这些是告诉JVM该做什么的指令。在运行时,这些字节码被转换为本机CPU指令(机器码),因此它们可以在JVM下的特定硬件上执行。

更复杂的是,JVM还优化并缓存了从字节码生成的机器码,以避免重复转换它们。这就是所谓的JIT编译,在程序运行和解释字节码时发生。

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

https://stackoverflow.com/questions/3406942

复制
相关文章

相似问题

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