首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C和Java的编译模型有什么不同?

C和Java的编译模型有什么不同?
EN

Stack Overflow用户
提问于 2011-11-28 23:06:16
回答 7查看 2.3K关注 0票数 3

经典编译模型(C、C++等)有何不同?那么Java编译模型呢?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-11-28 23:14:13

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

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

Java编译模型将人类编写的源代码作为输入,并生成所谓的"byte code“,而不是机器码。字节码不能直接在机器上执行。相反,它需要由另一个编译器再次翻译成机器代码,或者由在机器上执行与字节码中的指令相对应的指令的设备动态解释。后一种设备通常称为虚拟机。该模型的一个分支是字节码可以在任何具有字节码编译器或为其编写的虚拟机的平台上“运行”。这赋予了Java完全可移植性的外观和效果,而C++编译器堆栈发出的机器码所暗示的可移植性是不存在的。

票数 11
EN

Stack Overflow用户

发布于 2011-11-28 23:16:24

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

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

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

请记住,C程序必须在编译时完全编译和链接,因此在这一点上必须有大量信息可用。Java程序可以在运行时装入类,并且Java执行通常在运行时执行更多的“适合”操作(本质上,与C中的静态链接相反)。更复杂的Java运行时环境允许更灵活和模块化的编译模型。

票数 8
EN

Stack Overflow用户

发布于 2011-11-29 00:32:46

我将变得勇敢,并比较表现。;)

Java编译器javac几乎不做优化,而是偏爱语法检查代码。它做了所有必要的合理检查,以确保它将在JVM上运行,并进行一些持续的评估,仅此而已。

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

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

当Java可能更快的时候。

  • 如果你的编程风格适合Java,并且你只使用Java支持的特性,Java可能会稍微快一点(由于动态编译),也就是说你无论如何都不会充分利用C/C++的潜力。
  • 如果你的代码包含很多死代码(可能只知道在运行时死了),Java在消除这一点方面做得很好。(IMHO有很高比例的微型基准测试表明Java比C++更快)
  • 你有非常有限的时间和/或资源来实现你的应用程序。(在这种情况下,更高级的语言可能更好),也就是说,你没有时间来优化你的代码,你需要编写安全的抽象代码。

当C/C++可能更快的时候。

如果您使用C/C++提供的大部分功能,请使用

  • 。更高级的程序员倾向于做的事情。如果启动时间很重要,请使用
  • 。如果您需要在算法或data structures.
  • If方面发挥创意,您可以利用低级硬件功能,如直接访问设备。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8297832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档