继承的语义

语形之下和语形之上

经过一系列复杂的分析,发现其实编译器可以分成两个层面:语形(Syntax)之下和语形之上。

特别地,语形之下这个层面,实际上是一大堆的符号识别和处理,包括整个源代码,都可以看成由一系列的符号符号之间的关系符号的属性,等等构成的一张复杂的图。在语形之下这个层面,所作的其实是将输入组织为这张图(进一步,一般又可以看成是一棵树)。语法解析一定程度上就是语形之下。语形之下又包括三个层次:lexer,tokenizer,parser。

语形之上这个层面,则根据语形之下的运行过程的结果,做语义的检查,并将语言翻译为对象语言

但是这两个层面现在被类型论贯通了,而面向对象又将类型和属性、定义、函数这些东西耦合起来。

有歧义的表达式

一个有点意外的事情是尖括号的处理(<,>),这里有个问题,例如下面的语句:

a<b> x;

这个语句实际上有两种解释的方法:

  • a<b> 是一种类型,x为a<b>类型的变量
  • 先计算 a<b 然后计算 (a<b) > x (或者从右向左结合)

那么编译器怎么能判定应该用那种解释的方法呢?如果不知道a是一个类模板,似乎就不能知道是第一种解释而不是第二种解释。这将会引入一个问题,在解析a<b> x的时候,还需要知道a是否是一个类模板,才能判定怎么解析。

我不知道c++的编译器是怎么做的,为了避免这个问题,现在使用方括号来表示类模板的参数……然后好像就没有这类的问题了。

子类型

继承和模板看着完全不同,但很大程度上似乎有着相似的功能,这里我还分不开,讲不清楚。但是现在有意引入额外的类型系统,大概是这样定义的:

  • (规则1)P类:表示一个参与计算过程的类。
  • (规则2)P类的Ultra类:一个只有纯虚函数没有值属性的类,P类的Ultra类有着P类的全部函数的纯虚函数版本。P类是P类的Ultra类的子类型(subtype),并重写(实现)了这些纯虚函数。
  • (规则3)P类的表现类:如果A类是P类的表现类,则A类一定不是Ultra类,且P类是A类的Ultra类的子类型。

这个定义没有使用“继承”这个术语,而是使用了“子类型”这个术语。

在翻译为c++代码的时候,每个P类会被翻译为两个类:P类和P_Ultra类。

在语法上,引入一个语法称为A类表现B类。使用“表现”而不是“继承”的一个好处是可以循环,例如:

A 表现 B, C;

B 表现 A, C;

C 表现 A, B;

翻译成c++以后,就变成 A,B,C实际上都是 A__Ultra, B__Ultra 和 C__Ultra 的子类, 但 A B C 又分别只有各自的数据。

还未解决的问题

是否能取消继承,还不确定,可能还有问题还待验证(保留子类型和组合类型)。

我总感觉已经有类似的技术,但我不知道叫什么。

类型检查和基础类型相关的机制(暂时称为“基础类型”?)还没完成。

当前的代码

下面的代码已经可以翻译了:

包(TestPackage);

可以之类 数学实体 {}

可以之类 判定机 {}

可以之类 矩形 表现 数学实体 {

    浮点数 长_;
    浮点数 宽_;
    
    浮点数 长(){
        返回 长_;
    }

    浮点数 宽(){
        返回 宽_;
    }

    浮点数 面积(){
        返回 长_ * 宽_;
    }

}

可以之类 形状判定机 表现 判定机 {

    布尔量 判定_正方形(矩形 a){
        返回 (a.长() > 0) && (a.长() == a.宽());
    }

}

先这样吧。感觉我32岁之前把这个东西做出来还是有点难的……

翻译出来来的.h文件:

/* Primitive Types */

typedef double 浮点数;

typedef bool 布尔量;

typedef int 整数;

/* Head Files */


/* Class Forward */

class 数学实体_Ultra;

class 数学实体;

class 判定机_Ultra;

class 判定机;

class 矩形_Ultra;

class 矩形;

class 形状判定机_Ultra;

class 形状判定机;


/* Class */

class 数学实体_Ultra {

};

class 数学实体 : public 数学实体_Ultra {

public:

    using UltraType = 数学实体_Ultra;

public:

};

class 判定机_Ultra {

};

class 判定机 : public 判定机_Ultra {

public:

    using UltraType = 判定机_Ultra;

public:

};

class 矩形_Ultra {

  virtual 浮点数 长() const = 0;

  virtual 浮点数 宽() const = 0;

  virtual 浮点数 面积() const = 0;

};

class 矩形 : public 数学实体_Ultra, public 矩形_Ultra {

public:

    using UltraType = 矩形_Ultra;

public:

    浮点数 长_;

    浮点数 宽_;

    virtual 浮点数 长() const override;

    virtual 浮点数 宽() const override;

    virtual 浮点数 面积() const override;

};

class 形状判定机_Ultra {

  virtual 布尔量 判定_正方形(矩形 a) const = 0;

};

class 形状判定机 : public 判定机_Ultra, public 形状判定机_Ultra {

public:

    using UltraType = 形状判定机_Ultra;

public:

    virtual 布尔量 判定_正方形(矩形 a) const override;

};

翻译出来的cpp文件:

/* Head Files */

#include "TestPackage\test.h"
/* Gen code for 数学实体 */


/* Gen code for 判定机 */


/* Gen code for 矩形 */

浮点数 矩形::长() const
{
  return 长_;
}

浮点数 矩形::宽() const
{
  return 宽_;
}

浮点数 矩形::面积() const
{
  return (长_*宽_);
}


/* Gen code for 形状判定机 */

布尔量 形状判定机::判定_正方形(矩形 a) const
{
  return ((((a.长)()>0))&&(((a.长)()==(a.宽)())));
}


最后

春节快乐!

下载

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注