- 1、本文档共45页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译器的设计与实现 制作: 张 云 时间:2008-03 课程描述 目标:编译器的设计与实现 方法: 给定语言特性,限定目标机器模型,实现该语言的编译器; 添加新的语言特性,对编译器做相应的修改。 语言 进一步的扩展 加入对象 目标: 在简化的C的基础上增加对象的支持。 问题:什么是对象? 对一个程序员来说,对象就是一个带有相关语义学的存储区域。(C++ FAQ) 加入对象要解决的问题 1 要处理什么样的对象? 2 对象数据存放在何处?(对象模型的建立) 3 对象支持哪些操作? 4 实现 1处理什么样的对象 定义对象:将数据和操作封装在一起 没有继承 没有多态 没有指针,完全为引用(为了实现简单) 2对象数据应该存放在何处 方法一:类似于程序中局部变量全局变量的存储,将对象的数据存放在栈或静态存储区域中。 方法二:在堆上动态创建对象 比较 对象数据应该存放在何处 我们采用的方法: 参照的设计,对象都分配在堆上,仅仅声明并不创建对象;当使用了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; } } 对象模型 p是Point类的一个对象 3对象支持什么样的操作? 3.1对象创建 class Point p;//声明 在函数中声明一个对象与声明变量没有不同! =在函数栈中添加一个空间用来记录对象的”值” p = new Point();//创建对象,在堆上分配空间 对象封装了成员变量与成员函数 为对象赋值就是为对象的成员变量赋值 3.2成员变量访问 p.x = 1; 根据bp指针找到p,然后找到对象的成员变量的地址 成员函数的运行栈 4如何实现? 问题:对象在操作过程中所需要的信息从哪里获得? 类的定义 对象声明 对象的创建 对象的操作 如何实现? 对象操作 4.1中间形式 4.2符号表 4.3目标代码生成 4.3.1对象创建 实现 为对象在堆中分配空间 目标机器指令系统中增加了new指令 主要完成在堆上按照对象的需要分配空间的工作 P = new Point(); 生成代码 NEW p引用地址,Point 4.3.2 成员函数的调用 成员函数调用分两种情况: 在类定义外部调用成员函数 在成员函数内部调用其它的成员函数 在类定义外部调用成员函数 Point p; p = new Point(); p.Init(); 等价于 Point_Init(p); 生成代码如下: … ;函数参数入栈 Mov ax , [bp+3] Push ax ;对象地址入栈 Call Point_Init 在成员函数内部调用成员函数 class Point { f1(); f2(); } 其中 Point::f1() { f2(); } 转化为 Point_f1(Point this) { Point_f2(this); } 生成代码如下: Mov ax, [bp-1] ;取得this指针 Push ax Call Point_f2 4.3.3 成员变量的访问 成员变量访问也分两种情况: 在成员函数内部访问成员变量 在类定义外部访问成员变量 在类定义外部访问成员变量 举例 在成员函数内部访问成员变量 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 成员变量的访问 与成员函数的调用 小结 成员变量访问分两种情况: 需要解决的关键在于:如何找到要操作的成员变量的地址 解决方法:首先取得对象地址,然后加上变量本身的偏移量(可以在符号表中获得) 成员函数的调用也分两种情况: 需要解决的关键在于:如何找到调用该操作的对象的地址 解决方法:通过参数this给出 代码实现 符号表的设计 中间表示的设计 目标代码-目标代码在虚拟机中的运行-目标代码的生成 符号表中的变化 对象实现(类信息) public class ClassInfo { public string class_name; public int membervar_size; //用来列出所有的成员变量
文档评论(0)