最近看了编译器设计的龙书。它提到编译器将中间代码生成作为其生成机器独立代码的阶段之一。那为什么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 编译会导致启动时间增加。
关于c - 为什么 C 没有成为独立于平台的语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41834492/