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