第十章 类、对象与实现(四)

2015-01-27 06:28:22 · 作者: · 浏览: 123
地址值:

BUxHBBL{};//高16位行数x,低16位行开始相对地址;块号在对象头表。

元素或属性或说是变量的声明:BUxW 变量名字; // 注释…。
BUxW声明了变量的数据内容包含x个字,或说是2x个字符串。BUx 声明了包含x个位,BUxK 声明了包含x K个位,BUxM 声明了包含x M(百万)个位。在APO中,位容器的声明通常以行(256位)为单位的;因为APO包含有256位为单位的位处理器。

对象属性表的存储布局:
这要举例才好说明,

BU19H表1{ // 19行的表变量。(高16位为行数x,低16位为行开始地址)

DYV G; // G是动态变量的引用变量。对象属性表可能有n个引用。

// 行开始地址是第0行;行的字地址0;引用变量最小占一行,一行8个引用。

BU32 A; //A变量是32位的位容器或说是2个字符或一个字,BU32 = BU2Z

BU99W B; //B变量是99字的存储空间,或是198个字符的字符串数组。

// 行开始地址是第1行,行字地址为0,长度99,占行数13行,最后行空5W。

BU32 C; //C是32位的位容器;A、C变量可插入第13行的空洞。

BU1K D; //D是1K位的位图,也可能是一个字数组,取决于你的代码。

// D变量行开始地址是第14行;行的字地址为0,长度32W,占行数4行。

BU4W E; //E变量行开始地址是第18行;行的字地址为0,长度4

BU2W F; //F变量行开始地址是第18行;行的字地址为4,长度2

引用变量内容定义:高16位是动态变量所占行数,低16位为对象号。动态对象序号在对象号区,0xC000- 0xFFFF。8K

表内的变量可看作全是1W的数组,对于静态表来说;要实现不同宽度数组就要定义表内表了。而动态数组就靠程序员了;当然,对于动态数组;编译器还是会多编译一条传送数组的16位宽度的成员项数和成员位宽度到CPU的寄存器B的指令的。

编译器翻译原则:

1)、先编排4W的变量在一起,其次是2W的变量;因它们可能是数值,也易于对齐。动态变量的所有引用变量(1W一个)放在一起成字数组,放于表头,最少占1行(8个)。

2)、多于4W的变量地址都是以行地址开始。

3)、最后是在有空洞的行插入1W/2W/3W的变量地址。

表内变量对应的地址值定义:

BU32 BL;

Bit31 T; // 为0,则Bit30?16的15位是字长度;所以变量的内容最多32KW或4KH。如需要大内容变量,那就要定义对动态变量的引用了;在运行时再分配空间。

// T标志为1是变量的内容长度小于1行; Bit29?24的6位为长度及行的字开始地址。Bit30为1为引用变量,Bit29?27:111数组、110向量;100为对象引用等。Bit26?24的3位为行的字开始地址。变量类型属性字节Bit23?16用于特殊对象。

BU16 HDV; //变量所在的16位的行开始地址。


编译器翻译后的变量地址:不到一行的(8位,8位,16位)一组,保留字节为0,超过一行的(16位,16位)一组。

E = (10 100000,0,18);F= (10 010 100,0,18);

G = (11XXX 000,0,0);B = (99,1);D = (32,14);

A = (10 001100,0,13);C = (10 001110,0,13);

一个表必须完全被包在一个数据块里,一个数据块是64KH。我们可以在表内或代码块内声明一个动态变量为一个数据块,甚至连续数据块变量;而在表内引用该变量。但最长的字符串只有1M个字符,占一个数据块。一个数据块可以装多个表;或许有空洞。我认为内存合理分配,也应该需要程序员参与。字符串,数组,代码段在表内只是一个内容不超过32KW的变量。变量、对象的名字等可以用汉语双拼简写或英文简写或直接中文也行,APO编译器支持U编码的。

方法(method)表声明:

BUNH 方法表名字{//变量地址(方法表的16位行数,方法表的16位起始行地址)

BUxW 方法1; // 方法1变量地址(0,15位方法的指令长度x,方法的起始行地址)

….

}

方法表中的方法是一个接着一个的以行为单位紧密存放的。调用方式是:

类名(或对象名字).方法名字; 编译器会由类名或对象名字、方法名字从符号表中得到类号、对象号和方法指令长度、方法的起始行地址,将这4个值和指令长度、行数一起编译成指令传到寄存器A、B。接着据A、B寄存器,设置数据块号;并将方法的起始行地址作为方法入口指针,调用相应的方法。所以,调用任何一个方法必须指明对象名或类名。当然,调用系统中的类则无须指明类名;因为系统中的所有类中的方法都在第一个数据块的本地内存中;只需要方法名的起始行地址作为方法入口指针,调用相应的方法。对于本类也可以用this来指代。

二、面向对象编程

我们可以这样说:万物皆对象,在程序里一切皆变量(对象、方法、属性、表)。

面向过程的思想:由过程、步骤、函数组成,以过程为核心;面向过程是先有算法,后有数据结构。

面向对象的思想:以对象为中心,先开发类,得到对象,通过对象之间相互通信实现功能。面向对象是先有数据结构,然后再有算法。

我们知道同一个类的对象可以有很多个,对应的对象属性表也有很多;但只有一个方法表。具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。一个程序是由很多不同或相同种类的对象组成,以进程的形式在内存中运行时还可能动态增减一些新的对象。进程的执行体是线程对象,也就是说对象或方法的运行必须是通过线程对象来进行。在APO中可以有最少一个线程对象(主线程),最大32K个线程对象。其它活动对象最多也只是32K个;所以在APO中,一个进程最多有64K个打开的对象。但这并不包含打开的文件对象,一个进程打开的文件对象数最大可达64K个;是另外的文件对象管理员管理的。其实,在一个进程里;通常有4个管理员:文件对象管理员、线程对象管理员、普通对象管理员、内存管理员。管理员是通用的,系统内含的,每一个程序都要继承它们。我会以编写新型的APO操作系统为例,来说明面向对象编程的方式、过程。

1、面向对象的特征:

(1) 对象唯一性


在一个进程中,每个对象都有自身唯一的标识(16位的所属类号和16位的对象号),通过这种标识,可找到相应的对象(方法表、属性表入口,大小,引用计数)。在对象的整个生命期中,它的标识都不改变。

(2)分类性

任何类的划分都是主观的,但必须与具体的应用有关。

(3)继承性

继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。
在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。


在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法;它简化了对象、类的创建工作量,使程序结构更清晰;增加了代码的可重性。采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。继承是单方向的,即