被java编译过程弄糊涂了
好的,我知道这一点:我们编写java源代码,平台无关的编译器将其翻译成字节码,然后平台相关的jvm将其翻译成机器码。
因此,从一开始,我们就编写java源代码。编译器javac.exe是一个.exe文件。这个.exe文件到底是什么?java编译器不是用java写的,怎么会有.exe文件来执行它呢?如果编译器代码是用java编写的,那么编译器代码是如何在编译阶段执行的,因为执行java代码是jvm的工作。语言本身如何编译自己的语言代码?在我看来,这一切都像是鸡和蛋的问题。
现在,.class文件到底包含什么内容?它是文本形式的抽象语法树吗?是表格信息吗?它是什么?
谁能告诉我清楚和详细的方法,我的java源代码是如何转换成机器码。
发布于 2010-08-04 23:19:05
好吧,javac和jvm通常是本机二进制文件。它们是用C或其他语言写的。当然也可以用Java编写它们,只是您首先需要一个本机版本。这就是所谓的“引导”。
有趣的事实:大多数编译为本机代码的编译器都是用自己的语言编写的。然而,它们都必须首先有一个用另一种语言(通常是C)编写的本地版本。相比之下,第一个C编译器是用汇编语言编写的。我假设第一个汇编程序是用机器代码编写的。(或者,using butterflies ;)
.class文件是由javac生成的字节码。它们不是文本的,它们是类似于机器代码的二进制代码(但具有不同的指令集和体系结构)。
jvm在运行时有两种选择:它可以解释字节码(伪装成CPU本身),或者可以即时(just-in- time )将其编译成本机代码。后者当然更快,但更复杂。
发布于 2010-08-04 23:39:33
在安装Java运行时之前,Windows不知道如何调用Java程序,Sun选择使用本机命令来收集参数,然后调用JVM,而不是将jar后缀绑定到Java引擎。
发布于 2010-08-04 23:27:50
编译器最初是用C语言编写的,带有一些C++代码,我假设它现在仍然是这样(为什么您认为编译器也是用Java语言编写的?)。javac.exe只是编译器的C/C++代码。
顺便说一下,你可以用java编写编译器,但你是对的,你必须避免鸡和蛋的问题。要做到这一点,您通常需要编写一个或多个类似于C的引导工具,以便能够编译编译器。
.class文件包含字节码,javac编译过程的输出,这些是告诉JVM该做什么的指令。在运行时,这些字节码被转换为本机CPU指令(机器码),因此它们可以在JVM下的特定硬件上执行。
更复杂的是,JVM还优化并缓存了从字节码生成的机器码,以避免重复转换它们。这就是所谓的JIT编译,在程序运行和解释字节码时发生。
https://stackoverflow.com/questions/3406942
复制相似问题