编译系统

  • 高级语言的优点是有代价的,必须有一个“翻译程序”,也就是高级语言必须有相应的软件支持系统,“编译程序+相应的支持用户程序”---编译系统。
  • 一般这种编译工作有两种途径或两种形式的混合:编译--编译程序、汇编程序;解释---解释程序。

一、翻译程序、编译程序、汇编程序、解释程序

1、翻译程序

翻译程序是这样一种程序,它能够把用甲语言书写的程序翻译成与之等价的用乙语言书写的程序。

甲语言称为该翻译程序的源语言。

乙语言称为该翻译程序的目标语言。

用源语言书写的程序称为源程序。

用目标语言书写的程序称为目标程序。

2、编译程序

如果翻译程序的源语言是高级语言,目标语言是低级语言(机器或汇编语言),这种翻译程序称为编译程序。

3、汇编程序

如果翻译程序的源语言是汇编语言,目标语言是机器语言,这种翻译程序称为汇编程序。

说明:

  • 不同的源语言有不同的编译程序;同一种源语言可以有不同的编译程序。
  • 源程序的执行一般分为两阶段:编译阶段和运行阶段。
  • 编译阶段生成的目标程序不是机器代码程序,而是符号汇编程序,源程序的执行分为三个阶段:编译阶段、汇编阶段和运行阶段。

4、解释程序

按源程序的动态顺序逐句地进行分析解释并执行直至结束。

  • 解释程序边翻译边执行,不生成目标程序,交互式的工作方式,但执行效率低。
  • 编译程序生成目标程序,链接形成可执行文件运行,所有翻译工作在运行前完成,执行效率高。

二、编译过程概述

典型的编译过程分以下五个阶段:前三阶段是编译器前端:源程序的分析;后三阶段是编译器后端:目标程序的综合。

  • 词法分析
  • 语法分析
  • 语义分析及中间代码生成
  • 中间代码优化
  • 目标代码生成
  • 目标代码优化

1、词法分析

词法分析的主要任务是将符号串形式的源程序进行扫描,并分解为具有独立意义的最小语法单位--单词符号。

例:

例: 以下为 PASCAL语言的一条语句
if A=B then X=Y;
词法分析的结果
if         A         =         B         then         X          =         Y         ;
关      变        运         变         关         变量      运        变量   分隔符

 说明:

  • 依据的规则是词法规则。
  • 单词符号:常量、变量名、关键字、保留字、运算符等。
  • 每一类单词符号可用一整数表示,或其他方式。
  • 词法分析应指出单词符号的词法错误,如非法字符、不符合词法规则等。

2、语法分析

语法分析的主要任务是从词法分析取得单词符号串形式的源程序,并将一个或多个单词组合为语言的各种语法类。

  • 语法分析依据的是语言的语法规则。
  • 语法类:表达式、语句、子程序等。
  • 语法分析应指出语句的语法错误,如错误表达式。

例:

词法分析的结果
w         =         (         a         +         b         )         *         c         ;
变量  运算符 分隔符 变量 运算符 变量 分隔符 运算符 变量 分隔符


语法分析的结果
w         =         (         a         +         b         )         *        c         ;
变量 运算符 分隔符 变量 运算符 变量 分隔符 运算符 变量 分隔符
                                        表达式
赋值语句

3、语义分析及中间代码生成

语义分析的主要任务是确定源程序的意义,对不同的语法类进行初步的翻译工作,包括静态语义检查和中间代码的生成。

静态语义检查:对每种语法范畴进行静态语义检查(变量是否定义,类型检查)

中间代码生成:进行初步的翻译,生成中间代码。

引入中间代码的目的:

  • 便于移植
  • 便于优化
  • 便于目标代码生成

例:

上例的C语言语句
w=(a+b)*c ;
语义分析及中间代码生成确定先加后乘的操作,并生成中间代码。

例:以上语句的一种中间代码三元式
(1) (+,a,b)
(2) (*,(1),c)
(3) (=,w,(2))

说明:

  • 语义分析依据的是语言的语义规则。
  • 中间代码是一种结构简单含义明确的记号系统,这种记号系统的特点是既独立于具体的硬件,又和计算机的指令系统有某种程度的联系或相似之处,很容易将中间代码转变为机器指令。
  • 语义分析和语法分析是不同的概念,但在实际完成编译工作时,两者紧密结合,一般同时完成。

4、中间代码优化

中间代码优化的主要任务是对中间代码进行算法的等价变换,以期得到高效的目标代码。

  • 高效指时间和空间的高效;
  • 代码优化可以在目标代码生成之前进行,也可以在目标代码生成之后进行;
  • 代码优化要付出编译代价;
  • 编译优化技术目前较活跃,也比较难。

5、代码生成

主要任务是将源程序的中间代码形式根据具体的机器硬件系统转换成机器语言或汇编语言。

说明:

  • 并非所有的编译程序都需要这五个阶段。
  • 完整的编译程序还包括符号表的管理和出错处理。

 


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐