编译程序
作为一个语言翻译程序,
也要在翻译过程中检查源程序的语法和语义,
报告一些出错和警告信,帮助程序员更正源程序
编译程序的整个工作过程
划分
成词法分析、语法分析、语义分析、
中间代码生成,代码优化、目标代码生成
六个阶段
另外两个重要的工作:表格管理和出错处理与上述六个阶段都有联系
编译过程中源程序的各种信息被保留在种种不同的表格里,
编译各阶段的工作都涉及到构造、查找或更新有关的表格,
因此需要有表格管理的工作;
如果编译过程中发现源程序有错误,
编译程序应报告错误的性质和错误发生的
地点,并且将错误所造成的影响限制在尽可能小的范围内,
使得源程序的其余部分能继续被编译下去,
有些编译程序还能自动校正错误,这些工作称之为出错处理
=====================我是分割线====================
●〖词法分析阶段是编译过程的第一个阶段.〗
此阶段的任务:从左到右一个字符一个字符地读入源程序。
对构成源程序的字符流进行扫描和分解,从而识别出一个个单词。
PS:[这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义]
例如:一个C源程序片断:
int a;
a = a + 2;
词法分析后可能返回:
单词类型 单词值
保留字 int
标识符 a
界符 ;
标识符 a
算符(赋值) =
标识符 a
算符(加) +
整数 2
界符 ;
●〖语法分析是编译过程的第二个阶段〗
语法分析的任务
是在词法分析的基础上将单词序列分解成各类语法短语,
如"程序","语句","表达式"等等。
一般这种语法短语,也称语法单位可表示成语法树,
比如上述程序段中的单词序列:
id1∶=id2+id3*10经语法分析得知其是PASCAL语言的"赋值语句",
语言树为:
|__id1∶=id2+id3*10___|
|___:=___|
/ \
|__id1__| |__+___|
/ \
|__ id2 __| |__*___|
/ \
|__id3___| |__10___|
●〖语义分析〗
阶段的任务是审查源程序有无语义错误
比如使用了没有声明的变量;
或者给一个过程名赋值;
或者调用函数时参数类型不合适或者参加运算的两个变量类型不匹配等等
语义分析主要的任务----
完成静态语义审查和处理
上下文相关性审查
类型匹配审查
类型转换
●〖中间代码生成阶段 〗
有的编译程序将源程序变成一种内部表示形式,
这种内部表示形式叫做中间语言或中间代码。
所谓"中间代码"是一种结构简单、含义明确的记号系统,
这种记号系统可以设计为多种多样的形式,
重要的设计原则为两点:
一是容易生成;二是容易将它翻译成目标代码。
很多编译程序采用了一种近似"三地址指令"的"四元式"中间代码,
这种四元式的形式为:(运算符,运算对象1,运算对象2,结果)。
a = b * c + b * d 的四元式序列为
(1) t1 = b * c
(2) t2 = b * d
(3) t3 = t1 + t2
(4) a = t3
再有:
if ( a <= b)
a = a – c;
c = b * c;
翻译成的四元式:
t1 = a > b
if t1 goto l
t2 = a – c
a = t2
l : t3 = b * c
c = t3
●〖代码优化〗
代码优化阶段的任务是
对前阶段产生的中间代码进行变换或进行改造,
目的是使生成的目标代码更为高效,即省时间和省空间
●〖目标代码生成〗
目标代码生成阶段的任务是
把中间代码变换成特定机器上的
绝对指令代码或可重定位的指令代码或汇编指令代码
(1)MOVF id3 R2
(2)MOLF #10.0 R2
(3)MOVF id2 R1
(4)ADDF R1 R2
(5)MOV R1 id1
第一条指令将id3的内容送至寄存器R2,
第二条指令将其与实常数10.0相乘,这里用#表明10.0处理为常数,
第三条指令将id2移至寄存器R1,
第四条指令加上前面计算出的R2中的值,
第五条指令将寄存器R1的值移到id1的地址中。
●〖 高级语言解释系统〗
为了实现在一个计算机上运行高级语言的程序,主要有两个途径:
第一个途径是把该程序翻译为这个计算机的指令代码序列,
这就是我们已经描述的编译过程。
第二个途径是编写一个程序,
它解释所遇到的高级语言程序中的语句并且完成这些语句的动作,
这样的程序就叫解释程序。
分享到:
相关推荐
编译原理第一章作业 编译原理是计算机科学领域的一个重要分支,它研究如何将高级语言编写的源程序翻译成机器语言或汇编语言,使计算机能够执行。下面是编译原理第一章的知识点总结: 一、编译程序的定义和分类 * ...
### 编译原理第一章引论知识点详解 #### 一、编译器概念及工作原理 **1.1 编译器定义** - **定义**: 编译器是一种软件工具,其主要职责是将源代码(一种高级编程语言)转换为目标代码(通常是机器语言或另一种...
6. **词法分析**:词法分析器处理输入的源程序,将其分解为一个个单词符号,这是编译过程的第一步。 7. **中间代码生成**:中间代码生成遵循语义规则,它是一种抽象的、与特定机器无关的表示,方便进一步的优化和...
编译原理是计算机科学中的一个重要领域,它研究如何将高级编程语言转换为机器可理解的低级语言,通常称为机器语言或目标代码。这一过程涉及多个步骤,旨在实现高效且准确的程序执行。本章节主要介绍了编译程序的基本...
"编译原理第1章习题解答" 本资源是关于编译原理的习题解答,包括了第一章的习题解答。习题涵盖了编译原理的基础知识,包括计算机程序设计语言的发展过程、高级程序设计语言的特点、翻译程序的类型、编译程序的结构...
"编译原理 第三章课后习题答案解析" 本文将对《编译原理 第三章课后习题答案》中的知识点进行详细解析。 3.2 编译原理中的语法分析 在编译原理中,语法分析是将源代码转换为抽象语法树(Abstract Syntax Tree,...
例如,两遍编译程序中,第一遍完成词法分析、语法分析和语义分析,第二遍生成目标代码并进行优化。在实际操作中,这些阶段可能是交错进行的,例如,语法分析器在解析过程中可以动态调用词法分析器来获取下一个词汇...
编译原理第三章答案详解 编译原理是计算机科学中的一门重要课程,对于计算机科学专业的学生来说,编译原理是必修的课程。编译原理主要研究编译器的设计和实现,包括词法分析、语法分析、语义分析、中间代码生成、...
编译原理是计算机科学的一个重要领域,主要研究如何将高级编程语言转换为机器语言,使得计算机可以理解和执行。本课程涵盖了编译程序设计的核心概念和技术,包括从源代码到可执行程序的整个编译过程。 首先,我们来...
词法分析是编译器的第一步,它将源代码分解成一个个称为“记号”(Token)的基本单元。这章可能涉及正则表达式、有限状态自动机(FSA)以及词法分析器(Lexer)的设计。习题可能会要求设计词法分析规则来识别变量名...
《编译原理课后第五章答案解析》 在编译原理的学习中,理解并掌握LR(0)文法和SLR(1)文法是非常重要的部分。本章主要讨论了这两种文法的构造和分析过程,以及它们的区别。 首先,我们来看LR(0)文法。LR(0)文法是一...
最左规约的每一步句柄分别为:(T)、T,S、a、T,S、第一个 a、S、第一个 a。 #### 二、文法类型与语言识别 1. **文法类型**: - 根据Chomsky的分类,文法可以分为四类:0型(短语文法)、1型(上下文有关文法)、2...
在以上提供的文件内容中,涉及到编译原理中的多个核心概念,包括文法、正规式、正规文法、上下文无关文法以及语法树等。下面是对这些知识点的详细说明: 1. 文法(Grammar): 文法是用来定义语言结构的形式系统,...
《编译原理》是计算机科学领域的一门重要课程,它主要研究如何将高级程序设计语言转化为机器可执行的指令。本章练习涉及了编译器前端的重要概念,包括文法、推导、分析树和文法类型等。 首先,我们来看例1。文法G[S...
编译原理课后第四章答案 本节将对编译原理及实现第四章的课后答案进行详细的解释和分析。 4.1 对下面文法,设计递归下降分析程序。 文法:S→aAS|(A),A→Ab|c 解决方法:首先将左递归去掉,将规则A→Ab|c改成A...
1. **词法分析**:这是编译过程的第一步,也称为扫描。它将源代码分解成一系列有意义的符号,称为标记(Token)。词法分析器通常基于正则表达式来识别不同的标记类型。 2. **语法分析**:也称为解析,是将标记流转...