编译器的设计与实现.ppt

合集下载

C语言程序设计教程PPT完整全套教学课件

C语言程序设计教程PPT完整全套教学课件

联合体定义和使用场景分析
联合体定义
使用`union`关键字定义联合体类型,指定联合体名 称和成员列表。
内存共享
联合体的所有成员共享同一块内存空间。
使用场景
适用于多种数据类型但只需存储其中一种的场景, 如混合类型的数据存储和处理。
枚举类型定义及应用举例
枚举类型定义
使用`enum`关键字定义枚举类型,指定枚举名称和枚举常量列表。
01
跳转语句的概念和 特点
改变程序执行流程,实现程序的 跳转。
02
跳转语句的语法和 示例
break语句、continue语句、 goto语句等。
03
跳转语句的应用场 景
适用于需要中断循环、跳过某些 操作等特殊情况。
04
函数与模块化设计
函数定义和调用
函数定义的基本语法
返回类型 函数名(参数列表) { 函数体 }
将数组元素作为实参传递给形参,形参和实参类型必须一致;
数组名作为函数参数
将数组名作为实参传递给形参,形参和实参类型可以不一致,但形 参数组的大小必须大于等于实参数组的大小;
多维数组作为函数参数
多维数组可以作为函数参数传递,但需要注意多维数组的传递方式 和一维数组的传递方式不同。
06
指针与动态内存管理
02
数据类型、运算符与表达式
基本数据类型
01
整型(int)
02
浮点型(float、 double)
字符型(char)
03
04
布尔型(bool)
常量与变量
常量
在程序运行过程中,其值不能被改变 的量。
变量
在程序运行过程中,其值可以被改变 的量。
运算符和表达式

哈工大编译原理.ppt

哈工大编译原理.ppt

procedure SORT(CH);
{ case CH of ‘字母’:
‘字母’: call RECOGID(CH,TOKEN);
‘/’: call HANDLECOM(CH,TOKEN);
‘数字’: call RECOGDIG(CH,TOKEN);
‘’‘
call RECOGSTR(CH,TOKEN);
if TOKEN!=‘ ’ then call PRINTERR(‘注解未完’);
TOKEN:=‘ ';
return }
25
识别界限符(RECOGDEL) 输入:CH内含单界限符; 输出:各种界符的TOKEN字; procedure RECOGDEL(CH,TOKEN); { case CH of
otherwise call RECOGDEL(CH,TOKEN);
end case;
write TOKEN into TOKEN文件;
Return } 23
procedure RECOGID(CH,TOKEN);
{ WORD:= ‘ ’; WORD:=WORD||CH; Repeat {
call GETCH(CH);
%%
标识符 {入口地址=LOOKUP();}
%%
LOOKUP()
31
辅助过程是动作需要的,这些过程用C书 写,可以分别编译.例:LOOKUP()
32
28
声明 %% 翻译规则 %% 辅助过程
29
声明包括变量,符号常量和正规定义式。
翻译规则的形式为:
p1
{ 动作1}
p2
{ 动作2}


pn
{ 动作n}
30
每个pi是正规定义式的名子,每个{动 作i}是正规定义式pi识别某类单词时,词 法分析器应执行动作的程序段。用C书 写。

《哈工大编译原理》课件

《哈工大编译原理》课件

词法分析过程
输入
源程序的字符流。
01
输出
源程序的标记流。
02
1. 初始化
设置初始状态和缓冲区。
03
2. 循环
04 从缓冲区中取出一个字符,根
据当前状态和该字符确定下一 个状态和标记。
3. 输出
05 输出当前标记,并更新状态和
缓冲区。
4. 结束条件
06 当缓冲区为空且所有字符都被
处理时,结束词法分析。
三地址代码的生成
三地址代码定义
三地址代码是一种中间代码形式,由一系列的三元式组成,每个三 元式包含三个操作数和两个操作符。
三地址代码的特点
三地址代码具有简单、直观和易于优化的特点,能够清晰地表示程 序中的控制流程和数据流。
三地址代码的生成算法
常见的三地址代码生成算法包括递归下降分析法和语法制导翻译法 。
示中间代码,以便进行有效的优化和转换。
代码生成器的构造
代码生成器通常由指令选择、控制流优化、循环优化等 模块组成。
控制流优化模块负责对控制流进行分析和优化,如消除 冗余计算、消除无用代码等。
指令选择模块负责从中间代码中选择合适的机器指令, 并进行指令调度和并行化。
循环优化模块负责对循环结构进行优化,如循环展开、 循环合并等。
编译原理的应用非常广泛,如编译器设计、程序分析、软件工程等。
编译过程的基本概念
源程序
用高级语言编写的程序,也称为源代码。
目标程序
编译后的程序,也称为目标代码或机器代码。
编译程序
将源程序翻译成目标程序的软件。
编译过程
将源程序通过词法分析、语法分析、语义分析、中间代码生成、优化 、目标代码生成等阶段,最终生成目标程序的过程。

2.gcc编译器(ppt)

2.gcc编译器(ppt)

Gcc Gcc编译器编译器主讲人主讲人::李奎什么是什么是gcc gccGcc Gcc是一种编译工具是一种编译工具是一种编译工具。

它能够将高级语言它能够将高级语言((如c 语言)编写的文件编译生成操作系统可以执行的二进制工具Gcc Gcc工具的编译过程工具的编译过程•Gcc Gcc把源文件把源文件把源文件((.c .c文件文件文件))生成操作系统可执行的文件要经历四个过程要经历四个过程。

这个四个过程是预处理这个四个过程是预处理、、编译编译、、汇编汇编、、链接链接。

它们是按顺序执行的它们是按顺序执行的。

如下如所示如下如所示::预处理链接编译汇编源文件.C 可执行文件预处理器编译器汇编器连接器预处理阶段预处理器是在真正的翻译源文件开始之前由是在真正的翻译源文件开始之前由gcc gcc gcc编译编译器调用的独立程序器调用的独立程序。

预处理器可以删除注释预处理器可以删除注释、、包含其他文件以及进行宏替换其他文件以及进行宏替换。

编译阶段编译阶段的主要工作是把我们的源代码生成相应的汇编代码的过程汇编代码的过程。

这个阶段花费的时间会比较长这个阶段花费的时间会比较长。

它需要对我们的它需要对我们的C C 语言进行语法和语义的分析语言进行语法和语义的分析,,还需要优化我们的代码要优化我们的代码,,最终生成汇编代码最终生成汇编代码。

汇编阶段首先我们应该知道汇编代码首先我们应该知道汇编代码((汇编指令汇编指令))并不是机器能够执行的语言器能够执行的语言。

我们还必须把汇编语言翻译成计算机能识别的机器语言计算机能识别的机器语言,,这个翻译的过程是在汇编阶段完成的编阶段完成的。

链接阶段链接阶段是通过链接器完成的链接阶段是通过链接器完成的。

链接器是一个独立的程序的程序,,它将一个或者多个由编译器或汇编器生成的目标文件外加库链接为一个可执行的文件的目标文件外加库链接为一个可执行的文件。

•一般来说一般来说,,系统安装后就已经安装和设定好了系统安装后就已经安装和设定好了gcc gcc gcc。

第二章PL0编译程序PPT课件

第二章PL0编译程序PPT课件

PL/0的语法描述图
内的文字表示非终结符

内的文字或符号表示终结符
程序
分程序
.
PL/0的语法描述图
分程序
const
标识符
var
标识符
number
procedure 语句
标识符
分程序
PL/0的语法描述图
语句
标识符
:=
表达式
begin
语句
end
语句
read
(
标识符
)
,
PL/0语言文法的EBNF表示
目标代码类pcode是一种假想栈式计算机的汇编语言。 指令格式:
f la
f 功能码 l 层次差 (标识符引用层减去定义层) a 根据不同的指令有所区别
类pcode指令功能表
LIT 0 a LOD l a STO l a CAL l a INT 0 a JMP 0 a JPC 0 a
OPR 0 0 OPR 0 1 OPR 0 2 OPR 0 3 OPR 0 4 OPR 0 5 OPR 0 6 OPR 0 7 OPR 0 8 OPR 0 9 OPR 0 10 OPR 0 11 OPR 0 12 OPR 0 13 OPR 0 14 OPR 0 15 OPR 0 16
PROCEDURE P; (* 过程说明部分 *)
VAR D;
PROCEDURE Q; VAR X; BEGIN READ(X);
D:=X;
Q的过程体
WHILE X#0
DO CALL P; END;
BEGIN WRITE(D); CALL Q;
END; BEGIN
p的过程体
CALL P; END.
主程序体

C语言程序设计教程ppt课件(2024)

C语言程序设计教程ppt课件(2024)
打印九九乘法表
使用嵌套的for循环打印九九乘法表。
23
04
数组与字符串处理
2024/1/30
24
一维数组定义和操作
2024/1/30
01
一维数组定义
类型说明符 数组名
[常量表达式];
02
一维数组初始化
在定义数组时对数 组元素赋以初值;
04
一维数组操作
包括赋值、输入输
03
出、排序、查找等

一维数组引用
do-while循环
与while循环类似,但至少会执行一次 循环体。
示例
int i = 0; do { printf("%d ", i); i; } while (i < 10);
语法
do { // code to be executed } while (condition);
2024/1/30
19
赋值运算符
包括赋值运算符(=)和复合赋 值运算符(+=、-=、*=、/=、 %=),用于为变量赋值或进行 运算后赋值。
12
类型转换与运算顺序
2024/1/30
类型转换
当不同类型的数据进行运算时,需要进行类型转换,包括自 动类型转换和强制类型转换。自动类型转换由编译器自动完 成,而强制类型转换需要使用类型转换运算符。
0。
free函数
用于释放已分配的内存空间 ,避免内存泄漏。
2024/1/30
36
指针在数组、字符串等数据结构中应用
指针与数组
数组名本质上是一个指向数组首元素的指针;通过指针可 以访问和修改数组元素。
指针与字符串
字符串在C语言中以字符数组的形式存储,指针可以方便 地操作字符串。

编译器编译程序的实现

编译器编译程序的实现

当代编译技术必须面相应用需求和目旳 体系构造旳多样化
• 高性能计算(High Performance Computing) – 指令级并行(Instruction Level Parallelism) – 线程级并行(Thread Level Parallelism) – 处理机级并行(Processor Level Parallelism) – 系统级并行(Thread Level Parallelism)
❖<体现式> ::=[+|-]<项>{<加法运算符>< 项>}
❖<项> ::= <因子>{<乘法运算符><因子>} ❖<因子> ::= <标识符>|<无符号整数>|‘(’<
体现式>‘)’
❖<加法运算符> ::= +|- ❖<乘法运算符> ::= *|/ ❖<关系运算符> ::= =|#|<|<=|>|>= ❖<条件语句> ::= IF<条件>THEN<语句> ❖<过程调用语句> ::= CALL<标识符> ❖<当型循环语句> ::= WHILE<条件>DO<语句> ❖<读语句> ::= READ’(’<标识符>{,<标识符>
• 嵌入式计算(Embedded Computing) – 需求多样性(实时、资源限制、功耗、多目的)
• 其他 – 多媒体计算(Multimedia Computing) – 网络计算(Network Computing)
– ……
编译技术主要方向
• 并行编译技术– 面对高性能计算 • 交叉编译技术– 面对嵌入式计算
❖<语句>::=<赋值语句>|<条件语句>|<当型 循环语句>|<过程调用语句>|<读语句>|<写语 句>|<复合语句>|<空>
❖<赋值语句> ::= <标识符>:=<体现式> ❖<复合语句> ::= BEGIN<语句>{;<语句>}END ❖<条件> ::= <体现式><关系运算符><体现式>

编译原理王生原(第一章)

编译原理王生原(第一章)

目标代码生成
目标代码表示形式
编译器需要将中间代码转换 为目标机器代码,以便在计 算机上运行。
目标代码优化
编译器可以使用各种技术进 行目标代码的优化,如指令 选择、寄存器分配等。
指令生成方法
编译器可以使用模板匹配等 技术生成目标机器指令。
总结
1
词法分析
将程序代码分解成一系列令牌或词法单元
2
语法分析
编译过程概述
编译过程由三个阶段组成:词法分析、语法分析和语义分析。在生成中间代码和目标代码之 前,还需要进行一些优化。
词法分析
目的和原理
将程序代码分解成一系列令牌或词法单元,以便进 行进一步的分析和转换。
识别标识符和关键字
编译器需要识别代码中的标识符和关键字,以便进 行进一步的语法分析。
识别常量
编译器需要将数字和字符串等常量识别并转换为内 部表示形式。
类型检查
编译器需要检查代码中的类型 错误,并将其转换为中间代码 表示形式。
处理语义错误
编译器需要对语义错误进行处 理,如输出错误消息或修复错 误。
中间代码生成
中间代码表示形式
编译器需要将语法树转换为中间代码表示形式,以 便进行后续优化可以使用各种技术进行中间代码的生成和优 化,如常量折叠、复写传播等。
语法分析
1 目的和原理
将词法单元组成的序列转换为语法分析树或语法树,以便进一步分析和转换代码。
2 生成语法规则
编译器需要根据语法规则生成语法分析树,以便进一步处理和转换代码。
3 生成语法树
编译器需要将语法树转换为中间代码表示形式,以便进一步优化和转换代码。
语义分析
目的和原理
检查代码中的语义错误,如类 型不匹配、未定义的变量等, 并生成符号表以便后续处理。

编译器设计与实现 ——Lcc原理剖析

编译器设计与实现 ——Lcc原理剖析
编译器设计与实现
——Lcc原理剖析
华中科技大学计算机学院 张 德
2016/4/9
一、概述
1、编译器各阶段
源程序 词法分析器
语法分析器
语义分析器
符号表管理器
中间代码生成器 代码优化器 代码生成器 目标程序
2016/4/9
错误处理器ຫໍສະໝຸດ 2、编译器各阶段的分组

前端:依赖于语言并很大程度上独立于目 标机器。一般包括语法分析、词法分析、 符号表的建立、语义分析、中间代码生成 以及相关错误处理。 后端:依赖于目标机器的阶段或某些阶段 的某些部分。一般来说,后端完成的任务 不依赖于源语言而只依赖于中间语言。主 要包括代码优化、代码生成以及相关的错 误处理和符号表操作。
struct symbol { char *name; //名称 int scope; //作用域 Coordinate src; //在源程序中位置 Symbol up; //连接符号表中上一个符号 List uses; //可保存一个Coordinate列表,表示使用情况 int sclass; //扩展存储类型 <symbol flag> //符号标记 Type type; //如变量、函数、常量、结构或联合等信息 float ref; //被引用的粗略次数 union { //联合u为标号、结构、联合、枚举、常量、全局 <appendent info> //和静态变量提供附加信息 } u; // Xsymbol x; //由后端处理,如为变量分配寄存器 <debugger extension>// 为调试器产生数据信息 }
2016/4/9
5、函数


前端将函数编译为私有数据结构。将函数 的任意部分传递给后端之前,前端必须先 对每个函数进行完整的分析。 函数的处理:function函数包括前端过程

《编译原理课程教案》第1章编译原理概述精品PPT课件

《编译原理课程教案》第1章编译原理概述精品PPT课件
编译原理实践及应用
----
《编译原理实践及应用》
教材及主要参考资料
• 教材:编译原理实践及应用,黄贤英,清华大
学出版社
• 主要参考资料: • (1) 编译原理,陈火旺,国防工业出版社 • (2)程序设计语言编译方法,肖军模,大连理工
大学出版社
• (3)编译原理,张素琴,吕映芝,清华大学出版社 • (4)编译原理,alfred V.Aho等著,李建中等译,人民
2020/10/9
《编译原理实践及应用》
第10页
第一章
引论
《编译原理实践及应用》
本章要求
• 主要内容:各种翻译程序的概念,编译 过程和阶段划分,编译程序的组成和结 构,编译程序的构造方法
• 重点掌握:编译程序工作的基本过程及 其各阶段的基本任务,编译程序总框。
2020/10/9
《编译原理实践及应用》
• (2) 学习数据结构,建立“算法”的概念,对编程有更深入的 理解。遇到问题的时候,能够寻找相应的数据结构模型,设计 适当的算法来解决问题;
• (3) 学习汇编语言,这门课程是我们真正深入了解计算机内部 工作的第一门课程。通过学习了解汇编语言如何变为机器语言, 如何对应于一条指令;
• (4) 计算机组成原理课程的学习使我们了解到计算机的硬件组 成,以及机器指令程序如何在计算机中运行的过程。
❖ 编译程序(Compiler)——将高级程序设计语言 程序翻译成逻辑上等价的低级语言(汇编语言,机 器语言)程序的翻译程序。
❖ 功能 源程序
编译程序
目标程序
2020/10/9
输入数据 计算机运行
《编译原理实践及应用》
结果
第14页
计算机中的语言层次和转换关系

第3章linux程序设计基础精品PPT课件

第3章linux程序设计基础精品PPT课件

3.3 Gdb调试器
应用程序的调试是开发过程中必不可少的环节 之一。Linux下GNU的调试器称之为GDB。
GDB调试的是可执行文件而不是源程序。 在用gdb调试之前,必须使用带有-g编译选项
的gcc命令来编译源程序。 gdb 所提供的一些功能:
监控程序中变量的值. 配置断点以使程序在指定的代码行上停止执行. 一行行的执行程序代码
:e 创建新文件
:n 加载新文件
:! command 执行shell命令
3.2 Linux下编译器
1、程序编译四个过程:
1)预处理—分析命令及语法 2)将预处理后的文件转换成汇编语言 3)由汇编变为目标代码(机器代码)生成.o的文件 4)连接目标代码,生成可执行程序
3.2 Linux下编译器
2、Gcc编译选项解析
3.3 Gdb调试器
Gdb命令语法: ➢ gdb [options] Gdb使用 ➢ gdb myprogram
3.3 Gdb调试器
3.3 Gdb调试器
3.3 Gdb调试器
3.3 Gdb调试器
Do you have any questions?
The end!
课件下载后可自由编辑,如有不m编辑器的使用
3.1 Vim编辑器的使用
2)查询命令
注:从文件头向文件尾为向前; 从文件尾向文件头为向后
/abc 向前查询abc
?abc 向后查询abc
n 向前继续查询
N 向后继续查询
3) 其他
:set nu 显示行号
:set nonu 取消显示行号
之处可根据本节内容进行提问
Thank you for coming and listening,you can ask questions according to this section and this courseware can be downloaded and edited freely

第3章ARM汇编语言程序设计GNU汇编ppt课件

第3章ARM汇编语言程序设计GNU汇编ppt课件
BL 子程序名 即可完成子程序的调用。 该指令在执行时完成如下操作:将子程序的返回地址存放在连接寄存器LR中,同
时将程序计数器PC指向子程序的入口点,当子程序执行完毕需要返回调用处时, 只需要将存放在LR中的返回地址重新复制给程序计数器PC即可。在调用子程序的 同时,也可以完成参数的传递和从子程序返回运算的结果,通常可以使用寄存器 R0~R3完成。 以下是使用BL指令调用子程序的汇编语言源程序的基本结构:
.string/.asciz/.ascii
语法格式 .string/.asciz/.ascii 表达式{,表达式}...
作用
.string/.asciz/.ascii定义多个字符串。 注意:ascii伪操作定义的字符串需要自动添加结尾字符'\0'
举例
.string "abcd","hello"
bne 1f @跳转到1标号去执行 局部标号代表它所在的地址,因此也可以当作变量或
者函数来使用。
Linux汇编程序中的分段
(1).section伪操作
用户可以通过.section伪操作来自定义一个段,格式如下 :
.section section_name [, "flags"[, %type[,flag_specif
地址表达式expr的取值范围如下:
当地址值是字节对齐时,其取指范围为−255B~255B;
当地址值是字对齐时,其取指范围为−1020B~1020B。
ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的 地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被 编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB 指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错 误,编译失败。

编译原理(第一章)

编译原理(第一章)

语法分析器通常采用自顶向下的分析 方法,从源代码的起始位置开始,逐 步向下解析,直到找到完整的语法结 构或遇到语法错误。
语法分析是编译器的基础,它决定了 源代码的结构和含义,并为编译器提 供了理解和处理源代码的框架。
语法分析的任务
确定词法单元
语法分析器需要将源代码分解 成一个个的词法单元或符号, 如关键字、标识符、运算符等
对优化后的代码进行评估,包括性能测试、空间占用测试 等,以确定优化的效果是否达到预期目标。
THANKS FOR WATCHING
感谢您的观看
优化的分类
根据优化涉及的方面不同,优 化可以分为局部优化和全局优 化。
局部优化是指在单个函数或代 码块范围内进行的优化,通常 关注单个语句或表达式的优化。
全局优化是指在程序的全局范 围内进行的优化,通常关注函 数或模块之间的优化,以提高 整个程序的性能。
优化技术
在此添加您的文本17字
常见的优化技术包括常量折叠、死代码消除、循环展开、 循环优化、函数内联等。
在此添加您的文本16字
常量折叠是指在编译过程中将常量表达式的结果进行计算 并替换掉原来的表达式,以减少程序运行时的计算量。
在此添加您的文本16字
死代码消除是指删除程序中永远不会被执行到的代码,以 减少程序的空间占用和提高程序的运行效率。
在此添加您的文本16字
循环展开是指将循环体中的代码复制到循环外部,以减少 循环次数和减少循环开销。

识别语法结构
语法分析器需要识别出源代码 中的各种语法结构,如表达式 、语句、程序等。
建立语法树
语法分析器需要将识别的语法 结构按照一定的规则组织起来 ,形成一棵语法树。
语义检查
语法分析器在识别语法结构的 同时,还需要进行一些语义检 查,如类型检查、变量声明等

PL0 编译程序讲解ppt课件

PL0 编译程序讲解ppt课件

{ 读入n } read(n);
{ 递规计算 fact = m! } procedure factorial; begin
if m > 0 then
sum := 0; while n > 0 do
begin m := n; fact := 1;
begin
call factorial;
fact := fact * m;
PL/0编译程序 语法、语义分
析的核心
N 出错
Y 打印错误
可结编束辑课件PPT
20
3.2 PL/0编译程序词法分析的实现
词法分析函数getsym()所识别的单词: 保留字或关键字:如:BEGIN、 END、 IF、 THEN等 运算符: 如:+、-、*、/、:=、#、>=、<=等 标识符: 用户定义的变量名、常数名、过程名 常数: 如:10、25、100等整数 界符: 如:‘,’、‘.’ 、‘;’ 、‘(’ 、
假设A、C同层, 且A中嵌套B
③ 静态链SL—记录定义该过程的直接外层过程数据区的基地址,
以便访问外层数据
可编辑课件PPT
11
运行时数据栈S的变化
T
T
B 的局部变量
var m1,m2,m3;
RA DL
Procedure A; B
SL
var a1;

B
procedure B; var b1,b2; procedure C; …
过程可嵌套定义,内层可引用包围它的外层定义的标识符,可递归调用 数据类型,只有整型 数据结构 ,只有简变和常数 标识符的有效长度是10
语句种类:
begin/end、if、while、赋值、read/write、call、const、var、procedure
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1 语言
声明语句 简化的C 赋值语句 控制语句 If语句 While语句 函数调用 表达式 数组 …
1.1简单的C 语言的文法
1. 2. 3. 4. 5. 6.
7. 8.
9.
10.
program→ { var-declaration | fun-declaration } var-declaration→ int ID { , ID } //可以声明多个变量 fun-declaration→ ( int | void ) ID( params ) compound-stmt params → int ID { , int ID } | void | empty compound-stmt→ { { var-declaration } { statement } } statement→ expression-stmt∣compound-stmt ∣if-stmt ∣while-stmt | return-stmt expression-stmt→ [ expression ] ; if-stmt→ if( expression ) statement [ else statement ] while-stmt→ while( expression ) statement return-stmt→ return [ expression ] ;
}
大纲

语言 目标机器 编译器的实现
3 编译程序的实现

编译器的各个阶段的回顾 涉及的主要数据结构 具体实现
简单回顾-编译的各个阶段
源程序 字符流
单词流 语法单位 抽象语法树or 其它中间形式 目标代码 扫描器(词法分析) 分析器(语法分析)

语义分析和中间代码生成

优化器

目标代码生成
1.3进一步的扩展
简单的C 对象 简化的C++ 继承 多态 异常处理 垃圾回收
……
2 目标机器建模

处理器 存储器 指令系统
2.1 CPU的设计


ห้องสมุดไป่ตู้
数据结构如下: public struct processor { public int ax; public int bx; public int cx; public int pc; public int bp; public int sp; public int hp; public int zf; ……//其它 } 详细内容将会在以后解释
虚拟机执行
示例源代码
1. 2. 3. 4. 5. 6. 7.
8.
9. 10. 11. 12. 13. 14.
int f1(int x,int y) { if(x<y) x = x+y; x = x*2; return x; } void main() { int a; int b; a = 5; b = a + 2; a = f1(a,b); return; }
1.2程序举例
1. 2. 3. 4. 5. 6. 7.
8.
9. 10. 11. 12. 13. 14.
int f1(int x,int y) { if(x<y) x = x+y; x = x*2; return x; } void main() { int a; int b; a = 5; b = a + 2; a = f1(a,b); return; }
2.4指令系统

目标程序形式有以下几种:

绝对机器代码 可再定位机器代码 汇编语言程序

我们采用汇编语言的形式表示目标代码 格式如下: opcode oprand1 oprand2
指令集举例

MOV ax, bx MOV [addr], ax JMP 21 CMP ax, bx
11. 12.
13. 14.
15.
16. 17.
18.
expression→ ID = expression | simple-expression simple-expression→ additive-expression [ relop additiveexpression ] relop → < | <= | > | >= | == | != additive-expression→ term [( + | - ) term ] term→ factor [ ( * | / ) factor ] factor→ ( expression )| ID | call | NUM call→ ID( args ) args→ expression { , expression } | empty
// 累加器AX // BX
// 程序计数器 // 基址指针bp // 堆栈指针sp
//标志flag;
2.2存储器组织

线性组织, Mem[0]~Mem[maxAddr]
maxaddr

3 2 1 低
0

功能分区:



代码区 元数据区 栈(运行时存储空间) 堆

假定每一个功能存储区的地址都是由0开 始
寄存器
;bx ax ;ax addr所表示的地址空间中 ;无条件跳转指令 ;比较ax与bx寄存器的值,设置标

JZ 21 ……
;根据标志寄存器的值有条件跳转
目标代码数据结构


根据目标代码的结构,不难设计它的数据结构 如下: class Code { private string op; //操作码 private string arg1; //操作数 private string arg2; //操作数
编译器的设计与实现
ppt制作: 张 云 时间:2008-03
课程描述

目标:编译器的设计与实现 方法:


给定语言特性,限定目标机器模型,实现该 语言的编译器; 添加新的语言特性,对编译器做相应的修改。
一个简单的编译器的设计与实现

语言的设计 目标机器建模 编译器的实现
一个用于教学的编译运行环境
2.3目标机器模型
元数据 存放符号表等运行信息 堆 存储动态分配空间 栈 代码区 存储函数运行栈 存储代码 CPU(寄存器组)
简单的栈式存储分配
数据结构
class VM { processor cpu; //虚拟机的cpu symtable;//符号表 DataTable code; //代码存储空间 int[] stack = new int[STACKSIZE]; //栈 int[] heap = new int[HEAPSIZE]; //堆 }
相关文档
最新文档