C ++和Java编译过程之间的区别

时间:2010-01-19 17:01:08

标签: java c++ compiler-construction

  

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

您好,

我在谷歌搜索了C ++和Java编译过程之间的差异,但返回了C ++和Java语言功能及其差异。

我精通Java,但不熟悉C ++。但我修复了C ++中的一些错误。根据我的经验,我注意到与Java相比,C ++总是花费更多的时间来进行微小的更改。

此致 巴拉

6 个答案:

答案 0 :(得分:10)

我想到了一些高层差异。其中一些是概括,应该以“经常......”或“一些编译器......”作为前缀,但为了便于阅读,我将把它留下来。

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

答案 1 :(得分:8)

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

答案 2 :(得分:3)

我不确定为什么你期望Java和C ++的编译速度可以比较,因为它们是不同的语言,具有完全不同的设计控制和实现。

这说明要记住的一些具体差异是:

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

对许多细节进行着色,在Java中将.java文件编译为一个或多个.class文件。在C ++中,您将.cc(或其他)源文件编译为.o文件,然后将.o文件链接到一个可执行文件或库中。链接过程通常会导致您死亡,特别是对于较小的更改,因为链接的工作量大致与整个项目的大小成比例。 (这忽略了增量链接器,这些连接器专门设计为对小变化不起作用)

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

另外,如果你正在使用像Eclipse这样的IDE,它会一直在后台构建你的Java代码,所以当你告诉它构建它时,它已经大部分(如果不是完全的话)完成。

答案 5 :(得分:0)

Java将任何源代码编译为字节码,由JVM解释。由于此功能,它可以在多个平台中使用。