OOP
和面向过程都是编程中的思想,用学术一些的话是
paradigm
。曾经有人说过,既然
cfront
生成的是
C
代码,那么用
C
本身乃至汇编都可以实现
OOP
,只是太多东西需要自己手工来完成。确实是这样的,面向过程早就用在汇编设计中了,
OOP
也早就和汇编有了交汇点(
95
年之前,
TASM
就引入了
OOP
的概念)。只是汇编实现
OOP
是没有形式上的,无法提供
C++
这样的
Strong-typed
和其他安全保证(比如存取权限)。封装只是一种概念上
的,自觉遵守的。
OOP 有几个关键,据我的粗浅理解即为:封装性,继承与多态。具体表现就是把数据和操作数据的函数放在一起,数据放在对象中,提供接口实现存取。继承性实 现了语义或者实现的继承,同时体现在概念层次与代码重用两个方面。多态则是利用指针实现使用 pointer 或 reference 来实现同一函数在不同继承 类中的多态表现。
OOP 的对象模型有好几种实现方式,在《 inside C++ object model 》中有极其详尽的叙述:
1. 只把数据放在对象中,而通过 name mangling 技术把 member-function 与 class 关联起来。
2. 单表模型,把 member function 的 pointer 放入到单独的一个表格,把表格的入口地址放入对象中(一个类对应一个表格)。这在 C++ 中表现为 Vtbl 与 Vptr ,这种模型实现了运行时的动态灵活性,虽然多了两次 dereference 。
3. 双表模型,把数据与函数分列在两个表格中,然后把两个表格的入口地址存放在对象中,使得单个对象有了固定的大小。
4. 简单模型,这个是汇编实做的时候用的模型。就是对象中即保存了数据也保存了函数地址。无论是 TASM 还是 MASM ,都是这么做的。
从效能上来说, C++ 的做法是最优的。汇编使用第四种是迫不得已,是为了实现的简单性。一定程度上与汇编的高效的精神违背。
TASM 已经不常用了,其 OOP 的做法和 MASM 的做法也是类似的。这里主要讨论 MASM 的 OOP 做法。作者是 NaN 和 Thomas Bleeker 。其实现的 办法是用宏定义来达到本来应该是编译器做的幕后工作。其中的宏的技巧很多。但是最终的使用是挺简单的。宏的定义放在一个 OBJECTS.INC 的文件中, asm 文件包含这个 inc 就能使用这个 object model 。
虽然宏做得很精巧,但是毕竟 MASM 缺少支持 OOP 的语法特性, 在使用的很多方面都有麻烦或者在空间时间上有代价。比如覆盖基类的虚函数必须每次手工的完成。也就是继承的层次中所有父类以上的被覆盖的虚函数都需要在子 类中手工完成。虽然是有这样那样的缺点,但是 OOP 还是给汇编带来了不少好处。比如:
1. 汇编更好的和 COM , C++ 这样的面向对象领域的东西互动。已经有用汇编+ OOP 调用 com 的例子。如果用汇编+ OOP 来写 com 将可以产生适合高速度和小尺寸的组件。
2. 扩大了汇编能够解决的问题范围,使得汇编程序更加容易管理和合作编写。这个 object model 的作者就用汇编+ OOP 写了一个基于神经网络的手写字母识别的程序,不到 200k (其中大部分是图象文件占用的空间)。
其余代码部分参见http://www.zxbc.cn/html/hbyyy/1020491379291.html
OOP 有几个关键,据我的粗浅理解即为:封装性,继承与多态。具体表现就是把数据和操作数据的函数放在一起,数据放在对象中,提供接口实现存取。继承性实 现了语义或者实现的继承,同时体现在概念层次与代码重用两个方面。多态则是利用指针实现使用 pointer 或 reference 来实现同一函数在不同继承 类中的多态表现。
OOP 的对象模型有好几种实现方式,在《 inside C++ object model 》中有极其详尽的叙述:
1. 只把数据放在对象中,而通过 name mangling 技术把 member-function 与 class 关联起来。
2. 单表模型,把 member function 的 pointer 放入到单独的一个表格,把表格的入口地址放入对象中(一个类对应一个表格)。这在 C++ 中表现为 Vtbl 与 Vptr ,这种模型实现了运行时的动态灵活性,虽然多了两次 dereference 。
3. 双表模型,把数据与函数分列在两个表格中,然后把两个表格的入口地址存放在对象中,使得单个对象有了固定的大小。
4. 简单模型,这个是汇编实做的时候用的模型。就是对象中即保存了数据也保存了函数地址。无论是 TASM 还是 MASM ,都是这么做的。
从效能上来说, C++ 的做法是最优的。汇编使用第四种是迫不得已,是为了实现的简单性。一定程度上与汇编的高效的精神违背。
TASM 已经不常用了,其 OOP 的做法和 MASM 的做法也是类似的。这里主要讨论 MASM 的 OOP 做法。作者是 NaN 和 Thomas Bleeker 。其实现的 办法是用宏定义来达到本来应该是编译器做的幕后工作。其中的宏的技巧很多。但是最终的使用是挺简单的。宏的定义放在一个 OBJECTS.INC 的文件中, asm 文件包含这个 inc 就能使用这个 object model 。
虽然宏做得很精巧,但是毕竟 MASM 缺少支持 OOP 的语法特性, 在使用的很多方面都有麻烦或者在空间时间上有代价。比如覆盖基类的虚函数必须每次手工的完成。也就是继承的层次中所有父类以上的被覆盖的虚函数都需要在子 类中手工完成。虽然是有这样那样的缺点,但是 OOP 还是给汇编带来了不少好处。比如:
1. 汇编更好的和 COM , C++ 这样的面向对象领域的东西互动。已经有用汇编+ OOP 调用 com 的例子。如果用汇编+ OOP 来写 com 将可以产生适合高速度和小尺寸的组件。
2. 扩大了汇编能够解决的问题范围,使得汇编程序更加容易管理和合作编写。这个 object model 的作者就用汇编+ OOP 写了一个基于神经网络的手写字母识别的程序,不到 200k (其中大部分是图象文件占用的空间)。
其余代码部分参见http://www.zxbc.cn/html/hbyyy/1020491379291.html