5

作为 Java 新手,我无法理解从源代码到硬件特定二进制文件的完整构建过程。基本上我正在使用 Eclipse for java 并且想知道从源代码(.java)到二进制文件的所有转换,使用一些链接器、预处理器等链接的所有文件。

如果您能指出一些链接,提供有关 java 完整构建过程的详细信息,将不胜感激。我已经搜索过这个论坛,但没有得到详细信息。

谢谢

编辑:

所以更准确地说,我正在寻找相当于 C 中以下构建过程的 java:我搜索了很多但没有收获!像下面这样的图不是必须的(尽管是首选),但是如果您可以编写完整的 Java 构建过程中涉及的“n”个顺序/并行步骤,那将非常感激。尽管@Tom Anderson 提供的大部分信息对我来说非常有用。

在此处输入图像描述

4

2 回答 2

8

首先要欣赏的是您的问题包含错误的假设。您询问“从源代码到特定于硬件的二进制文件的完整构建过程”——但正常的 Java 构建过程从不生成特定于体系结构的二进制文件。它到达与架构无关的字节码,然后停止。确实,在大多数情况下,字节码会被翻译成本地代码来执行,但是这个步骤发生在运行时,在 JVM 内部,完全在内存中,并且不涉及二进制文件的生成——它不是构建过程。

也有例外 - GCJ等编译器可以生成本地二进制文件,但很少这样做。

因此,作为构建过程的一部分发生的唯一实质性步骤是编译。编译器读入源代码,执行通常的解析和解析步骤,并发出字节码。没有以任何方式指定该过程;像往常一样,语言规范定义了语言的元素是什么,以及它们的含义,但没有定义如何编译它们。输出格式中指定的内容:字节码以类文件的形式打包,每个类一个,而这些文件又可以组合在jar 文件中以便于分发。

当类文件开始执行时,在执行之前还需要进一步的步骤。这些在 JVM 规范中关于加载、链接和初始化的章节中得到了很好的说明。但是,正如我所说,这些并不是构建过程的真正组成部分。

在构建过程中可能会发生一些其他步骤,通常在编译之前:可能会解析和下载依赖项,可能会复制资源并在字符集之间转换,并且可能会生成代码。但这些都不是标准的,都是各种构建工具添加到编译核心过程中的所有东西。

于 2012-05-08T12:25:11.173 回答
3

如果您想知道“幕后”发生了什么,可以查看一些很酷的文章。

http://www.codeproject.com/Articles/30422/How-the-Java-Virtual-Machine-JVM-Works

这是其中之一,它很好地解释了所有部分如何交互以运行您的代码。

主要思想是从您的 Java 文件创建字节码以在虚拟机中运行,从而使您的 Java 代码(或多或少...)独立于您运行它的操作系统和平台。

然后,特定于该环境的 JVM 负责将该字节码转换为您运行代码的特定架构的实际指令。

这是 Java 所拥有的“一次编写,到处运行”口头禅的基础。虽然咒语并不总是成立……但总的来说,它仍然是正确的。

于 2012-05-08T11:44:21.777 回答