【问题标题】:Difference between C++ and Java compilation process [duplicate]C++和Java编译过程的区别[重复]
【发布时间】:2011-01-06 21:45:21
【问题描述】:

可能重复:
Why does C++ compilation take so long?

嗨,

我在google上搜索了C++和Java编译过程的区别,但是返回了C++和Java语言特性和它们的区别。

我精通 Java,但不精通 C++。但我修复了 C++ 中的一些错误。根据我的经验,我注意到与 Java 相比,C++ 总是需要更多的时间来构建微小的更改。

问候 巴拉

【问题讨论】:

标签: java c++ compiler-construction


【解决方案1】:

我想到了一些高级别的差异。其中一些是概括性的,应该以“经常...”或“某些编译器...”为前缀,但为了便于阅读,我将省略它。

  • C/C++ 编译不会从二进制文件中读取任何信息,而是仅从需要完整解析的头文件中读取方法/类型定义(例外:预编译头文件)
  • C/C++ 编译包括一个预处理器步骤,可以执行大量文本替换(这使得标头预编译更难执行)
  • C++ 语法比 Java 语法复杂得多
  • C++ 类型系统比 Java 类型系统复杂得多
  • C++ 编译通常会产生原生汇编代码,与相对简单的字节码相比,它的产生要复杂得多
  • C++ 编译器需要进行优化,因为没有任何其他东西可以做到这一点。 Java 编译器几乎可以简单地将 Java 源代码 1:1 转换为 Java 字节码,在这一步没有进行任何优化(留给 JVM 来做)。
  • C++ 具有图灵完备的模板语言! (所以严格来说,C++ 代码需要运行 才能生成可执行代码,并且 C++ 编译器需要解决停止问题以告诉您是否可以编译任意 C++ 代码)。

【讨论】:

    【解决方案2】:

    Java 将代码编译成字节码,由 Java VM 解释。 C++ 必须编译成目标代码,然后编译成机器语言。正因为如此,Java 可以只编译一个类以进行微小的更改,而 C++ 目标文件必须与其他目标文件重新链接到机器代码可执行文件(或 DLL)。这可能会使该过程需要更长的时间。

    【讨论】:

      【解决方案3】:

      我不知道您为什么期望 Java 和 C++ 的编译速度具有可比性,因为它们是不同的语言,具有完全不同的设计目标和实现。

      也就是说,需要牢记的一些具体区别是:

      • Java 被编译为字节码,而不是直接编译为机器码。编译到这个抽象虚拟机更简单。
      • C++ 编译不仅涉及compilation but also linking。所以它通常是一个多步骤的过程。
      • Java 执行一些后期绑定,即对函数的调用与要运行的实际代码在运行时完成的关联。因此,一个区域的微小变化不需要触发整个程序的编译。在 C++ 中,这种关联需要在编译时完成,这称为早期绑定。

      【讨论】:

        【解决方案4】:

        使用所有语言特性的 C++ 程序本质上更难编译。一些具有多种类型的模板调用可以轻松地将要生成的代码量增加一倍或三倍。

        【讨论】:

          【解决方案5】:

          忽略很多细节,在 Java 中,您可以将 .java 文件编译成一个或多个 .class 文件。在 C++ 中,您将 .cc(或其他)源文件编译为 .o 文件,然后将 .o 文件一起链接到可执行文件或库中。链接过程通常会杀死您,尤其是对于较小的更改,因为链接的工作量大致与整个项目的大小成正比。 (这忽略了增量链接器,这些链接器专门设计用于不会对小更改表现得那么糟糕)

          另一个因素是#include 机制意味着每当您更改 .h 文件时,所有依赖于它的 .o 文件都需要重新构建。在 Java 中,一个 .class 文件可以依赖多个 .java 文件(例如:因为不断内联),但是在更改一个源文件需要许多其他源文件的情况下,这些“热点”往往要少得多重建。

          此外,如果您使用 Eclipse 之类的 IDE,它会一直在后台构建您的 Java 代码,所以当您告诉它构建时,它已经大部分(如果不是完全)完成了。

          【讨论】:

            【解决方案6】:

            Java 将任何源代码编译成字节码,由 JVM 解释。由于这个特性,它可以在多个平台上使用。

            【讨论】:

              猜你喜欢
              • 2016-05-16
              • 2014-10-12
              • 1970-01-01
              • 1970-01-01
              • 2017-03-13
              • 2013-10-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多