c - 为什么 C 没有成为独立于平台的语言?

标签 c compiler-construction platform-independent

最近看了编译器设计的龙书。它提到编译器将中间代码生成作为其生成机器独立代码的阶段之一。那为什么C没有像java一样发展成平台无关语言呢?

最佳答案

龙书所描述的是如下过程:

  1. 将源代码编译成中间的机器无关字节码格式
  2. 对该 IR 进行优化和分析
  3. 将IR翻译成目标平台的实际机器码

这样做的好处是,如果你想支持额外的系统,你只需要为第 3 步添加一个新的代码生成器,而无需触及第 1 步和第 2 步。

所有常见的 C 编译器都是这样工作的。因此,如果您的问题是“为什么 C 编译器不按照 Dragon Book 描述的那样做?”,答案是:“他们做”。

现在您提到了 Java。 Java 编译器的作用如下:

  1. 将 Java 代码编译成 Java 字节码。对于 Java 编译器而言,这不是中间格式,而是实际的目标语言。
  2. 结束

现在要运行此字节码,您需要一个 JVM,它解释字节码和/或 JIT 编译它。优化和分析通常发生在 JIT 编译期间。这不是龙书上描述的过程。

从语言实现者的角度来看,这不会改变支持新目标系统的工作量。您不再需要更改编译器,而是必须更改 JVM:您不必向 javac 编译器添加新后端,而是向 JIT 编译器添加新后端。工作量基本保持不变。

主要区别在于 Java 程序员:您现在不必为每个目标平台编译程序并为每个平台分发程序包,您现在可以编译一次代码并将生成的程序包提供给每个人。现在运行你的代码的人需要安装一个 JVM 才能使用这个包,所以你基本上把工作从程序员转移到了最终用户,但是安装 JVM 是你只需要做一次的事情(不是对每个 Java您要运行的程序)。

因此,不再是“一次编写,到处编译”,而是“一次编译,到处运行”。

那么为什么 C 不做 Java 做的事情呢?表现。解释字节代码很慢(与运行编译代码相比),并且 JIT 编译会导致启动时间增加。

关于c - 为什么 C 没有成为独立于平台的语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41834492/

相关文章:

c - 使用指针返回修剪后的字符串

c - 双向链表程序运行时错误

C 程序 Switch 和 If 语句

gcc - #错误 "Must #define __STDC_LIMIT_MACROS before #including Support/DataTypes.h"

java - 理解java平台独立性

java - 为什么其他语言而不是java不是平台无关的?

在某个字符处剪切字符串

c++ - 为什么我的程序的 objdump -D 看起来和 .S 不一样

compiler-construction - 无法执行wfc386没有此类文件或目录-Watcom Fortran IDE

c++ - 重写一个类以使其更通用以实现可移植性