经典编译模型(C、C++等)有何不同?那么Java编译模型呢?
发布于 2011-11-28 23:14:13
对你的问题的正确回答可能需要几百页才能回答,但我会试着用几段话来总结。
基本上,您所指的“经典编译模型”以人类编写的源代码作为输入,并发出机器代码,无需进一步翻译机器代码即可加载和运行。由此产生的机器码只能在兼容的硬件上运行,并且只能在兼容的操作系统中运行。
Java编译模型将人类编写的源代码作为输入,并生成所谓的"byte code“,而不是机器码。字节码不能直接在机器上执行。相反,它需要由另一个编译器再次翻译成机器代码,或者由在机器上执行与字节码中的指令相对应的指令的设备动态解释。后一种设备通常称为虚拟机。该模型的一个分支是字节码可以在任何具有字节码编译器或为其编写的虚拟机的平台上“运行”。这赋予了Java完全可移植性的外观和效果,而C++编译器堆栈发出的机器码所暗示的可移植性是不存在的。
发布于 2011-11-28 23:16:24
在C(和C++)编译模型中有两个方面。其一是它比Java有更长的历史,这意味着它迎合了非常低功耗的编译器和机器。第二个是编译目标,通常是低级机器码。
要以低内存编译器环境为目标,C代码必须是自上而下可读的,没有回溯。这意味着您必须遵循严格的声明顺序。(对于类定义,C++稍微放宽了一点。)此外,每个源文件必须可编译为独立的翻译单元,不需要了解其他源文件的任何信息。
其次,因为C以低级机器码为目标,这意味着每个翻译单元基本上不包含元数据,这与Java类文件形成了鲜明对比。这就需要一个更强的编码规则,其中每个翻译单元都必须提供必要的声明。编译器不能仅仅扫描所有其他文件来获得所需的信息;这取决于用户提供这些信息。(C++更严格地执行这一点,在C中,您可以通过忘记声明来避免严重的错误。)
请记住,C程序必须在编译时完全编译和链接,因此在这一点上必须有大量信息可用。Java程序可以在运行时装入类,并且Java执行通常在运行时执行更多的“适合”操作(本质上,与C中的静态链接相反)。更复杂的Java运行时环境允许更灵活和模块化的编译模型。
发布于 2011-11-29 00:32:46
我将变得勇敢,并比较表现。;)
Java编译器javac几乎不做优化,而是偏爱语法检查代码。它做了所有必要的合理检查,以确保它将在JVM上运行,并进行一些持续的评估,仅此而已。
大多数智能编译都是由JIT完成的,JIT可以根据程序的使用方式执行动态复杂化。这允许它内联“虚拟”方法,例如,即使调用者和被调用者在不同的库中。
C/C++编译器预先执行重要的静态分析。这意味着程序从一开始就会以几乎全速运行。CPU通过指令重新排序和分支预测执行一些动态优化。虽然C/C++缺乏动态优化,但它通过更容易地对系统进行低级访问而获益。(在Java中这通常不是不可能的,但在C/C++中微不足道的低级操作在Java中可能是复杂和晦涩的)它还提供了更多的方法来做同样的事情,允许您选择问题的最佳解决方案。
当Java可能更快的时候。
当C/C++可能更快的时候。
如果您使用C/C++提供的大部分功能,请使用
https://stackoverflow.com/questions/8297832
复制相似问题