孔乙己学C语言(2)

1.2 C是一种编译型的语言

“你是用计算机翻译的?”,有一次我拿了一篇外文文献的译稿去给一个外语很好的朋友修改,她在看到了书稿以后,好奇地问我。事实上这片文献是我花了很长一段时间翻译过来的。可是她十分质疑我的英语水平,于是很肯定的认为这是我的计算机翻译的,之所以比她的计算机翻译的好,是因为我的计算机配置更高。当然,为了增加一点本行业的神秘性,我默许了她的这个观点。没想到的是,后来她居然花了将近4个月的工资买了一台所谓顶级配置的电脑……

其实,计算机根本就不会懂得我们使用的语言,无论是汉语还是英语,它所能做的和我们所能对它做的,只是在它的某个部位通电或者断电。

一切的行为在计算机看来都被表示成了01,这个两个数字就是通过断电和通电。如果谁想和计算机直接交流的话那么只能是不断把自己的想法表示成一系列的01,这将会是一件工作量大到无法想象的问题。

但是为什么我们平时编程使用的C语言看起来和英语差不多,而完全不像是01编码呢?

问题描述:

编译这个词,其实在我们接触计算机相关理论之前就听说过了,比如说大名鼎鼎的“中央编译局”,说的简单了其实就是编辑翻译的意思。英语翻译把我们的话翻译给外国人听, C语言编译器把我们写的代码翻译给计算机。不同于英语翻译直接将汉语转化为英语,编译器做的是C语言转化为汇编语言,然后再把汇编语言转化为机器语言。(注意的是计算机并不能直接理解汇编语言)

通常来说,人们把这种高级语言的翻译过程分成了两种方式,一种称为编译型,一种称为解释型。

实例分析

1-2

/*example1_2.c*/

int main(void)

{

……

return 0;

}

当一个程序example1_2.c写完以后,需要有一个专门的过程进行编译。具体的编译行为要交给一个“编译器”来完成。当编译完成以后,会产生一个可以执行的文件example1_2.exe。这个文件example1_2.exe是机器可以直接理解执行的。以后再运行时,不再需要对程序进行编译了,可以直接使用编译好的文件。编译型语言特点就是先整体编译,再执行,生成了一个目标程序。

1- 1  C语言编译过程

C语言编译过程一共分成下面的4个阶段

1编译预处理

在预处理阶段,主要处理的代码是“#”符号开头的语句,例如#define宏定义语句,#include文件包含语句,经过预处理器处理的源程序与之前的源程序区别不大,在这个阶段所进行的工作只是纯粹的替换与展开,没有任何计算功能,最后生成一个没有宏定义、没有条件编译指令、没有特殊符号文件。

2编译、优化阶段

词法分析和语法分析就是在这个阶段展开的,首先编译器会检查语句的合法性,如果合法的话,会将语句翻译成对应的汇编代码,这个翻译编译器会对代码进行优化处理。

3汇编过程

汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。目标文件组成的组成单位是段。根据数据性质的不同,一个文件最少会被分成两个段。

代码段:这个段通常不允许进行写操作的,这里存放的是程序的指令,通常可以读也可以执行。

数据段:这个段允许写操作,也可以读和执行,存放的主要是全局变量或静态的数据

4链接程序

程序有时会调用其他程序文件中的变量,或者可能会调用其他库中的函数,这就需要链接程序的处理。在这个阶段,目标代码(obj文件)与程序里面调用的库函数对应的代码连接起来形成对应的可执行文件(exe文件)

而解释型的语言,是每读入一条源程序的语句,就将其解释成功能相同的机器语言,然后再执行这些机器语言。在执行下一条源程序的时候,舍弃掉之前的机器语句,然后读入下一条语句,再解释成机器语句。当遇到循环的时候,每次执行到该语句,都会将其翻译成机器语言。

解释型语言特点就是一边解释,一边执行。并没有一个目标程序的生成。

两者进行比较,编译型语言的优势显而易见,编译一次以后,以后可以直接运行,执行效率比较高,而且最终的可执行文件由于是机器语言文件,执行速度要快些,尤其是大型应用程序。

而其实解释型语言也有自身的优势,最为明显的就是解释性语言可移植性较高,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言。

总结

概念可以很明了,但是到了具体的分类却又是一件让人头疼的事情,尤其是当遇上了一个要和你辩个你死我活的主管。

C语言,C++Pascal语言,Delphi语言这些毫无争议的是编译型语言,而PerlPythonRuby则是典型的解释型语言。

但是有人会问了那basic语言,java语言呢,还有C#语言呢?

Basic语言在最早期是以解释型语言出现的,但是微软的Visual basic却是编译型的语言(这个很明显,直接生成了exe文件),而VBScript又是解释型语言。

JavaC#是什么类型的,这一直是一个有争议的问题,有人认为java通过jdk编译成了一种中间代码,然后才到处运行的,所谓“一次编译,处处运行”,所以java应该属于编译型语言。

反对者指出,java编译的代码并不是真正的机器代码,最后还是需要虚拟机解释执行,应该归于解释型语言。

就如同物理学史上的光的属性是波和粒之争一样,其实很难有一个最合适的结论,执着的去追求这个分类是没有意义的。将这些新型的语言看作同时具有两种特点的复合型语言其实无伤大雅。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值