Compiler construction 编译器如何实现类型别名?

Compiler construction 编译器如何实现类型别名?,compiler-construction,programming-languages,type-alias,Compiler Construction,Programming Languages,Type Alias,许多语言支持类型别名。比如说, // C typedef oldType newType // go type oldType = newType 它是如何在内部实现的?一般来说,每个类型对应于编译器内部类型对象的一个实例。在编译器生成的可执行代码中,该对象是否具有任何类似项将因语言而异。名称将通过符号表别名到类型实例;如果两个名称是同一类型的别名,则它们的符号表条目可能引用相同的内容 通常可以使用类型运算符(如数组维度或结构/元组聚合)从其他类型创建类型,因此类型的名称不一定是简单标识符;它

许多语言支持类型别名。比如说,

// C
typedef oldType newType
// go
type oldType = newType

它是如何在内部实现的?

一般来说,每个类型对应于编译器内部类型对象的一个实例。在编译器生成的可执行代码中,该对象是否具有任何类似项将因语言而异。名称将通过符号表别名到类型实例;如果两个名称是同一类型的别名,则它们的符号表条目可能引用相同的内容


通常可以使用类型运算符(如数组维度或结构/元组聚合)从其他类型创建类型,因此类型的名称不一定是简单标识符;它也可能是某种表达方式。由语言设计者决定以相同方式构建的两个类型是否为相同的类型。例如,在C中,具有相同元素类型和相同维度的两个数组类型是相同的类型,而具有相同成员类型的两个结构类型不是相同的类型。这些决定都不是强加给语言设计者的,其他语言可能有不同的约定。再次,作为例子,当C++通过两个具有相同成员的不同类型的结构来跟踪C时,两个具有相同模板列表的STD::元组是相同的类型。这些语言设计决策将影响编译器中定义类型对象相等的方式,因此也可能影响类型别名的实现方式。

实际上有很多种方式。它可以实现为宏,也可以传播。@Xilpex您能详细说明这两种方法吗?