Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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与Java有何不同;什么是编译模型? 经典编译模型(C,C++等)与java编译模型的区别是什么?p>_Java_C++_C - Fatal编程技术网

C与Java有何不同;什么是编译模型? 经典编译模型(C,C++等)与java编译模型的区别是什么?p>

C与Java有何不同;什么是编译模型? 经典编译模型(C,C++等)与java编译模型的区别是什么?p>,java,c++,c,Java,C++,C,对你的问题的正确回答可能需要几百页的篇幅,但我将试着用几段话来总结 基本上,您提到的“经典编译模型”以人工编写的源代码作为输入,并发出机器代码,无需进一步翻译机器代码即可加载和运行。由此产生的一个分支是,生成的机器代码只能在兼容的硬件上运行,并且只能在兼容的操作系统中运行 Java编译模型将人类编写的源代码作为输入,并不会发出机器代码,而是所谓的“”。字节码不能直接在机器上执行。相反,它需要再次被另一个编译器翻译成机器代码,或者由一个在机器上执行与字节码中的指令相对应的指令的设备进行动态解释。后

对你的问题的正确回答可能需要几百页的篇幅,但我将试着用几段话来总结

基本上,您提到的“经典编译模型”以人工编写的源代码作为输入,并发出机器代码,无需进一步翻译机器代码即可加载和运行。由此产生的一个分支是,生成的机器代码只能在兼容的硬件上运行,并且只能在兼容的操作系统中运行


Java编译模型将人类编写的源代码作为输入,并不会发出机器代码,而是所谓的“”。字节码不能直接在机器上执行。相反,它需要再次被另一个编译器翻译成机器代码,或者由一个在机器上执行与字节码中的指令相对应的指令的设备进行动态解释。后一种设备通常称为虚拟机。该模型的一个分支是,字节码可以在任何平台上“运行”,这些平台要么有字节码编译器,要么有为其编写的虚拟机。这给java带来了完全可移植性的外观和效果,在C++编译器栈所发射的机器代码中没有这样的可移植性。机器魔法只有某些巫师才能理解。JVM字节码魔法被一种特殊的向导所理解,为了使机器向导能够施放使计算机执行任务的咒语,您必须雇佣这种特殊的向导。C和C++编译器通常会发出机器类型,而java编译器则发出JVM字节码。

简而言之,“经典”编译(这是一个由材料提供的临时术语,因为它们没有一个真实的单词),它基本上是编译在一个真实的设备(在我们的例子中是一个物理处理器的机器)。相反,Java编译成针对虚拟设备的代码,虚拟设备是安装在机器上的软件。虚拟设备是改变和瞄准真实机器的设备


这样,您的硬件就被抽象了。这就是为什么Java可以在“任何”机器上工作。

在C(和C++)编译模型中有两个方面。一个是它的历史比Java长,这意味着它迎合了非常低性能的编译器和机器。第二个是编译目标,通常是低级机器代码

要针对低内存编译器环境,C代码必须自上而下可读,没有回溯。这意味着您必须遵守声明顺序的严格规则。(对于类定义,C++稍微放宽了这一点。)此外,每个源文件都必须作为独立的翻译单元进行编译,而不需要知道任何关于其他源文件的信息

第二,因为C面向低级机器代码,这意味着每个翻译单元基本上不包含元数据,这与Java类文件形成鲜明对比。这就需要一个更强大的编码规则,其中每个翻译单元都必须提供必要的声明。编译器不能只是扫描所有其他文件以获得所需信息;由用户提供。(C++更严格地执行了这一点,在C中,您可以通过忘记声明来避免严重错误。)


请记住,C程序必须在编译时进行完全编译和链接,因此此时必须提供大量信息。Java程序可以在运行时加载类,Java执行通常在运行时执行更多的“拟合”操作(本质上是强制转换,而不是C中的静态链接)。Java更复杂的运行时环境允许更灵活和模块化的编译模型。

C/C++在执行之前进行编译

Java在执行时被编译


当然,这两种语言都不要求采用某种编译方式。

没有区别。两者都将人类理解的源代码转换为某些机器理解的机器代码。在Java的例子中,它的目标是一个虚拟机,即一个程序而不是一块硅

当然,没有什么可以阻止一块硅片理解JVM字节码(在这种情况下,您可以将其从“字节码”重命名为“机器码”)。相反,没有什么可以阻止编译器将C/C++代码转换为JVM字节码

两者都有一个运行时,并且都要求您告诉它您打算使用运行时的哪些部分


我真的认为你想问一个不同的问题。

我要勇敢地比较一下你的表现

Java编译器
javac
很少进行优化,更喜欢语法检查代码。它执行所有必要的合理检查,以确保它将在JVM上运行,并进行一些持续的评估,仅此而已

大多数智能编译是由JIT完成的,JIT可以根据程序的使用方式执行动态复杂化。这允许它内联“虚拟”方法,例如,即使调用者和被调用者位于不同的库中

C/C++编译器预先执行重要的静态分析。这意味着程序从一开始就几乎全速运行。CPU通过指令重新排序和分支预测执行一些动态优化。虽然C/C++缺乏动态优化,但它通过使系统的低级访问变得更加容易而获益匪浅。(这在Java中通常不是不可能的,但在C/C++中很简单的低级操作在Java中可能很复杂和模糊)它还提供了更多的方法来做同样的事情,允许您选择问题的最佳解决方案

当Java可能更快时

  • 如果您的编程风格适合Java,并且只使用Java支持的功能,那么Java