2010-12-20 17 views
7

Ich kann nicht scheinen, genau zu begreifen, was Namensäquivalenz ist. Ich bin mir aber ziemlich sicher, dass ich strukturelle Probleme habe. Ein Beispiel mein Professor gab, war dies:strukturelle Äquivalenz vs Name Äquivalenz

Type TI=integer 
Type TTI=TI 

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

a und b sind sowohl strukturelle als auch Name gleichwertig, während f und g sind nur strukturelle equivalent.I verstehen nicht, warum a und b würde Name gleichwertig, aber f und g sind nicht.

Antwort

2

a und b sind aus diesem Grund sind sie gleichbedeutend. f und g sind nicht so, sie sind nicht gleichbedeutend.

3

Der Begriff der Namensäquivalenz macht am meisten Sinn, wenn Sie die internen Datenstrukturen betrachten, die ein Compiler zur Darstellung von Typen verwenden könnte. Angenommen, die Typen werden als Zeiger auf Datenstrukturen dargestellt. Außerdem nehme ich an, dass ich die Typäquivalenzprüfung als einen einfachen Zeigervergleich (z. B. Namensäquivalenz) implementiere. Primitive Typen wie integer und float würden in einer globalen Umgebung gespeichert werden, da es nur eine begrenzte Anzahl von ihnen gibt. Außerdem, wenn ich integer mit integer vergleiche, sind sie garantiert äquivalent, da sie aufgrund dieser globalen Umgebung auf die gleiche Struktur verweisen.

Da jedoch ref ist kein Typkonstruktor, nicht ein Atomtyp, ich es unendlich viele Arten erstellen können (z.B. ref float, ref ref float, etc). Daher können wir sie nicht alle in einer globalen Umgebung speichern. Eine einfache Strategie, die der Compiler für die Verwaltung dieser Typen übernehmen kann, ist die Zuweisung einer neuen Struktur, wenn wir auf einen Typenkonstruktor stoßen. Wir ordnen ihm eine neue Datenstruktur zu. Die Instanz von ref float würde also zu einer neuen Datenstruktur führen, und die andere Instanz von ref float würde zu einer völlig neuen, anderen Datenstruktur führen. Der Zeigervergleich schlägt fehl und daher sind sie nicht gleichbedeutend.

Es gibt noch ein Stück zu dem Puzzle, was die Semantik Ihres Zuweisungsoperators ist. Dieser Typ-Alias ​​ist eine einfache Zeigerkopie im Compiler. Wenn ich also A=B schreibe, entspricht A immer dem Namen B. Aber, um es noch einmal zu wiederholen: F A entspricht nicht dem Namen einer anderen Instanz von F A!

3

Betrachten Sie die beiden folgenden Definitionen.

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

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

x : student; 
y : school; 

In dem obigen Beispiel werden Variablen x und y verschiedene Arten unter dem Namen Äquivalenz haben angesehen werden: x verwendet den in Zeilen deklarierten Typen 1; y verwendet den in Zeile 4 deklarierten Typ. Die Namensäquivalenz basiert auf der Annahme, dass, wenn der Programmierer sich bemüht, zwei Typdefinitionen zu schreiben, diese Definitionen wahrscheinlich unterschiedliche Typen darstellen sollen. (Ich bin nicht sicher über das Beispiel, das Sie angegeben haben)

Referenz: Programmiersprachen Pragmatics, von M.L. Scott

1

In einer Namenstypäquivalenz haben zwei Variablen den gleichen Typ, wenn sie in derselben Deklaration oder in Deklarationen definiert sind, die denselben Typnamen verwenden. Daher sind die Variablen 'f' und 'g' in Ihrem Beispiel Äquivalente. Die Variablen 'a' und 'b' sind jedoch keine Äquivalente, da sie unterschiedliche Typnamen haben. Darüber hinaus sind unter Strukturtyp-Äquivalenz zwei Variablen vom gleichen Typ, wenn sie identische Strukturen haben.Somit sind die Variablen 'a' und 'b' Äquivalente und auch die Variablen 'f' und 'g' sind Äquivalente, weil offensichtlich Typen mit dem gleichen Namen die gleiche Struktur haben.

Referenz: Sebesta, Konzepte der Programmiersprachen, 10. Ausgabe.

19

Typ Gleichheit

Die Bedeutung von Grundoperationen wie Zuweisung (= in durch C bezeichnet) in einer Sprachdefinition spezifiziert. So zum Beispiel die Bedeutung von Aussagen wie

x = y; 

hier den Wert des Objekts y wird für variable x in den Speicherplätzen kopiert.

Bevor jedoch eine Operation wie eine Zuweisung vom Übersetzer akzeptiert werden kann, müssen die Typen der beiden Operanden normalerweise identisch sein (oder möglicherweise auf eine andere spezifizierte Weise kompatibel sein).

So muss ein Sprachübersetzer entscheiden, ob zwei Typen in einigen Fällen gleich sind. Wir betrachten nun, was es bedeutet zu sagen, dass zwei Arten "gleich" (oder gleichwertig) sind.

Es gibt zwei Standardmethoden, um zu bestimmen, ob zwei Arten betrachtet werden, um das gleiche: Name Äquivalenz und strukturelle Äquivalenz.

Name Äquivalenz ist die einfachste: zwei Arten sind gleich, wenn und nur wenn sie den gleichen Namen haben. So wird beispielsweise in dem Code (unter Verwendung von C-Syntax)

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

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

    Stack x, y; 
    Set r, s; 

wenn Name Äquivalenz in der Sprache verwendet wird, dann x und y würden von der gleichen Art sein und r und s wäre die gleichen Typ, aber der Typ x oder y wäre nicht gleich dem Typ r oder s. Dies bedeutet, dass Aussagen wie

x = y; 
    r = s; 

gültig sein würde, aber Aussagen wie

x = r; 

nicht gültig sein (das heißt, nicht von einem Übersetzer akzeptiert).

Mit strukturelle Äquivalenz: sind zwei Arten gleich, wenn, und nur dann, wenn sie die gleiche „Struktur“, die auf unterschiedliche Weise interpretiert werden können.
Eine strenge Interpretation wäre, dass die Namen und Typen jeder Komponente der beiden Typen identisch sein müssen und in der Typdefinition in derselben Reihenfolge aufgeführt sein müssen.
Eine weniger strenge Anforderung wäre, dass die Komponententypen in beiden Typen gleich und in der gleichen Reihenfolge sein müssen, aber die Namen der Komponenten könnten unterschiedlich sein.

Wieder am Beispiel oben suchen, strukturelle Äquivalenz die beiden Typen Stack und Set gleichwertig angesehen werden würden verwenden, was bedeutet, dass ein Übersetzer Aussagen wie

x = r; 

(Beachten Sie, dass C doesn akzeptieren würde‘ t unterstützen strukturelle Äquivalenz und geben Fehler für obige Zuordnung.)

+0

Sehr nützliche Informationen, aber der Link ist kaputt, können Sie es bitte beheben? Vielen Dank. – LearningMath

+0

Entschuldigung, dieser Link ist nicht mehr gültig. – JerryGoyal

Verwandte Themen