学的语言多了,发现同一种目的,各个语言都有自己一套方法来解决。 就比如标题提到的 n 种方法都可以完成 code reuse 这个目的。
但是正常人就要问了:
花里胡哨的,都有啥区别?
我觉得还是有必要自己总结一下,学习亿下 语言设计 的智慧。
大坑,不定期啥时候填。
1. 简介
这几种方法,我们主要关注的有几点。这几点实现和细节会在 2. 章中细写。
- name resolution: 同样的一个函数/字段,可能对应多个具体的函数/字段,需要确定是哪一个
- object layout: 对象在内存中,数据、方法、vtable 等等怎么排布
1.1 继承
继承在 C++, Java, Python 里面都有,是一种很常见的 code reuse 手段。
特点有
- 通过 对象内部保存的 vtable 来完成 name resolution。
- 每个子类对象里面都包含了一个父类对象。
问题是:
- [多继承]: 是否允许一个类有多个父类?
- Java 不允许,而 Python / C++ 允许
- [钻石继承]: 如果允许,假设
D
继承了B
和C
,而B
和C
都继承了A
- 那么一个
D
对象应该包含几个A
对象?是一个,还是B.A
和C.A
各一个?
- 那么一个
导致的 complexities 如
class D: public B
和class D: virtual public B
都是啥?- 多继承的情况下,默认的 layout 导致 name resolution 不可做
- 使用 graph coloring 或者 hash (参见 [2] 14.3)
- C++ 用 pointer fixup
1.2 接口
在 Java 里面有,也很常见。
特点有
- interface 里面只有函数,没有字段
- jdk8 开始允许有默认实现了
- 一个类可以实现多个 interface;interface 可以继承其他 interface
1.3 type class
1.4 delegation
1.5 module
1.6 trait
1.7 mixin
2. 编译器内部实现
2.1 继承
只讨论单继承,多继承参见 [2] 和 g++ 实现。
使用虚表实现。一种示例设计如下。
class A {
int a;
virtual void f1() { /* at addr A_f1 */ };
virtual void f2() { /* at addr A_f2 */}; };
class B: public A {
int b;
virtual void f2() override { /* at addr B_f2 */};
virtual void f3() = 0; };
// 提一句:假设 A *a = new A; 那 a.f1() 实际上是调用一个函数 A::f1(a)
// 即:method 本质是函数
那么 B 和 A 对象在内存里表示为
B OBJECT VTABLE
+-----------+ +----------+
new B-> | vtable<B> +-------> | A_f1 |
+-----------+ +----------+
| a | | B_f2 |
+-----------+ +----------+
| b | | NULL |
+-----------+ +----------+
A OBJECT VTABLE
+-----------+ +----------+
new A-> | vtable<B> +-------> | A_f1 |
+-----------+ +----------+
| a | | A_f2 |
+-----------+ +----------+
- 虚表就是 this 开始第一个指针
this[0] -> VTABLE
- 其中 f1 在虚表里面第一个元素
VTABLE[0]
调用虚函数的时候,真正要跳转到的函数地址要去虚表里面查。
例如调用 A::f2(A* a)
,我们传参 a
以后跳转到 (a[0])[1]
。
A::f2(A* a)
mov a, %rdi
mov 0(a), %rax
mov 8(%rax), %rax
call *%rax
这样我们能保证 A* a = new B; a->f2();
一定调用的是 B
重写的 f2
。
2.2 接口
TODO: itable
2.3 type class
2.4 delegation
2.5 module
2.6 trait
2.7 mixin
3. 比较
TODO
References
[1] Wikipedia
[2] Modern Compiler Implementation in Java. 2e
[3] Programming Language Pragmatics. 4e