编译器设计文法
A. 编译器的历史
20世纪50年代,IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于上下文无关文法识别的有效算法)的研究是在60年代和70年代,它相当完善的解决了这个问题。它已是编译原理中的一个标准部分。
有限状态自动机(Finite Automation)和正则表达式(Regular Expression)同上下文无关文法紧密相关,它们与Chomsky的3型文法相对应。对它们的研究与Chomsky的研究几乎同时开始,并且引出了表示程序设计语言的单词的符号方式。
人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其称为优化技术(Optimization Technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(Code Improvement Technique)。
当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器(Parser Generator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最着名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(Scanner Generator)的工具,Lex(与Yacc同时,由Mike Lesk为Unix系统开发)是这其中的佼佼者。
在20世纪70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。
编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变,它正迅速地成为计算机科学课程中的中心环节。
在20世纪90年代,作为GNU项目或其它开放源代码项目标一部分,许多免费编译器和编译器开发工具被开发出来。这些工具可用来编译所有的计算机程序语言。它们中的一些项目被认为是高质量的,而且对现代编译理论感兴趣的人可以很容易的得到它们的免费源代码。
大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。
编译器相关专业术语: 1. compiler编译器;编译程序 2. on-line compiler 连线编译器 3. precompiler 预编译器 4. serial compiler 串行编译器 5. system-specific compiler 特殊系统编译器 6. Information Presentation Facility Compiler 信息展示设施编译器 7. Compiler Monitor System 编译器监视系统
B. 编译原理中的语法和文法一样吗
编译原理中的语法和文法是不一样的,但却融会贯通。
在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。
文法分成四种类型,即0型、1型、2型和3型。这几类文法的差别在于对产生式施加不同的限制。
形式语言,这种理论对计算机科学有着深刻的影响,特别是对程序设计语言的设计、编译方法和计算复杂性等方面更有重大的作用。
多数程序设计语言的单词的语法都能用正规文法或3型文法(3型文法G=(VN,VT,P,S)的P中的规则有两种形式:一种是前面定义的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一种形式是:A→Ba或A→a,前者称为右线性文法,后者称为左线性文法。正规文法所描述的是VT*上的正规集)来描述。
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。称0型文法产生的语言为0型语言。上下文有关文法、上下文无关文法和正规文法产生的语言分别称为上下文有关语言、上下文无关语言和正规语言。
C. 请问编程语法规则,是不是根据不同编译器来定的
不,一个语言的语法是早就确定好的,它有一个统一标准——例如 ANSI C。
不同编译器可能有些许不同,比如有的编译器a=b=c结果很可能不一样(所以我们很少这么用
但是大体上,一个语言的编译器得出的结果是一样的,是根据语法规则做出编译器而非编译器确定语法规则。
zhengshu a=0,编译器肯定不认,理由是没有这个type;但是你可以通过typedef自定义任意的类型。
int是一种type,而type varlist;是声明变量的语法(int a; char b;)
你写了int a=0;那么这时编译器做的就是在内存中开出一个能存int数据的空间,然后把0给填进去,再记录下这块内存的地址,并记住这个地址叫做a。至于分析代码什么的,就是编译器的事情了。
——以上。
D. 符号表和抽象语法树是什么关系两者在编译器设计中是否必需
一般的编译器可能包含下面这些模块:
1, 词法分析器:
输入: 源代码
输出: token
2, 语法分析器:
输入: token
输出: AST
在这个过程中, 可以识别出不符合语法规则的语句, 就可以报syntax错误, 如果有syntax错误, 编译结束
3, 语义分析器:
输入: AST
输出: 无
在这个过程中, 根据语言的语义规则来识别语义错误, 要识别语义错误 就必须编译AST, 因为是树的遍历, 假如你先遍历到了int a 这个节点, 接着又遍历到了一个表达式a = 4这个节点, 你需要检查变量a有没有声明啊, 变量a和4的类型批不匹配呢? 这时你如果没有保存变量a的信息, 那么你怎么检查? 所以就需要符号表来保存这些信息了.
4, 代码优化:
最简单的就是常量折叠优化了, 比如: a = 1 + 2 这个语句可以直接换成: a = 3了, 也就是说在编译阶段就把一些必要的运算先计算完成, 在程序运行的时候就不需要计算这些了, 就提高了程序的运行效率. 这部分是最复杂的了, 还有各种各样各样的优化
5, 代码生成:
输入: AST
输出: 可以是虚拟机代码, 可以是本地汇编代码
E. 把编译程序设计原理(第二版)高等教育出版社的课后答案给我发一份 可以吗
目录
第1章编译器概述
1.1为什么要学习编译技术
1.2编译器和解释器
1.3编译器的功能分解和组织结构
1.4编译器的伙伴
1.5编译器的复杂性
1.6编译器的设计与实现
1.7编译器的测试与维护
第2章一个微型编译器
2.1基础知识
2.2ToyL语言
2.3ToyL语言词法分析器
2.4ToyL语言语法分析器
2.5ToyL语言解释器
2.6ToyL语言编译器
第3章有穷自动机与词法分析
3.1词法分析基础
3.1.1词法分析器的功能
3.1.2单词识别
3.1.3词法分析的复杂性
3.1.4字符串
3.1.5保留字处理
3.1.6空格符、回车符、换行符
3.1.7括号类配对预检
3.1.8词法错误修正
3.1.9词法分析独立化的意义
3.2有穷自动机
3.2.1确定有穷自动机的定义
3.2.2确定有穷自动机的实现
3.2.3非确定有穷自动机
3.2.4NFA到DFA的转换
3.2.5确定有穷自动机的极小化
3.2.6自动机状态转换表的实现
3.3正则表达式
3.3.1正则符号串集
3.3.2正则表达式的定义
3.3.3正则表达式的局限性
3.3.4正则定义
3.3.5正则表达式到有穷自动机的转换
3.4词法分析器的构造
3.4.1用DFA人工构造词法分析器
3.4.2词法分析器的生成器Lex
练习
第4章文法与语法分析
4.1语法分析
4.1.1语法分析器的输入
4.1.2语法分析的任务
4.1.3语法分析方法分类
4.2文法和文法分析
4.2.1上下文无关文法和语言
4.2.2最左推导和最右推导
4.2.3语法分析树与二义性
4.2.4文法分析算法
4.2.5自顶向下方法概述
4.2.6自底向上方法概述
4.3递归下降法——自顶向下分析
4.3.1递归下降法原理
4.3.2消除公共前缀
4.3.3代入
4.3.4消除左递归
4.4LL分析方法——自顶向下分析
4.4.1LL(1)文法
4.4.2LL(1)分析表
4.4.3LL(1)分析的驱动器
4.4.4LL(1)中的If-Then-Else问题
4.4.5LL(1)分析器的自动生成器LLGen
4.4.6LL(1)分析法与递归下降法的比较
4.4.7正则文法
4.5LR方法——自底向上分析
4.5.1句柄
4.5.2活前缀
4.5.3归约活前缀识别器——LR(0)自动机
4.5.4LR(0)文法及其分析算法
4.5.5SLR(1)文法及其分析算法
4.5.6LR(1)文法
4.5.7LALR(1)文法
4.5.8二义性文法的处理
4.5.9另一种Shift-Rece分析技术:简单优先法
4.5.10LL(1)和LALR(1)方法比较
4.6LR分析器的生成器
4.6.1LALR分析器的生成器YACC
4.6.2LALR分析器的生成器LALRGen
4.7语法错误处理
4.7.1错误恢复和修复
4.7.2递归下降分析的错误恢复
4.7.3LL分析的错误恢复
4.7.4LR分析的错误恢复
练习
第5章语义分析
5.1语义分析基础
5.1.1语义分析内容
5.1.2标识符信息的内部表示
5.1.3类型信息的内部表示
5.1.4运行时值的表示
5.2符号表
5.2.1符号表查找技术
5.2.2符号表的局部化
5.2.3二叉式局部符号表
5.2.4散列式全局符号表
5.2.5嵌套式全局符号表
5.2.6符号表界面函数
5.3类型分析
5.3.1类型的等价性和相容性
5.3.2类型分析的总控算法
5.3.3类型名分析
5.3.4枚举类型分析
5.3.5数组类型分析
5.3.6记录类型分析
5.3.7联合类型分析
5.3.8指针类型分析
5.3.9递归类型分析
5.4声明的语义分析
5.4.1声明的语法结构
5.4.2标号声明部分的语义分析
5.4.3常量声明部分的语义分析
5.4.4类型声明部分的语义分析
5.4.5变量声明部分的语义分析
5.4.6过程、函数声明的语义分析
5.5执行体的语义分析
5.5.1执行体的语义分析
5.5.2带标号语句和转向语句的语义分析
5.5.3赋值语句的语义分析
5.5.4条件语句的语义分析
5.5.5while循环语句的语义分析
5.5.6for循环语句的语义分析
5.5.7过程调用语句的语义分析
5.5.8表达式的语义分析
5.5.9变量的语义分析
练习
第6章运行时的存储环境
6.1运行时的存储空间结构与分配
6.1.1运行时的存储空间基本结构
6.1.2静态区的存储分配
6.1.3栈区的存储分配
6.1.4堆区的存储分配
6.1.5堆区空间管理
6.2过程活动记录与栈区组织结构
6.2.1过程活动记录
6.2.2活动记录的填写
6.2.3栈区组织结构——AR链
6.3运行时的变量访问环境
6.3.1可访问活动记录
6.3.2局部Display表方法
6.3.3静态链方法
6.3.4全局Display表方法和寄存器方法
6.3.5无嵌套时的AR及访问环境
6.4分程序和动态数组空间
6.4.1无动态数组时的分程序空间
6.4.2动态数组空间
练习
第7章面向语法的语义描述
7.1动作文法
7.1.1动作文法定义
7.1.2动作文法的递归实现
7.1.3动作文法的LL实现
7.1.4动作文法的LR实现
7.2动作文法应用
7.2.1用动作文法描述表达式计算
7.2.2用动作文法描述表达式抽象树的构造
7.2.3用动作文法描述语句抽象树的构造
7.3抽象动作文法及其应用
7.3.1抽象变量
7.3.2抽象动作文法
7.3.3栈式LL动作文法驱动器
7.3.4抽象动作文法到栈式LL动作文法的转换
7.3.5栈式LR动作文法驱动器
7.3.6抽象动作文法到栈式LR动作文法的转换
7.4属性文法
7.4.1属性文法定义
7.4.2属性语法树和属性依赖图
7.4.3计算顺序
7.4.4属性值的计算方法
7.4.5拷贝型属性文法
7.5属性文法在编译器设计中的应用
7.5.1类型树的属性文法描述
7.5.2表达式中间代码的属性文法描述
7.5.3变量中间代码的属性文法描述
7.5.4语句中间代码的属性文法描述
7.5.5正则表达式到自动机转换的属性文法描述
7.6S-属性文法及其属性计算
7.6.1S-属性文法
7.6.2S-属性文法的递归实现
7.6.3S-属性文法的LR实现
7.7L-属性文法及其属性计算
7.7.1L-属性文法
7.7.2L-属性文法的递归实现
7.7.3L-属性文法的LR(1)实现
7.8语义分析器的自动生成系统
7.8.1YACC
7.8.2LALRGen
7.8.3Accent系统
练习
第8章中间代码生成
8.1中间代码
8.1.1中间代码的种类
8.1.2后缀式中间代码
8.1.3三地址中间代码
8.1.4抽象语法树和无环有向图
8.1.5多元式中间代码
8.1.6中间代码分量ARG结构
8.2表达式的中间代码生成
8.2.1表达式的语义信息
8.2.2表达式的中间代码
8.2.3变量的中间代码
8.2.4表达式的中间代码生成
8.2.5变量的中间代码生成
8.2.6布尔表达式的短路中间代码
8.3原子语句的中间代码生成
8.3.1输入/输出语句的中间代码生成
8.3.2goto语句和标号定位语句的中间代码生成
8.3.3return语句的中间代码生成
8.3.4赋值语句的中间代码生成
8.3.5函数(过程)调用的中间代码生成
8.4结构语句的中间代码生成
8.4.1条件语句的中间代码生成
8.4.2while语句的中间代码生成
8.4.3repeat语句的中间代码生成
8.4.4for语句的中间代码生成
8.4.5case语句的中间代码生成
8.4.6函数声明的中间代码生成
练习
第9章中间代码优化
9.1引言
9.1.1优化的目标和要求
9.1.2优化的必要性
9.1.3优化的内容
9.1.4局部优化和全局优化
9.1.5基本块和程序流图
9.2常表达式优化
9.2.1常表达式的局部优化
9.2.2基于常量定值分析的常表达式全局优化
9.2.3常量定值分析
9.3公共表达式优化
9.3.1基于相似性的公共表达式局部优化
9.3.2基于值编码的公共表达式局部优化
9.3.3基于活跃代码分析的公共表达式全局优化
9.3.4活跃运算代码分析
9.4程序流图循环
9.4.1循环的基本概念
9.4.2支撑结点
9.4.3自然循环
9.4.4可归约程序流图
9.4.5基于文本的循环及其处理
9.5循环不变代码外提
9.5.1代码外提的基本概念
9.5.2循环不变代码的判定
9.5.3循环不变代码外提的条件
9.5.4基于文本循环和定值表的不变代码外提
9.5.5一种简单的外提优化方案
9.5.6别名分析
9.5.7过程与函数的副作用分析
9.6循环内归纳表达式的优化
9.6.1归纳变量
9.6.2归纳变量计算的优化算法原理
练习
第10章目标代码生成
10.1目标代码
10.1.1虚拟机代码
10.1.2目标机代码
10.1.3窥孔优化
10.2临时变量
10.2.1临时变量的特点
10.2.2临时变量的存储空间
10.2.3临时变量的存储分配
10.2.4变量状态描述
10.3寄存器
10.3.1寄存器分类及其使用准则
10.3.2寄存器分配单位
10.3.3寄存器状态描述
10.3.4寄存器分配算法
10.4基于三地址中间代码的目标代码生成
10.4.1目标地址生成
10.4.2间接目标地址的转换
10.4.3表达式中间代码的目标代码生成
10.4.4赋值中间代码的目标代码生成
10.4.5其他寄存器分配法
10.4.6标号和goto语句中间代码的目标代码生成
10.4.7return中间代码的目标代码生成
10.4.8变量中间代码的目标代码生成
10.4.9函数调用中间代码的目标代码生成
10.5基于AST的代码生成
10.5.1三地址中间代码到AST的转换
10.5.2标记需用寄存器个数
10.5.3从带寄存器个数标记的AST生成代码
10.6基于DAG的代码生成
10.6.1从AST到DAG的转换
10.6.2DAG排序和虚寄存器
10.6.3从带序号和虚寄存器标记的DAG生成代码
10.7代码生成器的自动生成
10.7.1代码生成器的自动化
10.7.2基于指令模板匹配的代码生成技术
10.7.3基于语法分析的代码生成技术
练习
第11章对象式语言的实现
11.1引言
11.2SOOL语法
11.2.1程序
11.2.2分程序
11.2.3类声明
11.2.4类型
11.2.5变量声明
11.2.6函数声明和方法声明
11.2.7语句
11.2.8变量
11.2.9表达式
11.2.10程序示例
11.3SOOL语义
11.3.1声明的作用域
11.3.2Class声明的语义
11.3.3语句的语义
11.4SOOL语义分析
11.4.1标识符的符号表项
11.4.2符号表结构
11.4.3符号表的局部化
11.5SOOL目标代码
11.5.1对象空间
11.5.2当前对象——self
11.5.3活动记录
11.5.4成员变量的目标地址
11.5.5表达式的目标代码
11.5.6Offset原理
11.5.7类的多态性
11.5.8目标代码区
11.5.9方法的动态绑定
11.5.10快速动态绑定目标代码
主要参考文献
F. 一般设计编译器要将词法分析和语法分析分开的原因是什么
简单性——词法分析技术不如语法分析技术技术复杂,分开之后词法分析过程更简单。(这里还有一些意思差不多的话)
效率——词法分析占用的时间是整个编译时间的一大部分,所以将它们分开有利于优化词法分析,而提高编译效率
可移植性——词法分析通常平台相关,语法分析器可以是平台无关的。分开了对移植有利。
(引自《程序设计语言概念》(第9版) Sebesta着)
G. 编译器的工作原理
编译 是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器语言)的翻译过程。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,
所以我们电脑上的文件都是经过编译后的文件。
H. 编译原理的发展历程
在20世纪40年代,由于冯·诺伊曼在存储-程序计算机方面的先锋作用,编写一串代码或程序已成必要,这样计算机就可以执行所需的计算。开始时,这些程序都是用机器语言 (machine language )编写的。机器语言就是表示机器实际操作的数字代码,例如:
C7 06 0000 0002 表示在IBM PC 上使用的Intel 8x86处理器将数字2移至地址0 0 0 0 (16进制)的指令。
但编写这样的代码是十分费时和乏味的,这种代码形式很快就被汇编语言(assembly language )代替了。在汇编语言中,都是以符号形式给出指令和存储地址的。例如,汇编语言指令 MOV X,2 就与前面的机器指令等价(假设符号存储地址X是0 0 0 0 )。汇编程序(assembler )将汇编语言的符号代码和存储地址翻译成与机器语言相对应的数字代码。
汇编语言大大提高了编程的速度和准确度,人们至今仍在使用着它,在编码需要极快的速度和极高的简洁程度时尤为如此。但是,汇编语言也有许多缺点:编写起来也不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。
发展编程技术的下一个重要步骤就是以一个更类似于数学定义或自然语言的简洁形式来编写程序的操作,它应与任何机器都无关,而且也可由一个程序翻译为可执行的代码。例如,前面的汇编语言代码可以写成一个简洁的与机器无关的形式 x = 2。
在1954年至1957年期间,IBM的John Backus带领的一个研究小组对FORTRAN语言及其编译器的开发,使得上面的担忧不必要了。但是,由于当时处理中所涉及到的大多数程序设计语言的翻译并不为人所掌握,所以这个项目的成功也伴随着巨大的辛劳。几乎与此同时,人们也在开发着第一个编译器, Noam Chomsky开始了他的自然语言结构的研究。他的发现最终使得编译器结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法(grammar ,指定其结构的规则)的难易程度以及识别它们所需的算法来为语言分类。正如现在所称的-与乔姆斯基分类结构(Chomsky hierarchy )一样-包括了文法的4个层次:0型、1型、2型和3型文法,且其中的每一个都是其前者的专门化。2型(或上下文无关文法(context-free grammar ))被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。
分析问题( parsing problem ,用于限定上下文无关语言的识别的有效算法)的研究是在20世纪60年代和70年代,它相当完善地解决了这一问题, 现在它已是编译理论的一个标准部分。它们与乔姆斯基的3型文法相对应。对它们的研究与乔姆斯基的研究几乎同时开始,并且引出了表示程序设计语言的单词(或称为记号)的符号方式。
人们接着又深化了生成有效的目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其误称为优化技术(optimization technique ),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(code improvement technique )。
这些程序最初被称为编译程序-编译器,但更确切地应称为分析程序生成器 (parser generator ),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最着名的是 Yacc (yet another compiler- compiler),它是由Steve Johnson在1975年为Unix系统编写的。
类似地,有穷自动机的研究也发展了另一种称为扫描程序生成器 (scanner generator )的工具,Lex (与Yacc同时,由Mike Lesk为Unix系统开发的)是这其中的佼佼者。在20世纪70年代后期和80年代早期,大量的项目都关注于编译器其他部分的生成自动化,这其中就包括代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。
编译器设计最近的发展包括:首先,编译器包括了更为复杂的算法的应用程序,它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言(可允许此类分析)的发展结合在一起。其中典型的有用于函数语言编译的Hindle y - Milner类型检查的统一算法。
其次,编译器已越来越成为基于窗口的交互开发环境(interactive development environment,IDE )的一部 分,它包括了编辑器、链接程序、调试程序以及项目管理程序。这样的IDE的标准并没有多少, 但是已沿着这一方向对标准的窗口环境进行开发了。
I. 编译原理
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象[1]。
中文名
编译原理[1]
外文名
Compilers: Principles, Techniques, and Tools[1]
领域
计算机专业的一门重要专业课[1]
快速
导航
编译器
编译原理课程
编译技术的发展
编译的基本流程
编译过程概述
基本概念
编译原理即是对高级程序语言进行翻译的一门科学技术, 我们都知道计算机程序由程序语言编写而成, 在早期计算机程序语言发展较为缓慢, 因为计算机存储的数据和执行的程序都是由0、1代码组合而成的, 那么在早期程序员编写计算机程序时必须十分了解计算机的底层指令代码通过将这些微程序指令组合排列从而完成一个特定功能的程序, 这就对程序员的要求非常高了。人们一直在研究如何如何高效的开发计算机程序, 使编程的门槛降低。[2]
编译器
C语言编译器是一种现代化的设备, 其需要借助计算机编译程序, C语言编译器的设计是一项专业性比较强的工作, 设计人员需要考虑计算机程序繁琐的设计流程, 还要考虑计算机用户的需求。计算机的种类在不断增加, 所以, 在对C语言编译器进行设计时, 一定要增加其适用性。C语言具有较强的处理能力, 其属于结构化语言, 而且在计算机系统维护中应用比较多, C语言具有高效率的优点, 在其不同类型的计算机中应用比较多。[3]
C语言编译器前端设计
编译过程一般是在计算机系统中实现的, 是将源代码转化为计算机通用语言的过程。编译器中包含入口点的地址、名称以及机器代码。编译器是计算机程序中应用比较多的工具, 在对编译器进行前端设计时, 一定要充分考虑影响因素, 还要对词法、语法、语义进行分析。[3]
1 词法分析[3]
词法分析是编译器前端设计的基础阶段, 在这一阶段, 编译器会根据设定的语法规则, 对源程序进行标记, 在标记的过程中, 每一处记号都代表着一类单词, 在做记号的过程中, 主要有标识符、关键字、特殊符号等类型, 编译器中包含词法分析器、输入源程序、输出识别记号符, 利用这些功能可以将字号转化为熟悉的单词。[3]
2 语法分析[3]
语法分析是指利用设定的语法规则, 对记号中的结构进行标识, 这包括句子、短语等方式, 在标识的过程中, 可以形成特殊的结构语法树。语法分析对编译器功能的发挥有着重要影响, 在设计的过程中, 一定要保证标识的准确性。[3]
3 语义分析[3]
语义分析也需要借助语法规则, 在对语法单元的静态语义进行检查时, 要保证语法规则设定的准确性。在对词法或者语法进行转化时, 一定要保证语法结构设置的合法性。在对语法、词法进行检查时, 语法结构设定不合理, 则会出现编译错误的问题。前端设计对精确性要求比较好, 设计人员能够要做好校对工作, 这会影响到编译的准确性, 如果前端设计存在失误, 则会影响C语言编译的效果。[3]