Joh*_*ing 11
你的问题的正确答案可能需要几百页回答,但我会尝试在几个段落中总结.
基本上,您所指的"经典编译模型"将人工编写的源代码作为输入,并发出机器代码,无需进一步翻译机器代码即可加载和运行.其中一个结果是生成的机器代码只能在兼容的硬件上运行,并且只能在兼容的操作系统中运行.
Java编译模型将人工编写的源代码作为输入,并且不发出机器代码,而是发出所谓的" 字节代码 ".字节代码不能直接在机器上执行.相反,它需要由另一个编译器再次转换为机器代码,或者由在设备上执行与字节代码中的指令相对应的指令的设备即时解释.后一种设备通常被称为虚拟机.这种模型的一个分支是字节代码可以在任何具有字节码编译器或为其编写的虚拟机的平台上"运行".这为Java提供了完全可移植性的外观和效果,其中C++编译器堆栈发出的机器代码没有隐含的这种可移植性.
C(和C++)编译模型有两个方面.一个是它比Java更长的历史,这意味着它迎合了非常低功耗的编译器和机器.第二个是编译目标,通常是低级机器代码.
要针对低内存编译器环境,C代码必须从上到下可读,没有回溯.这意味着您必须严格遵守声明顺序.(C++为类定义放松了一点.)此外,每个源文件必须可编译为独立的翻译单元,不需要了解其他源文件.
其次,因为C以低级机器代码为目标,这意味着每个翻译单元基本上不包含元数据,与Java类文件形成鲜明对比.这需要一个更强大的编码规则,其中必须为每个翻译单元提供必要的声明.编译器不能只扫描所有其他文件以获取所需信息; 由用户提供.(C++更严格地强制执行此操作,在C中,您可以通过忘记声明来逃避令人讨厌的错误.)
请记住,C程序必须在编译时完全编译和链接,因此此时必须提供大量信息.Java程序可以在运行时加载类,Java执行通常在运行时执行更多"拟合"操作(基本上,与C中的静态链接相反).Java的更复杂的运行时环境允许更灵活和模块化的编译模型.
| 归档时间: |
|
| 查看次数: |
1659 次 |
| 最近记录: |