ad

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_4.1.3 True False 和 None

网友投稿 65 2023-11-07

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

4.1.3 True False 和 None

在前面的实现中,当使用True 和 False 时,都是使用整型的1和0代替的。实 际上,整个虚拟机中只需要唯一的 True 对象和唯一的 False 对象。要实现全局唯 一,自然会想到 static 变量。除了True 和 False, 还有一个是None 对象,它也是全局 唯一。

类似 True 和 False 这种全局唯一变量,未来还会遇到很多,因此所有的这些变 量都要集中起来放到一个类中。不妨称这个类为Universe, 它的定义如代码清单4. 11所示。

1 class Universe {

2 public:

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_4.1.3 True False 和 None

3 static HiInteger*HiTrue;

4 static HiInteger*HiFalse;

5

6 static HiObject*HiNone;

7

public:

9 static void genesis();

10 static void destroy();

11 };

在 Universe 类中,定义了三个静态变量,分别代表 True,False 和 None; 定义了 两个方法, 一个名为创世纪,就像宇宙的诞生,这里创建了虚拟机最原始的对象结构, 虚拟机里的所有对象以后都会以这个方法为起点; 一个为destroy, 顾名思义,这个方 法应该是在虚拟机退出的时候调用,销毁对象、释放资源和清理空间。下面我们看一 下这个类的具体实现,如代码清单4.12所示

首先,是 True,False 和 None 对象的初始化。static 变量在源文件中定义初始 化而不是在头文件中,是为了避免多个目标文件的链接冲突。在 genesis 方法里做 真正的初始化,这样做的好处是,我们对对象初始化的时机有绝对的掌控,而不是交 给编译器去决定。就是说,只有在明确地调用 genesis 时,对象才会真正开始初始 化,这就给了我们机会在对象初始化之前做一些额外的工作。

实际上,完全可以把 HiTrue 和 HiFalse 初始化为任意对象。我们在意的是它们 的地址,而不是它们是什么。就是说,只要指定一个绝对地址,然后说它就是 True, 或者说它就是 None 。这样一来,在 BinaryFileParser 里,终于可以在解析常量表的 时候,遇到 N 时直接使用 HiNone, 而不是NULL 。 还有,在 Hilnteger 的 greater 方 法里,不必每次都创建一个新的对象,而是只要返回一个全局唯一的 True 和 False, 代码如下:

1 HiInteger *Universe::HiTrue =NULL;

2 HiInteger*Universe::HiFalse =NULL;

3

4 HiObject * Universe::HiNone =NULL;

5

6 void Universe::genesis(){

7 HiTrue =new HiInteger(1);

8 HiFalse =new HiInteger(0);

9

10 HiNone =new HiObject();

11 }

12

13 void Universe::destroy(){

14

其他如 less 、equal 等方法都有相同的修改。还要注意的是 interpreter 中对 JUMP_IF_FALSE 的实现,在判断 False 时,也不必再使用强制类型转换,而是换成 更加简单的地址比较,代码如下:

case ByteCode::POP_JUMP_IF_FALSE:

v=POP();

//if(((HiInteger*)v)->value()==0)

if(v==Universe::HiFalse)

pc =op_arg;

break;

新的实现方式看上去就舒服多了。有了这些铺垫,接下来研究循环结构

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

上一篇:《自己动手写 Python 虚拟机》_更理解虚拟机的意义_2.4.1 构建AST
下一篇:跟着一起学《Excel VBA跟卢子一起学 早做完 不加班 基础入门版》_3.4.1 统一购票进门: With…End With
相关文章

 发表评论

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

×