结构等价与名称对等

时间:2010-12-20 02:17:34

标签: type-equivalence

我似乎无法准确掌握名称的等价性。我很确定我的结构已经下降了。我教授给出的一个例子是:

 Type TI=integer
 Type TTI=TI

 a=integer
 b=TTI
 f= ref float
 g= ref float

a和b都是结构和名称等价的,而f和g只是结构上的等价。我不明白为什么a和b是名字等价的,但f和g不是。

6 个答案:

答案 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;

如果名称等效在语言中使用,则xy属于同一类型,rs将是属于同一类型,但xy的类型不等同于rs的类型。这意味着诸如

之类的陈述
   x = y;
   r = s;

是有效的,但是

之类的陈述
   x = r;

无效(即翻译人员不接受)。

使用结构等价:两种类型是相等的,当且仅当它们具有相同的“结构”时,才能以不同的方式进行解释。 />  严格的解释是两种类型的每个组件的名称和类型必须相同,并且必须在类型定义中以相同的顺序列出。
 不太严格的要求是组件类型必须在两种类型中相同且顺序相同,但组件的名称可能不同。

再看一下上面的例子,使用结构等价,两种类型StackSet将被认为是等价的,这意味着翻译者会接受诸如< / 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)

如果考虑编译器可能用于表示类型的内部数据结构,则名称等效的概念最有意义。假设类型表示为数据结构的指针。此外,假设我将类型等价检查实现为简单的指针比较(例如名称等价)。像integerfloat这样的原始类型将存储在某些全局环境中,因为它们只有有限数量。此外,如果我将integerinteger进行比较,则保证它们是等效的,因为它们指向相同的结构,因为这种全球环境。

但是,由于ref不是类型构造函数,而不是原子类型,我可以使用它来创建无限多种类型(例如ref float,{{1}等等)。所以我们不能将它们全部存储在全球环境中。编译器可以采用一种简单的策略来管理这些类型,每当遇到类型构造函数时,都会分配一个新结构,我们为该类型分配一个新的数据结构。因此ref ref float的实例将导致一个新的数据结构,ref float的另一个实例将导致一个全新的,不同的数据结构。指针比较失败,因此它们无法等同于名称。

还有一个问题,即你的赋值运算符的语义。此类别别名是编译器中的简单指针副本,因此如果我写ref floatA=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”的不同对象