0%

XSharp开发思路-Type

一个好的编程语言需要有一个好的类型系统

笔者计划为 XSharp 开发一个静态且可拓展的类型系统,其中支持基本类型(如i32,i64),数组,函数,Closure,类等类型及其复合

而复合的需求就意味着类型必须是多层次,且多种类型的形式,而树这种数据结构正好符合要求

于是TypeNode出现了

我们社设计具体类型的类型相关设置,从而构建不同的类型结构,如 ArrayType 有 elementType 的子类型,FunctionType 有 paramTypes 的子节点列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

class TypeNode;

//arrayDimension指的是数组类型的维度
//而elementType则是元素类型的TypeNode指针
struct ArrayType {
uint arrayDimension;
TypeNode* elementType;
};

//paramTypes指的是参数的类型
//returnValueType则是返回值的类型
struct FunctionType {
std::vector<TypeNode*> paramTypes;
TypeNode* returnValueType;
};

TypeNode则用枚举Category表示类型的范畴,即类型相关的类型设置(typeSpecifiedInfo)的范畴

从而确定 TypeNode 的类型结构,使用std::variant使存储多种类型相关设置成为可能

搭配上Category,就可根据category解析 variant 类型的typeSpecifiedInfo,获得具体的类型信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class TypeNode
{
public:
TypeNode();
TypeNode(const TypeNode& other);
~TypeNode();
bool equals(const TypeNode& other) const;

// Basic type
BasicType basicType() const;

// Function type, TODO complete below
TypeNode* returnValueType() const;
std::vector<TypeNode*> paramsType() const;

// Array type, TODO complete below
uint arrayDimension() const;
TypeNode* elementType() const;

// Class type, TODO complete below

// generate a unique name for a type
XString typeName() const;

uint typeID;
XString baseName;
bool isConst;
enum Categories { Basic, Array, Function, Closure, Class } category;

std::variant<BasicType, ClassType, FunctionType, ArrayType, ClosureType>
typeSpecifiedInfo;
};

同时注意到typeID,我们将会在编译时为特定类型分配唯一(unique)的 typeID,并通过 typeID 实现运行时反射

在 TypeSystem 中我们将实现这一功能