编译程序基本原理

编译程序和解释程序

人们利用高级语言与计算机进行交互, 但计算机仍然只能理解和执行由 0, 1序列构成的机器语言, 因此高级程序设计语言需要翻译, 担负这一任务的程序称为"语言处理程序", 由于应用的不同, 语言之间的翻译也是多种多样的. 大致可分为 汇编程序解释程序和编译程序.

用某种高级语言或汇编语言编写的程序称为 源程序, 源程序不能直接在计算机上执行. 如果源程序是用汇编语言写的, 则需要一个称为汇编程序的翻译程序将其翻译成目标程序后才能在计算机上执行. 如果是用高级语言编写的源程序, 需要对应的 解释程序或编译程序对其进行翻译, 然后再机器上运行.

解释程序也称为 解释器, 它可以直接解释执行源程序,或者将源程序翻译成某种中间代码的形式后再加以运行.

编译程序也称为 编译器, 它首先将源程序翻译成目标语言程序, 然后再计算机上运行目标程序.

这两种语言处理程序的根本区别是: 在编译方式下, 机器上运行的是与源程序等价的目标程序, 源程序和编译程序都不再参与目标程序(.o程序)的执行过程; 而在解释方式下, 解释程序和源程序 要参与到程序的运行过程中, 运行程序的控制权在解释程序. 解释器翻译源程序时不产生独立的目标程序, 而编译器则需要将源程序翻译成独立的目标程序

一、编译程序基本原理

1. 编译过程概述

编译程序 的功能是把某高级语言书写的源程序翻译成与之等价的目标程序(汇编程序或机器语言程序).

编译程序的工作可以分为6个阶段:

①词法分析--- 对源程序从前往后逐个字符地扫描

源程序可以简单的被看成一个多行的字符串, 词法分析阶段是编译过程中的第一个阶段,这个阶段的任务是对源程序从前到后(从左到右)逐个字符地扫描, 从中识别出一个个"单词"符号, "单词"符号是程序设计语言的基本语法单位, 如 关键字、标识符、常数、运算符和分隔符(标点符号, 括号)等.

②语法分析

语法分析的任务是在词法分析的基础上行, 根据语言的语法规则将单词符号序列分解成各类的语法单位, 如 表达式、语句、程序等. 通过语法分析确定整个输入串是否构成一个语法上正确的程序. 是如果源程序中没有语法错误, 语法分析后就正确的构造出语法树.否则就指出语法错误, 并给出相应的诊断信息.

词法分析和语法分析本质上都是对源程序的结构进行分析.

③语义分析--- 类型分析和检查错误

语义分析阶段主要分析程序中各种语法结构的语义信息, 包括检查源程序是否包含语义错误, 并收集类型信息在后面的代码生成阶段使用. 只有语法和语义都正确的源程序才能被翻译成正确的目标代码.

语义分析的一个主要工作是进行类型分析和检查. 程序设计语言中的一个数据类型一般包含两个方面的内容: 类型的载体及其上的运算. 例如: 整除取余运算符只能对整形数据进行运算, 若其运算对象中有浮点数就认为是类型不匹配错误.

④中间代码生成

中间代码生成阶段的工作是根据语义分析的输出生成中间代码. 它是一种简单且含义明确的记号系统, 他们的共同特征是与 机器无关. 中间代码的设计原则: 一是容易生成, 二是容易被翻译成目标代码.

语义分析和中间代码生成所依据的是语言的语义规则.

⑤代码优化

由于编译器将源程序翻译成中间代码的工作是机械的, 因此, 生成中间代码往往在计算时间上和存储空间上有很大的浪费. 优化过程可以在中间代码生成阶段进行, 也可以在目标代码生成阶段进行. 优化所依据的原则是程序的等价变换规则.

⑥目标代码生成

目标代码生成是编译器工作的最后一个阶段. 这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码, 这个阶段的工作与具体的机器密切相关.

⑦符号表管理

符号表的作用是 记录源程序中各个符号的必要信息, 以辅助语义的正确性检查和代码生成, 在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除操作.

⑧出错处理

用户编写的源程序不可避免地会有一些错误, 这些错误大致可分为 静态错误和动态错误. 动态错误也称动态语义错误, 他们发生在程序运行时, 例如变量取零作除数、数组下标越界等错误. 静态错误是编译时所发现的程序错误, 可分为语法错误和静态语义错误, 如单词拼写错误、标点符号错误、表达式中缺少操作数、括号不匹配等有关语言结构上的错误称为语法错误; 而语义分析时发现的运算符与运算对象类型不合法等错误属于 静态语义错误.

对于编译过程的各个阶段, 在逻辑上可以把它们划分为 前端和后端 两部分. 前端包括从词法分析到中间代码生成各阶段的工作, 后端包括中间代码优化和目标代码的生成及优化等阶段. 以中间代码为分水岭, 把编译器分成了与机器有关的部分和与机器无关的部分. 前后端的有机结合后就形成了该语言的一个编译器. 

二、解释程序基本原理

解释程序是另一种语言处理程序, 在词法、语法和语义分析方面与编译程序的工作原理基本相同, 但是在运行用户程序时, 它直接执行源程序或源程序的内部形式. 因此解释程序不产生源程序的目标程序, 这是它和编译程序的主要区别.

解释程序的基本结构. 这类系统通常可以分为两部分: 第一部分是分析部分, 包括与编译过程相同的词法分析、语法分析和语义分析程序, 经语义分析后把源程序翻译成中间代码, 中间代码常采用 逆波兰 表示形式. 第二部分是解释部分, 用来对第一部分产生的中间代码进行解释执行.

三、对于高级语言的编译和解释翻译方式,可以从下面几个方面进行比较:

效率. 编译比解释方式可能取得更高的效率

一把情况下, 在解释方式下运行程序时, 解释程序可能需要反复扫描源程序. 例如 每一次引用变量都要进行类型检查, 甚至需要重新进行存储分配, 从而降低了程序的运行速度. 在空间上,以解释方式运行程序需要更多的内存, 因为系统不但需要为用户程序分配运行空间, 而且要为解释程序及其支撑系统分配空间. 

灵活性. 解释方式比编译方式更灵活

解释程序需要返回检查源程序, 当解释器直接运行源程序时, 在运行中, 修改程序成为可能, 例如 增加语句或修改错误等

可移植性

源程序若由解释器控制运行的, 而已提前将解释器安装在不同的及其上, 从而使在新环境下无需修改源程序使之运行. 在编译方式下则需要针对新机器重新生成源程序的目标代码才能运行.

发布了149 篇原创文章 · 获赞 68 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/m0_37989980/article/details/80806976