刚接触Java,我无法理解从源代码到硬件特定二进制文件的完整构建过程。基本上我正在使用Eclipse for java,并且想知道从源代码(.java)到二进制的所有转换是什么,所有文件都是使用链接器,预处理器等链接的。
如果您能指出一些链接,详细介绍java的完整构建过程,那么我们将不胜感激。我已经搜索了这个论坛,但没有得到详细信息。
谢谢
编辑:
所以更准确地说,我在C中寻找与以下构建过程相当的java: 我google了很多但没有收获!像下面这样的数字不是必须的(虽然是首选的),但是如果你可以在完整的Java构建过程中编写'n'顺序/并行步骤,那将非常感激。虽然@Tom Anderson提供的大部分信息对我都非常有用。
答案 0 :(得分:7)
首先要提到的是,您的问题包含错误的假设。您询问“从源代码到硬件特定二进制文件的完整构建过程” - 但正常的Java构建过程从不生成特定于体系结构的二进制文件。它获得了与体系结构无关的字节码,然后停止。毫无疑问,在大多数情况下,该字节码将被转换为要执行的本机代码,但该步骤发生在运行时,JVM内部,完全在内存中,并且不涉及二进制文件的生成 - 它是不是构建过程的一部分。
有一些例外 - 像GCJ这样的编译器可以生成本机二进制文件,但很少这样做。
因此,作为构建过程的一部分发生的唯一重要步骤是编译。编译器读取源代码,执行通常的解析和解析步骤,并发出字节码。这个过程没有以任何方式指明;像往常一样,language specification定义语言的元素是什么,它们是什么意思,但不是如何编译它们。输出格式中指定的内容:字节码以class files的形式打包,每个类一个,然后可以在jar files中组合在一起,以便于分发。
当执行类文件时,在执行之前需要进一步的步骤。这些在JVM规范中的loading, linking, and initializing一章中有详细说明。但是,正如我所说,这些并不是构建过程的一部分。
在构建过程中可能会出现一些其他步骤,通常在编译之前:可能会解析和下载依赖项,可能会在字符集之间复制和转换资源,并且可能会生成代码。但这些都不是标准的,它是通过各种构建工具添加到核心编译过程中的所有东西。
答案 1 :(得分:3)
如果您想知道“幕后”发生了什么,可以查看一些很酷的文章。
http://www.codeproject.com/Articles/30422/How-the-Java-Virtual-Machine-JVM-Works
这是其中之一,它对所有部分如何交互以运行代码有很好的解释。
主要思想是从Java文件创建字节码以在虚拟机中运行,使您的Java代码(或多或少......)独立于您运行它的操作系统和平台。
特定于该环境的JVM负责将该字节码转换为您运行代码的特定体系结构的实际指令。
这是Java拥有的“一次编写,随处运行”的基础。虽然口头禅并不总是如此......但总的来说仍然如此。