Nennsystem - Nominal type system

In der Informatik ist ein Typsystem ein nominales oder nominatives Typensystem (oder ein namenbasiertes Typsystem ), wenn die Kompatibilität und Äquivalenz von Datentypen durch explizite Deklarationen und / oder den Namen der Typen bestimmt wird. Nominalsysteme werden verwendet, um zu bestimmen, ob Typen äquivalent sind und ob ein Typ ein Subtyp eines anderen ist. Nominaltypsysteme stehen im Gegensatz zu Struktursystemen , bei denen Vergleiche auf der Struktur der betreffenden Typen basieren und keine expliziten Deklarationen erfordern.

Nominale Eingabe

Nominale Typisierung bedeutet, dass zwei Variablen genau dann typkompatibel sind, wenn ihre Deklarationen denselben Typ benennen. In C werden beispielsweise zwei struct Typen mit unterschiedlichen Namen in derselben Übersetzungseinheit niemals als kompatibel angesehen, selbst wenn sie identische Felddeklarationen haben.

C erlaubt jedoch auch eine typedef Deklaration, die einen Alias ​​für einen vorhandenen Typ einführt. Diese sind lediglich syntaktisch und unterscheiden den Typ zum Zwecke der Typprüfung nicht von seinem Alias. Diese in vielen Sprachen vorhandene Funktion kann zu einem Verlust der Typensicherheit führen, wenn (zum Beispiel) derselbe primitive Ganzzahltyp auf zwei semantisch unterschiedliche Arten verwendet wird. Haskell stellt den syntaktischen Alias ​​im C-Stil in Form der type Deklaration sowie die newtype Deklaration bereit, die einen neuen, eindeutigen Typ einführt, der isomorph zu einem vorhandenen Typ ist.

Nominale Untertypisierung

In ähnlicher Weise bedeutet nominelle Untertypisierung, dass ein Typ genau dann ein Untertyp eines anderen ist, wenn dies in seiner Definition ausdrücklich als solche deklariert wird. Nominell typisierte Sprachen erzwingen normalerweise die Anforderung, dass deklarierte Subtypen strukturell kompatibel sein müssen (obwohl Eiffel die Deklaration nicht kompatibler Subtypen zulässt). Subtypen, die "aus Versehen" strukturell kompatibel sind, aber nicht als Subtypen deklariert sind, gelten jedoch nicht als Subtypen.

C ++ , C # , Java , Objective-C , Delphi , Swift , Julia und Rust verwenden hauptsächlich sowohl die nominale Typisierung als auch die nominale Subtypisierung.

In einigen nominell subtypisierten Sprachen wie Java und C # können Klassen als endgültig deklariert (oder in der C # -Terminologie versiegelt ) werden, was darauf hinweist, dass keine weitere Subtypisierung zulässig ist.

Vergleich

Die nominelle Typisierung ist nützlich, um eine versehentliche Typäquivalenz zu verhindern, was eine bessere Typensicherheit als die strukturelle Typisierung ermöglicht. Die Kosten sind eine verringerte Flexibilität, da beispielsweise bei der nominalen Typisierung keine neuen Supertypen ohne Änderung der vorhandenen Untertypen erstellt werden können.

Siehe auch

Verweise

Quellen

Externe Links