ad

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_5.1 基本的数据类型

网友投稿 69 2023-11-07

【摘要】 本书摘自《自己动手写 Python 虚拟机》一书中第5章,第1节,海纳编著。

第五章 基本的数据

在前两章里,虚拟机中的对象体系没有实现起来。在进一步实现其他字节码的 功能之前,必须把对象体系建立起来。这一章从虚拟机中的基本数据类型入手。

《自己动手写 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 在整个系统中 只需要一个就够了。符合这种特点的对象,往往采取单例模式来实现。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 [email protected] 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:跟着一起学《Excel VBA跟卢子一起学 早做完 不加班 基础入门版》_3.1 常用语句 函数方法
下一篇:跟着一起学《Excel VBA跟卢子一起学 早做完 不加班 基础入门版》_3.1.2 IIF 函数的语法及用法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×