类型和声明
类型表达式
类型自身也有结构,我们使用类型表达式(type expression)来表示这种结构。
类型表达式可以是基本类型,也可以把称为类型构造算子的运算符作用于类型表达式得到。
CRE:类型构造符作用于基本类型,可以得到数组、元组、函数等类型。
类一旦被定义,其名字就可以被用来表示类型名。
- 类型构造符示例
- 数组构造符array
- 指针构造符pointer
- 笛卡尔乘积构造符 ×
- 函数构造符 →
- 记录构造符record
- 类型表达式示例
struct stype
{
char[8] name;
int score;
}
stype[50] table;
stype* p;
和stype绑定的类型表达式:
record((name × array(8,char)) × (score × integer))
和table绑定的类型表达式:
array(50, stype)
和p绑定的类型表达式:
pointer(stype)
类型等价
两种类型之间结构等价(structurally equivalent)当且仅当下面某个条件为真。
- 他们是相同的基本类型。
- 他们是将相同的类型构造算子应用于结构等价的类型而构造得到的。
- 一个类型是另一个类型表达式的名字。
如果类型名仅仅代表它自身,那么上述定义中前两个条件定义了类型表达式的名等价(name equivalence)关系。
局部变量名的存储布局
从变量类型我们可以知道变量在运行时刻所需要的内存数量。在编译时刻,我们可以使用这些数量为每个名字分配一个相对地址。
名字的类型和相对地址信息保存在相应的符号表条目中。
注意内存对齐(align)。
类型的宽度(width)是指该类型的一个对象所需的存储单元数量。
为方便访问,为数组和类这样的组合类型数据分配的内存是一个连续的存储字节块。
(END)