2010-12-20 25 views
7

Parece que no entiendo exactamente qué es equivalencia de nombre. Sin embargo, estoy bastante seguro de que tengo una estructura estructural. Un ejemplo de mi profesor dio fue la siguiente:equivalencia estructural vs equivalencia de nombre

Type TI=integer 
Type TTI=TI 

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

a y b son tanto estructurales como nombre equivalente, mientras que F y G son simplemente equivalent.I estructurales no entienden por qué ayb sería equivalente de nombre, pero f y g no lo son

Respuesta

2

a y b son alias por eso son nombres equivalentes. f y g no son así que no son equivalentes.

3

La noción de equivalencia de nombre tiene más sentido si se consideran las estructuras internas de datos que un compilador podría usar para representar tipos. Supongamos que los tipos se representan como punteros a las estructuras de datos. Además, supongamos que implemento la verificación de equivalencia de tipo como una simple comparación de puntero (por ejemplo, equivalencia de nombre). Los tipos primitivos como integer y float se almacenarían en algún entorno global, ya que solo hay un número limitado de ellos. Además, si comparo integer con integer, se garantiza que son equivalentes porque apuntan a la misma estructura, en virtud de este entorno global.

Sin embargo, puesto ref no es un constructor tipo, no un tipo atómico, puedo utilizarlo para crear un número infinito de tipos (por ejemplo ref float, ref ref float, etc). Entonces no podemos almacenarlos todos en un entorno global. Una estrategia fácil que el compilador puede adoptar para administrar estos tipos es asignar una nueva estructura siempre que nos encontremos con un constructor de tipos, asignamos una nueva estructura de datos para ese tipo. Por lo tanto, la instancia de ref float daría como resultado una nueva estructura de datos, y la otra instancia de ref float daría como resultado una estructura de datos completamente nueva y diferente. La comparación del puntero falla y, por lo tanto, no son equivalentes.

Hay una pieza más en el rompecabezas, que es la semántica de su operador de asignación. Este tipo de alias es una copia de puntero simple en el compilador, por lo que si escribo A=B, A es siempre el nombre equivalente a B. Pero, para reiterar, F A no es el nombre equivalente a otra instancia de F A!

3

Considere las dos definiciones a continuación.

type student = record 
    name, address : string 
    age : integer 

type school = record 
    name, address : string 
    age : integer 

x : student; 
y : school; 

En el ejemplo anterior, se tendrán en cuenta variables x e y para tener diferentes tipos bajo el nombre equivalencia: X utiliza el tipo declarado en la línea 1; y usa el tipo declarado en la línea 4. La equivalencia del nombre se basa en la suposición de que si el programador se esfuerza por escribir dos definiciones de tipo, probablemente esas definiciones representen diferentes tipos. (No estoy seguro del ejemplo que usted ha dado)

Referencia: Lenguajes de programación Pragmatics, por M.L. Scott

1

En una equivalencia de tipo de nombre, dos variables tienen el mismo tipo si están definidas en la misma declaración o en declaraciones que usan el mismo nombre. Por lo tanto, las variables 'f' y 'g' en su ejemplo son equivalentes. Sin embargo, las variables 'a' y 'b' no son equivalentes, porque tienen diferentes tipos de nombres. Además, en la equivalencia del tipo de estructura, dos variables tienen el mismo tipo si tienen estructuras idénticas.Por lo tanto, las variables 'a' y 'b' son equivalentes y también las variables 'f' y 'g' son equivalentes porque, obviamente, los tipos con el mismo nombre tienen la misma estructura.

Referencia: Sebesta, Concepts of Programming Languages, 10ª ed.

19

Tipo Igualdad

El significado de las operaciones básicas tales como asignación (denotado por = en C) se especifica en una definición de lenguaje. Así, por ejemplo, el significado de expresiones como

x = y; 

aquí el valor del objeto y se copia en las posiciones de memoria para la variable x.

Sin embargo, antes de que el traductor acepte una operación como una asignación, generalmente los tipos de los dos operandos deben ser iguales (o quizás compatibles de alguna otra forma especificada).

Por lo tanto, un traductor de idiomas debe decidir si dos tipos son iguales en algunos casos. Ahora consideramos lo que significa decir que dos tipos son "iguales" (o equivalentes).

Hay dos formas estándar para determinar si dos tipos se consideran el mismo nombre: equivalencia y equivalencia estructural.

La equivalencia de nombre es la más directa: dos tipos son iguales si, y solo si, tienen el mismo nombre. Así, por ejemplo, en el código (usando sintaxis C)

typedef struct { 
      int data[100]; 
      int count; 
      } Stack; 

    typedef struct { 
      int data[100]; 
      int count; 
      } Set; 

    Stack x, y; 
    Set r, s; 

si nombre equivalencia se utiliza en el lenguaje de entonces x y y sería del mismo tipo y r y s sería de la misma tipo, pero el tipo de x o y no sería equivalente al tipo de r o s. Esto significa que las declaraciones tales como

x = y; 
    r = s; 

sería válido, pero declaraciones como

x = r; 

no sería válido (es decir, no sería aceptada por un traductor).

Usando equivalencia estructural:, dos tipos son iguales si, y sólo si, tienen la misma "estructura", que puede interpretarse de diferentes maneras.
Una interpretación estricta sería que los nombres y tipos de cada componente de los dos tipos deben ser los mismos y deben enumerarse en el mismo orden en la definición de tipo.
Un requisito menos estricto sería que los tipos de componentes deben ser los mismos y en el mismo orden en los dos tipos, pero los nombres de los componentes podrían ser diferentes.

Una vez más mirando el ejemplo anterior, utilizando equivalencia estructural los dos tipos Stack y Set se consideraría equivalente, lo que significa que un traductor aceptaría declaraciones como

x = r; 

(Tenga en cuenta que C doesn' t admite equivalencia estructural y dará error para la asignación anterior.)

+0

Información muy útil, pero el enlace está roto, ¿puede por favor corregirlo? Gracias. – LearningMath

+0

Lo sentimos, ese enlace ya no es válido. – JerryGoyal

Cuestiones relacionadas