什么是语言处理程序?
它是一类系统软件的总称。还是不懂?那好吧,我们把它给拆了? 拆完后=“语言”+“处理”+“程序”
首先。是什么类型的语言呢?是编程语言;处理即操作。程序
就不用说了吧。
这里事实上是给大家买了一个关子。简单的说语言处理程序就是:用来对编程语言进行处理的一类程序。
那么为什么要对编程语言进行操作呢?这不得不说到编程语言的发展了。
一、编程语言的发展
机器语言:一開始,人类和计算机打交道用的是机器指令(机器语言),我们都知道机器指令太“简单”了,简单到仅仅剩下“0”和“1”。
汇编语言:为了符合人类的编程思维习惯,我们開始用一些简单的。常识符号来当作指令进行编程,即汇编语言,汇编语言包括:指令语句,伪指令语句,和宏指令语句。
指令和伪指令的差别:指令进过解释后能够直接变成机器指令,而伪指令即为指令语句的运行提供服务,比如分配内存空间等操作。宏指令即批处理指令。
高级语言:为了是编程变得简单,符合人们的理解习惯。接着发展到了第三个大阶段。高级语言阶段。这时候的编程语言层出不穷,c,c++。java等被我们熟知了。
高级语言极大的方便了编程。可是机器还是比較“简单”的,它识别不了复杂的人类社会,所以高级语言和机器之间的沟通这个时候须要有人来解决——语言处理程序。
语言处理程序的主要目的就是将汇编语言和高级编程语言翻译成机器语言,让机器识别,达到执行的目的。
二、语言处理程序
如今有三种语言处理程序:汇编程序、解释程序、编译程序。
汇编程序
将汇编语言编写的源程序翻译成机器指令程序。
汇编程序的工作内容:转换指令,处理伪指令。
步骤:两次扫描
第一次:定义符号的值,创建一个符号表ST
第二次:产生目标程序
编译程序(编译器)
将源程序编译成目标语言程序
工作原理例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3lvbmd4aWE5MjE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
以上的工作流程依照逻辑划分能够分成两个部分:编译前端和编译后端。
前端
从词法分析——》中间代码生成
与机器无关部分
与编程语言有关
后端
中间代码优化——》目标代码生成,优化
与机器有关
与编程语言无关
这样划分的优点:对于机器来说。底层机器不同,机器语言不同,那么要生成的目标代码就会不同;
针对上层。不同的编程语言转换成中间代码的语法,词法,语义检查不同,把编译器切割成前端和后端,就能够灵活应对对上层编程语言和底层机器的需求。针对不同语言设计有不同的前端,针对不同机器设计不同后端,依据须要组合使用。
编译步骤
如图:词法分析,语法分析。语义检查……这么一步一步走到目标代码生成。在图的两側能够看到有“符号表管理”和“出错处理”。
这两个表示从编译開始就一直存在的。
符号表中记录了源程序中各个符号的必要信息。以辅助语义的正确性检查和代码生成,个人感觉这就好比一个“转换字典”,是源程序和目标代码之间的一个对比表。
出错处理:源程序在编译中出现错误是再正常只是的一件事情。在编译中出现错误,就会进入到编译器自己主动进行的“出错处理”机制中,进行修复策略。
中间代码:是一种简单的且含义明白的记号系统,前边讲过,它属于编译前端。与机器无关。
经常使用的是与汇编语言很相似的三地址码,採用四元式实现;
中间代码优化在此阶段完毕
原则:等价变化规则
表示形式
后缀式,树式——适用解释器
三元式
四元式——适用于编译器
目标代码生成
目标代码属于编译后端,生成与详细的机器有关。一般包括:绝对指令代码。可重定位指令代码,指令代码
目标代码形式:汇编语言形式,机器指令形式
须要考虑的两个因素:寄存器的分配。计算次序的选择。
解释程序(解释器)
一种:直接解释运行源程序
还有一种:将源程序翻译成某种中间代码,再运行
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3lvbmd4aWE5MjE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
差别:B,C不同是中间代码级别不同。C 更接近于机器语言。
三、编译程序 VS
解释程序
同:在解释程序中相同存在词法。语法,语义检查——与编译程序基本相同
异:与编译程序的差别——不产生目标程序,执行的时候须要源程序和解释程序參与。
从例如以下三个方面进行讨论
1、效率
编译效率高
时间:解释程序重复扫描源程序
空间:解释执行源程序须要很多其它的内存
编译程序进行目标代码生成并优化在时间和空间上都比解释程序耗费多。可是更大的优点在一次编译多次执行,所以总体在效率上提高了。
2、灵活性
解释器能够随时更改
3、可移植性
对解释器进行又一次编译。就能够执行在不同环境中