excel 中的数据类型使用技能-英雄云拓展知识分享
139
2023-11-07
【摘要】 本书摘自《自己动手写 Python 虚拟机》一书中第5章,第1节,海纳编著。
第五章 基本的数据类型
在前两章里,虚拟机中的对象体系没有实现起来。在进一步实现其他字节码的 功能之前,必须把对象体系建立起来。这一章从虚拟机中的基本数据类型入手。
5.1 Klass-Oop 二元结构
到目前为止,只有一个 HiObject 类 ,Integer 和 String 都是继承自这个类。回顾 一下,Integer 的 equal 方法,代码如下:
1 HiObject*HiInteger::equal(HiObject*x)(
2 if(_value ==((HiInteger*)x)>_value)
3 return Universe::HiTrue;
4 else
5 return Universe::HiFalse;
6 }
上述代码里的参数x, 它的类型是Integer 当然没问题,但假如这个 x 的实际类 型如果不是 Integer, 这段代码就不能正常工作了。
需要一种机制来判断某个 HiObject 对象的实际类型到底是什么。在编程语言 虚拟机中,最常用的解决办法就是Klass-Oop 的二元结构。Klass 代表一种具体的 类型,它是“类”这个概念的实际体现。例如,Integer类在虚拟机里就有一个 Inte- gerKlass 与之对应,所有的整数都是 IntegerKlass 的 实 例 。Oop 是 Ordinary object pointer 的缩写,代表一个普通的对象。每一个对象都有自己的 Klass,同一类对象是 由同一个 Klass 实例化出来的。
类与类之间有继承关系,类里还会封装其他的属性和方法,这些都会在 Klass 的 结构里呈现。使用这种二元结构,还有一个原因是,我们不希望在普通对象里引入虚 函数机制,因为虚函数会在对象的开头引入虚表指针,而虚表指针会影响对象的属性 在对象中的偏移。因此,就将类的方法定义和实现都放到 Klass 中,而在 HiObject 里只需要调用相应的 Klass 中的函数。
先来定义 Klass 类,代码如下:
目前的 Klass 类只有一个属性, _name 代表这个类的名称,它是一个字符串。
Klass 类中最重要的是上述代码中出现的12个虚函数。正如前面分析中提到 的,要把虚函数机制从对象中搬到 Klass 中去。在这个版本的 Klass 中,先使用一个 空的函数体,这个函数体的意义仅仅在于让程序能正确地编译,除此之外,并没有什 么意义。
有 了Klass 定义,HiObject 的定义也要发生相应的修改,必须在 Object 类里增 加一个属性: 一个指向Klass 的指针,用于表示这个对象的类型。另外,由于已经把 虚函数都搬到 Klass 中去了,HiObject 中原来定义的函数就都不必是虚函数了。把 HiObject 中的函数都实现为转而调用自己所对应的 Klass 的 函 数 。HiObject 的定 义变为以下形式:
5.2 整 数
在原来的系统里已经实现了整数。在 Klass-Oop 二元结构下,整数类也需要 做相应的修改。第一处修改就是头文件,Hilnteger 类中的虚函数声明不再需要,Hi- Integer 的方法均继承自 HiObject。这样一来,Hilnteger 类就变得很简洁了,代码 如下:
1 class HiInteger:public HiObject{
2 private:
3 int_value;
4
5 public:
6 HiInteger(int x);
7 int value(){return_value;}
8 );
第二处修改是要实现 IntegerKlass, 用于表示 Integer 类型。如图5 . 1所示,系 统中的所有 Integer 对象,它的 Klass 指针(继承自 HiObject) 都应该指向同 一 个 Klass 对象,就是现在要定义的这个 IntegerKlass 。 可 见 ,IntegerKlass 在整个系统中 只需要一个就够了。符合这种特点的对象,往往采取单例模式来实现。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~