我最近阅读了编译器设计的龙书.它提到编译器将中间代码生成作为其产生机器无关代码的阶段之一.那么为什么C不是像java一样开发为平台独立语言?
龙书所描述的是以下过程:
将源代码编译为与机器无关的中间字节代码格式
对该IR执行优化和分析
将IR转换为目标平台的实际机器代码
这样做的好处是,如果您想支持其他系统,您只需为步骤3添加新的代码生成器,而无需触及步骤1和2.
所有常见的C编译器都以这种方式工作.因此,如果您的问题是"为什么C编译器不执行Dragon Book描述的内容?",答案是:"他们这样做".
现在你提到了Java.Java编译器的作用如下:
将Java代码编译为Java字节代码.就Java编译器而言,这不是中间格式,而是实际的目标语言.
结束
现在要运行这个字节代码,你需要一个JVM,它解释字节代码和/或JIT编译它.优化和分析通常在JIT编译期间发生.这不是龙书中描述的过程.
从语言实现者的角度来看,这并没有改变支持新目标系统的努力.您不再需要更改编译器,而是必须更改JVM:而不是必须向javac编译器添加新的后端,而是向JIT编译器添加新的后端.努力基本保持不变.
主要区别在于Java程序员:您现在可以编译代码并将结果包提供给每个人,而不是为每个目标平台编译程序并为每个平台分发程序包.现在运行代码的人需要安装JVM才能使用该软件包,因此您基本上将工作从程序员转移到最终用户,但是安装JVM只需要执行一次(不是每个Java都需要)你要运行的程序).
因此,不是"一次编写,随处编译",而是"编译一次,随处运行".
那么为什么C不做与Java相同的事情呢?性能.解释字节代码很慢(与运行编译代码相比),JIT编译会导致启动时间增加.