当前位置:  开发笔记 > 编程语言 > 正文

为什么C不是独立于平台的语言?

如何解决《为什么C不是独立于平台的语言?》经验,为你挑选了1个好方法。

我最近阅读了编译器设计的龙书.它提到编译器将中间代码生成作为其产生机器无关代码的阶段之一.那么为什么C不是像java一样开发为平台独立语言?



1> sepp2k..:

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

    将源代码编译为与机器无关的中间字节代码格式

    对该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编译会导致启动时间增加.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有