我似乎无法准确掌握名称的等价性。我很确定我的结构已经下降了。我教授给出的一个例子是:
Type TI=integer
Type TTI=TI
a=integer
b=TTI
f= ref float
g= ref float
a和b都是结构和名称等价的,而f和g只是结构上的等价。我不明白为什么a和b是名字等价的,但f和g不是。
答案 0 :(得分:31)
类型平等
在语言定义中指定了基本操作的含义,例如赋值(在C中用=表示)。因此,例如,诸如
之类的陈述的含义x = y;
此处将对象y
的值复制到变量x
的内存位置。
但是,在转换程序可以接受诸如赋值之类的操作之前,通常两个操作数的类型必须相同(或者可能以某种其他指定的方式兼容)。
因此,语言翻译者必须决定在某些情况下两种类型是否相等。我们现在考虑说两种类型是“相等”(或等价物)意味着什么。
有两种标准方法可以确定两种类型是否相同:名称等同性和结构等效性。
名称等价是最直接的:两种类型是相等的,当且仅当它们具有相同的名称时。因此,例如,在代码中(使用C语法)
typedef struct {
int data[100];
int count;
} Stack;
typedef struct {
int data[100];
int count;
} Set;
Stack x, y;
Set r, s;
如果名称等效在语言中使用,则x
和y
属于同一类型,r
和s
将是属于同一类型,但x
或y
的类型不等同于r
或s
的类型。这意味着诸如
x = y;
r = s;
是有效的,但是
之类的陈述 x = r;
无效(即翻译人员不接受)。
使用结构等价:,两种类型是相等的,当且仅当它们具有相同的“结构”时,才能以不同的方式进行解释。 />
严格的解释是两种类型的每个组件的名称和类型必须相同,并且必须在类型定义中以相同的顺序列出。
不太严格的要求是组件类型必须在两种类型中相同且顺序相同,但组件的名称可能不同。
再看一下上面的例子,使用结构等价,两种类型Stack
和Set
将被认为是等价的,这意味着翻译者会接受诸如< / p>
x = r;
(请注意,C
不支持结构等效,并且会为上述分配提供错误。)
答案 1 :(得分:4)
考虑下面的两个定义。
type student = record
name, address : string
age : integer
type school = record
name, address : string
age : integer
x : student;
y : school;
在上面的例子中,变量x和y将被视为在名称等价下具有不同的类型:x使用在第1行声明的类型; y使用第4行声明的类型。名称等效基于这样的假设:如果程序员努力编写两个类型定义,那么这些定义可能意味着代表不同的类型。 (我不确定你给出的例子)
参考:编程语言语用学,由M.L.斯科特
答案 2 :(得分:3)
如果考虑编译器可能用于表示类型的内部数据结构,则名称等效的概念最有意义。假设类型表示为数据结构的指针。此外,假设我将类型等价检查实现为简单的指针比较(例如名称等价)。像integer
和float
这样的原始类型将存储在某些全局环境中,因为它们只有有限数量。此外,如果我将integer
与integer
进行比较,则保证它们是等效的,因为它们指向相同的结构,因为这种全球环境。
但是,由于ref
不是类型构造函数,而不是原子类型,我可以使用它来创建无限多种类型(例如ref float
,{{1}等等)。所以我们不能将它们全部存储在全球环境中。编译器可以采用一种简单的策略来管理这些类型,每当遇到类型构造函数时,都会分配一个新结构,我们为该类型分配一个新的数据结构。因此ref ref float
的实例将导致一个新的数据结构,ref float
的另一个实例将导致一个全新的,不同的数据结构。指针比较失败,因此它们无法等同于名称。
还有一个问题,即你的赋值运算符的语义。此类别别名是编译器中的简单指针副本,因此如果我写ref float
,A=B
的名称始终等同于A
。但是,重申一下,B
并不等同于F A
的另一个实例!
答案 3 :(得分:2)
a和b是alies,这就是为什么它们等同于名称。 f和g不是这样,它们不是名字等价的。
答案 4 :(得分:1)
在名称类型等效中,如果两个变量在同一声明中或在使用相同类型名称的声明中定义,则它们具有相同的类型。因此,示例中的变量'f'
和'g'
是等价的。但是,变量'a'
和'b'
不是等价物,因为它们具有不同的类型名称。
此外,在结构类型等价下,如果两个变量具有相同的结构,则它们具有相同的类型。因此,变量'a'
和'b'
是等价的,变量'f'
和'g'
也是等价的,因为显然,具有相同名称的类型具有相同的结构。
参考:Sebesta,编程语言概念,第10版。
答案 5 :(得分:0)
别名:多个名称指的是同一对象(即,可以使用不同的名称访问相同的内存位置)
a和b是别名,而f和g指的是恰好都是“ ref float”的不同对象