Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C和x2B之间的差异+;和Java编译过程_Java_C++_Compiler Construction - Fatal编程技术网

C和x2B之间的差异+;和Java编译过程

C和x2B之间的差异+;和Java编译过程,java,c++,compiler-construction,Java,C++,Compiler Construction,可能重复: 嗨 我在谷歌中搜索了C++和java编译过程的区别,但是C++和java语言的特点和它们的差异被返回。p> 我精通java,但C++不行。但是我在C++中修复了一些错误。根据我的经验,我注意到,C++与java相比,总是花费更多的时间来进行微小的修改。 问候 BalaJava将代码编译成字节码,字节码由Java虚拟机解释。C++必须编译成目标代码,然后再编译成机器语言。因此,java可以只为一个类编译一些微小的改变,而C++对象文件必须与其他对象文件重新链接到机器代码可执行文件(或

可能重复:

<>我在谷歌中搜索了C++和java编译过程的区别,但是C++和java语言的特点和它们的差异被返回。p> 我精通java,但C++不行。但是我在C++中修复了一些错误。根据我的经验,我注意到,C++与java相比,总是花费更多的时间来进行微小的修改。 问候
Bala

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

< P>使用所有语言特征的C++程序天生就更难编译。使用多种类型的一些模板调用可以轻松地将要生成的代码量增加一倍或三倍。

我想到了一些高级差异。其中一些是泛化的,应该加上前缀“经常…”或“一些编译器…”,但为了可读性,我将省略它

  • C/C++编译不会从二进制文件中读取任何信息,但只从需要完整解析的头文件中读取方法/类型定义(例外:预编译头文件)
  • C/C++编译包括一个预处理器步骤,可以进行大量的文本替换(这使得标题预编译更加困难)
  • C++语法比java语法复杂得多 C++类型的系统比java类型系统复杂得多
  • C++编译通常会生成本机汇编代码,这比相对简单的字节代码要复杂得多
  • C++编译器需要进行优化,因为没有其他方法可以做到这一点。Java编译器基本上是将Java源代码以1:1的比例转换为Java字节码,这一步没有进行任何优化(这是留给JVM去做的)
  • C++有一个图灵完成的模板语言!(严格地说,C++代码需要运行以生成可执行代码,而C++编译器需要解决停止问题,告诉您任意的C++代码是否可编译)。
在Java中,您可以将.Java文件编译成一个或多个.class文件,从而掩盖了许多细节。在C++中,将..cc文件(或任何)编译成.O文件,然后将.O文件链接到一个可执行文件或库中。链接过程通常会扼杀您的生命,尤其是对于微小的更改,因为链接的工作量大致与整个项目的大小成正比。(这忽略了增量链接器,这些链接器是专门设计的,对于小的更改不会表现得那么糟糕)

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


另外,如果您使用的是像Eclipse这样的IDE,那么它总是在后台构建Java代码,所以当您告诉它构建Java代码时,它已经基本完成了(如果不是完全完成的话)我不知道为什么你期望java和C++的编译速度是可比的,因为它们是完全不同的设计目标和实现的不同语言。 也就是说,需要记住的几个具体区别是:

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

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

      请阅读jalf的回答:这是一个QoI(实施质量)问题。一些C++编译器实现了“预编译的头”,这使得构建速度大大加快。同样的问题当然是DUPE,它应该关闭;但不要删除它,因为这个标题将出现在一个非常不同的搜索集上。