编译原理------------------------------------编译程序概述

有关编译程序的术语
  编译程序的源语言(源程序)
  编译程序的目标语言(目标程序)
  编译程序的实现语言
  给出这些术语的英文
  -编译程序---compiler
  -源语言---source language
  -源程序---source program
  -目标语言---target or object language
  -目标程序---target or object program
  -实现语言---implementation language

来自计算机百科全书的定义
  软件:计算机系统中的程序及其文档
  系统软件:居于计算机系统中最靠近硬件的一层,其他软件一般都通过系统软件发挥作用。他和具体的应用领域无关,如编译系统和操作系统等。
  语言处理系统:把软件语言书写的各种程序处理成可在计算机上执行的程序。
  软件语言:用于书写软件的语言。它主要包括需求定义语言,功能性语言,设计性语言,程序设计语言以及文档语言。

编译过程概述和编译程序的结构
  编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。从概念上来讲,一个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的。一般一个编译过程划分成词法分析、语法分析、语义分析、中间代码生成,代码优化和目标代码生成六个阶段,这是一种典型的划分方法。事实上,某些阶段可能组合在一起,这些阶段间的源程序的中间表示形式就没必要构造出来了。我们将分别介绍各阶段的任务。另外两个重要的工作:表格管理和出错处理与上述六个阶段都有联系。编译过程中源程序的各种信息被保留在种种不同的表格里,编译各阶段的工作都涉及到构造、查找或更新有关的表格,因此需要有表格管理的工作;如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动校正错误,这些工作称之为出错处理。下图表示了编译的各个阶段。
  下面,我们从源程序在不同阶段所被转换成的表示形式来介绍各个阶段的任务。


词法分析是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。有关英文:

词法分析---lexical analysis 或者scanning
  单词---token
  保留字---resered word
  标识符 ---identifier(user-defined name)

语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如"程序""语句""表达式"等等。一般这种语法短语,也称语法单位可表示成语法树。

例如   语句id1:=id2+id3*10的语法树


词法分析和语法分析本质上都是对源程序的结构进行分析。但词法分析的任务仅对源程序进行线性扫描即可完成,比如识别标识符,因为标识符的结构是字母打头的字母和数字串,这只要顺序扫描输入流,遇到既不是字母又不是数字字符时,将前面所发现的所有字母和数字组合在一起而构成单词标识符。但这种线性扫描则不能用于识别递归定义的语法成分,比如就无法仅用线性扫描去匹配表达式中的括号。

语法分析的功能是进行层次分析,把源程序的单词序列组成语法短语(表示成语法树).依据的是语法规则。Pascal语言的赋值语句的规则为:

  <赋值语句>::=<标识符>“:=”<表达式>
  <表达式>::=<表达式>“+”<表达式>
  <表达式>::=<表达式>“* ”<表达式>
  <表达式>::=“(”<表达式>“)”
  <表达式>::=id
  <表达式>::=n
  单词序列id1 = id2 + id3 * 10之所以能表示成的语法树,依据的是赋值语句和表达式的定义规则。

语义分析阶段的任务是审查源程序有无语义错误

一般,语义分析的工作还包括类型审查,类型提升以及为代码生成阶段收集类型信息. 比如审查每个算符是否实施于具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。

 

在进行了上述的词法分析,语法分析和语义分析阶段的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。所谓"中间代码"是一种结构简单、含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原则为两点:一是容易生成;二是容易将它翻译成目标代码。很多编译程序采用了一种近似"三地址指令""四元式"中间代码,这种四元式的形式为:(运算符,运算对象1,运算对象2,结果)

四元式(运算符,运算对象1,运算对象2,结果)常写成赋值语句的形式(结果=运算对象1 运算符 运算对象2)

代码优化阶段的任务是对前阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。

目标代码生成阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。

编译阶段的组合
  在前面所讨论的编译过程中阶段的划分是编译程序的逻辑组织。有时,常常把编译的过程分为前端(front end)和后端(back end)前端的工作主要依赖于源语言而与目标机无关, 后端工作依赖于目标机而一般不依赖源语言.通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作, 即中间代码优化也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。后端工作包括目标代码生成和目标代码优化,以及相关出错处理和符号表操作。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值