免费预览已结束,剩余40页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译器的设计与实现 制作: 张 云 时间:2008-03 课程描述 n目标:编译器的设计与实现 n方法: n给定语言特性,限定目标机器模型,实现该 语言的编译器; n添加新的语言特性,对编译器做相应的修改 。 语言 一个用于教学的编译运行环境 简化的c 函数调用 if语句 while语句 赋值语句 表达式 数组 声明语句 控制语句 进一步的扩展 简化的c+ 简单的c 对象 继承 多态 异常处理 垃圾回收 加入对象 n目标: 在简化的c的基础上增加对象的支持。 n问题:什么是对象? n对一个程序员来说,对象就是一个带有相关 语义学的存储区域。(c+ faq) 加入对象要解决的问题 1 要处理什么样的对象? 2 对象数据存放在何处?(对象模型的建立 ) 3 对象支持哪些操作? 4 实现 1处理什么样的对象 n定义对象:将数据和操作封装在一起 n没有继承 n没有多态 n没有指针,完全为引用(为了实现简单) 2对象数据应该存放在何处 n方法一:类似于程序中局部变量全局变 量的存储,将对象的数据存放在栈或静 态存储区域中。 n方法二:在堆上动态创建对象 n比较 对象数据应该存放在何处 n我们采用的方法: n参照.net的设计,对象都分配在堆上,仅仅 声明并不创建对象;当使用了new命令才构 造对象。 point p; /对象声明 p=new point(); /对象的创建 类类声明: class point int x; int y; int z; void init(int a, int b , int c) x = a; y = b; z = c; 类使用: void main() point p; p = new point(); p. init(3,2,3); p.z = 6; p.z = p.x + p.y; 示例 堆 对象模型 np是point类的一个对象 x y z point:init() 运行栈 p 引用地址 对象地址 3对象支持什么样的操作? 对象操作 对象创建 调用成员函数 访问成员变量 运行栈 3.1对象创建 class point p;/声明 在函数中声明一个对象与声明变量没有不同! 在函数栈中添加一个空间用来记录对象的”值” p = new point();/创建对象,在堆上分配空间 对象封装了成员变量与成员函数 为对象赋值就是为对象的成员变量赋值 堆 x 随机值 y随机值 z随机值 p 3.2成员变量访问 n p.x = 1; n根据bp指针找到p,然后找到对象的成员变 量的地址 运行栈 堆 x 1 y随机值 z随机值 p bp 3.3成员函数调用 class point void init() x = a; y = b; z = c; void point.init(point this) this.x = a; this.y = b; this.z = c; 编译器将成员函数转换成对等的非成员函数;如何实现? 成员函数的运行栈 void point:f1(int a,int b) 。 void main() point p; p.f1(1,3); main的运行栈 3 1 参数个数=3 返回地址 main.bpbp sp f1()local 对象p 堆 x y z this指针 4如何实现? 问题:对象在操作过程中所需要的信息 从哪里获得? n类的定义 n对象声明 n对象的创建 n对象的操作 如何实现? 类定义 类信息 类成员函数汇编代码 对象操作 类名 成员函数列表 成员变量列表 需要的内存空间 4.1中间形式 point xyzinit 类声明 class point int x; int y; int z; void init(int a, int b , int c) x = a; y = b; z = c; a bc 语句 cls-declaration class id var-declaration | fun-declaration 类成员变 量声明 类定义 节点 类成员 函数 类使用: void main() point p; p = new point(); p. init(3,2,3); p.z = 6; p.z = p.x + p.y; main p p null pnew point() p.z6 init 3 2 3 varid | id.id | this.id var = new id ( args ) call id( args )| id.id (args) 成员函数 调用节点 null a b c 4.2符号表 类名 point 成员函数列表 成员变量列表 init 参数列表 局部变量列表 其它成员函数 x int 偏移 0 y int 偏移 1 z int 偏移 2 4.3目标代码生成 对象操作 对象创建 调用成员函数 访问成员变量 在堆上分配空间 产生对象地址 需要this指针 关联到对象 需要对象地址 作为变量偏移基准 对象声明类似于普通变量声明 4.3.1对象创建 实现 n为对象在堆中分配空间 n目标机器指令系统中增加了new指令 主要完成在堆上按照对象的需要分配空间 的工作 p = new point(); 生成代码 new p引用地址,point new p point 4.3.2 成员函数的调用 n成员函数调用分两种情况: n在类定义外部调用成员函数 n在成员函数内部调用其它的成员函数 在类定义外部调用成员函数 point p; p = new point(); p.init(); 等价于 point_init(p); 生成代码如下: ;函数参数入栈 mov ax , bp+3 push ax ;对象地址入栈 call point_init p 成员函数调用 节点 init 函数名 参数列表 不包括this 在成员函数内部调用成员函数 class point f1(); f2(); 其中 point:f1() f2(); 转化为 point_f1(point this) point_f2(this); 生成代码如下: mov ax, bp-1;取得this指针 push ax call point_f2 f2 函数调用 节点 参数列表 不包括this 4.3.3 成员变量的访问 n成员变量访问也分两种情况: n在成员函数内部访问成员变量 n在类定义外部访问成员变量 在类定义外部访问成员变量 point p; p = new point(); p.x = 1; (假设p的地址为bp+3) 生成代码如下: new bp+3 point mov ax , 1 mov bp+3_0 , ax ; x的偏移地址为0; 赋值节点 1 p 对象成员变量 节点 x 举例 l成员函数外 p.x = p.y + p.z; 生成代码 mov ax , bp+3_2 mov bx, ax mov ax, bp+3_1 add ax, bx mov bp+3_0, ax 赋值节点 + p 对象成员变量 节点 x p 对象成员变量 节点 y p 对象成员变量 节点 z 在成员函数内部访问成员变量 class point int a; f1(int x) a = x; 转化为 f1(point this, int x) this.a = x; 生成代码如下: (变量a的地址可以在bp-1处取得) mov ax , 1 mov bp-1_0 , ax = 1 this.a 在堆上寻址;对象地址+ 成员变量的偏移地址 成员变量的访问 与 成员函数的调用 小结 n成员变量访问分两种情况: n需要解决的关键在于:如何找到要操作的成员变量的 地址 n解决方法:首先取得对象地址,然后加上变量本身的偏 移量(可以在符号表中获得) n成员函数的调用也分两种情况: n需要解决的关键在于:如何找到调用该操作的对象的 地址 n解决方法:通过参数this给出 代码实现 n符号表的设计 n中间表示的设计 n目标代码目标代码在虚拟机中的运行 目标代码的生成 符号表中的变化 对象实现(类信息) 类名 成员函数列表 成员变量列表 需要的内存空间 public class classinfo public string class_name; public int membervar_size; /用来列出所有的成员变量 public hashtable membervar_list; /用来列出所有的成员函数 public hashtable memberfun_list; 修改函数符号表 函数名 局部变量列表 参数列表 返回类型 函数类型 函数地址 函数所需栈大小 public class funinfo public string fun_name; public string ret_type; /0:void 1:int 2:user_defined_type public int para_size;/所有局部变量所占空间的大小; public hashtable paravar_list;/列出所有的参数变量的位置 public int local_size; public hashtable localvar_list; /同上 public int entry_addr;/入口地址 public methodtype type;/函数类型 public enum methodtype global,member; 修改变量表 变量名 变量类型 是否数组 变量大小 变量位置 变量地址 全局 局部 成员 参数 public enum place global,local, para,member /varinfo public class varinfo public string var_name; public string var_type; public int isarray; / 0:simplevar 1:array(一维数组) public int arraysize; public int rva; /offset /参数变量?局部变量?全局变量?成员变量? public place place; 源程序中间表示目标代码 对象创建: p = new point(); newstm p point new p的地址 , point 会在堆上分配空间,并且由p的地址指向在堆上的位置 目标代码在虚拟机中的运行 void run() init();装入 symtable and asmcode; while(1) switch(codepc.op) case “push“:push(operand1);break; case “pop“: pop(operand1);break; case “mov“: mov(operand1,operand2);break; case “add“: add(operand1,operand2);break; case “jmp“: jmp(operand1);break; case “new“: new(operand1,operand2);break; case “halt“:halt();break; default:break; /*new: 将创建一个对象所需要的所有动作都结合到new运算符中,包括:在堆里为对 象分配内存,初始化该内存,返回一个指向对象的指针。 pet = new pet(1,2); 分配内存,返回堆上对象地址。 new objectvaraddr classname; 查找类xx,在heap上分配成员变量空间;设置类 对象指针*/ void new(string arg, string clsname) int mvsize = -1; classinfo cs = sr.getcs(clsname); /assert(cs!=null); mvsize = cs.membervar_size; int addr = index(arg); if(mvsize-1) this.stackaddr=cpu.hp; for(int i=0;imvsize;i+) this.heapcpu.hp=0; cpu.hp+; 编译器中目标代码生成 void assignstm(treenode tn) string varaddr=“; switch(tn.child0.ntype) varaddr=;/*取得变量的地址*/ if(tn.child1.ntype=nodetype.newstm) if(tn.child1.child0!=null) code tmpcode1 = this.nextcode(); tmpcode1.op = “new“; tmpcode1.arg1 = varaddr; tmpcode1.arg2 = tn.child1.child0.nodestr; /expprocess(tn.child1.child0); else newstm p point tn 目标代码生成举例 对象操作: p = new point(); p.init(0, 0); p.x=3; p.y=5; newstm p point p= init 00 p.x3p.y5 newstm p point p= init 00 p.x3p.y5 new bp+3,point
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 燃气轮机值班员岗前操作技能考核试卷含答案
- 兽用生物制品制造工安全理论知识考核试卷含答案
- 蒸呢机挡车工标准化考核试卷含答案
- 煤气净化回收工岗中创新方法考核试卷含答案
- 活性炭生产工达标竞赛考核试卷含答案
- 加氢裂化(处理)装置操作工技术规范测试考核试卷含答案
- 烯烃转换装置操作工安全演练考核试卷含答案
- 化妆品配方师岗前技术突破考核试卷含答案
- 船舶管系工岗位健康知识考核试卷含答案
- 定向研究生录取协议书5篇
- 2026年山东省潍坊中小学教师招聘考试真题解析含答案
- 2026秋季福建福维新材料有限公司招聘42人考前冲刺密卷附参考答案详解【轻巧夺冠】
- 北京市朝阳区2025-2026学年九年级上学期期末考试物理试题(含答案)
- 2027年高考数学模拟试卷1(新高考Ⅰ)
- 民事起诉状(机动车交通事故责任纠纷)
- 2025年度房地产行业工会工作计划
- 教师岗位安全培训课件
- 麦粒肿针灸治疗
- 员工宿舍水电代扣协议书(2篇)
- 精读《乌合之众:大众心理研究》学习通超星期末考试答案章节答案2024年
- 2024-2025学年四川成都田家炳中学高一新生入学分班质量检测数学试题【含答案】
评论
0/150
提交评论