WikiDer > Typensystem

Typesysteem

In dem Informatik definiert a Typsystem wie a Programmiersprache gruppiert Daten in verschiedene Datentypen, und wie diese Typen verwendet und kombiniert werden können.

EIN Art gibt eine Sammlung von Werten an, die bestimmte Ähnlichkeiten aufweisen. Jedem Typ ist eine Sammlung von Operationen zugeordnet, die auf Werte dieses Typs angewendet werden können. Einer der Hauptunterschiede zwischen a hohes LevelProgrammiersprache und a niedriges NiveauProgrammiersprache ist das a niedriges Niveau-Sprache hat kein Typsystem: eine solche Sprache kennt nur Bytes und Wörter.[1]

Funktionen

Das Typisierungssystem einer Programmiersprache hat folgende Funktionen:

  • Sicherheit - Auf der Grundlage von Typen, a Compiler (oder Dolmetscher) bestimmte Fehler (sog. Tippfehler) und benachrichtigen Sie den Programmierer. Inwieweit der Compiler Fehler aufgrund von Typisierung erkennen kann, hängt vom Typsystem ab: starke Typisierung bietet mehr Sicherheit als schwache Typisierung.
  • Optimierung - Wenn die Ausdruckstypen zum Zeitpunkt der Kompilierung bereits bekannt sind (statisches Tippen) kann der Compiler oft bestimmte Optimierungen anwenden.
  • Dokumentation - Wenn die verwendeten Arten Variablen und Funktionsparameter in einem Programm angegeben werden, geben sie dem Quellcodeleser Hinweise über die Art und Verwendung dieser Variablen und Parameter.

Typprüfung

Wenn ein Compiler oder Interpreter ein Programm kompiliert oder ausführt, überprüft er, ob jede Operation richtig eingeben ist. Das wird sein Typprüfung erwähnt. Wenn der Compiler oder Interpreter auf eine Operation stößt, die nicht richtig eingeben ist wie das Multiplizieren von a Schnur jetzt sofort boolesch, die Ausführung wird abgebrochen und eine Fehlermeldung ausgegeben.

Statische Eingabe

Als Programmiersprache statisch typisiert die Typüberprüfung erfolgt zur Kompilierzeit (Kompilierzeit) und nicht beim Laufen (Laufzeit) des Programms. Findet der Compiler einen Fehler, wird die Kompilierung abgebrochen und der Programmierer über das Problem informiert. Beispiele für Sprachen, die statisch typisiert sind, sind C, Java, Reichweite und Haskell.

Statisches Tippen hat einige Vorteile:

  • Da alle Typprüfungen bereits beim Kompilieren durchgeführt werden, ist ein kompiliertes Programm immer typkorrekt. Während der Ausführung des Programms müssen keine Typprüfungen mehr durchgeführt werden. Obwohl das Kompilieren etwas länger dauert, ist das resultierende Programm schneller (und kleiner).
  • Bei der statischen Typisierung werden Typfehler bereits während der Entwicklung des Programms vom Compiler erkannt. Statisches Tippen bietet somit eine Art Basisautomatik Programmüberprüfung.
  • Der Compiler hat mehr Optionen für Optimierung.

Abgeleitete Typisierung

sehen Typinferenz für den Hauptartikel zu diesem Thema.

Nicht alle statisch typisierten Sprachen verlangen vom Programmierer, den Typ aller Variablen und Parameter explizit anzugeben. Für Sprachen, bei denen dies nicht der Fall ist (wie Haskell und OCaml) bestimmt der Compiler selbst die Typen von Variablen und Parametern (allgemein: aller Ausdrücke). Das wird sein Typ-Inferenz erwähnt.

Dynamisches Tippen

Werde Programmiersprache dynamisch typisiert benannt als Typprüfung tritt während der Programmausführung auf und nicht während der Programmkompilierung. Haben Sie in einer dynamisch typisierten Sprache Werte ein fester Typ, Variablen und Ausdrücke jedoch nicht.

Im Gegensatz zur statischen Typisierung gibt die dynamische Typisierung dem Programmierer mehr Freiheit. Dadurch können Programme schneller und (oft) kürzer geschrieben werden. Beispiele für dynamisch typisierte Sprachen sind: perl, PHP, Python und lispeln. Es können jedoch Fehler während der eigentlichen Ausführung des Programms auftreten.

Kombination

Einige statisch typisierte Sprachen bieten die Möglichkeit, dynamische Typisierung durch einen Mechanismus zu verwenden, der Gießen wird genannt. Beim Casting wird ein Ausdruck zur Laufzeit in einen anderen Typ konvertiert. In diesem Fall findet beim Übersetzen keine Typprüfung statt. Das Casting kann jedoch während der Ausführung zu unerwarteten Fehlern führen, daher ist es unsicher genannt (unsicher). Die meisten statisch typisierten Sprachen bieten eine Form des Castings.

Es gibt auch Programmiersprachen, die die Möglichkeit bieten, die statische Typisierung für Teile des Programms zu „deaktivieren“. Beispiele sind ada und haXe.[2]

Starkes Tippen

Es herrscht wenig Konsens darüber, welche Kriterien eine Programmiersprache erfüllen muss, um als stark angesehen zu werden. Es gibt Sprachen, die je nach den vom Autor verwendeten Kriterien mal als stark typisiert und mal als schwach typisiert gekennzeichnet werden.

Im Allgemeinen hat eine stark typisierte Programmiersprache einige strenge Regeln dafür, wie verschiedene Datentypen verwendet und welche Typen kombiniert werden dürfen. Obwohl fast jede Programmiersprache die Möglichkeit bietet, von einem Typ in einen anderen zu konvertieren, sind diese Möglichkeiten in einer stark typisierten Sprache meist (sehr) eingeschränkt. Ein Beispiel für eine Konvertierung, die auch in den am stärksten typisierten Sprachen erlaubt ist, ist von Ganzzahlen in Gleitkommazahlen. Das bedeutet, dass in arithmetischen Ausdrücken ganze Zahlen (Ganzzahlen) und Gleitkommazahlen gemischt werden dürfen.

Beispiele für stark typisierte Sprachen sind Java, Pascal, Reichweite und Haskell.

Aber ist eine Sprache wie C jetzt stark typisiert, nicht wahr? Die Meinungen hierzu gehen auseinander. Manchmal wird das folgende Kriterium verwendet: Eine Sprache ist stark typisiert, wenn jede Variable und jeder Parameter einen zugeordneten Typ hat und dieser Typ während der Zeit bekannt ist Kompilierzeit.[3] In diesem Fall ist C stark typisiert, obwohl man sagen könnte, dass Java und Pascal stärker typisiert sind als C, da C mehr implizite Konvertierungen zulässt als die anderen beiden.

Eine andere (strengere) Definition lautet: Eine Sprache ist stark typisiert, wenn immer Tippfehler entdeckt werden. Dazu ist es erforderlich, dass die Typen aller verwendeten Variablen und Parameter beim Übersetzen oder während der Programmausführung ermittelt werden können. In diesem Fall ist C nicht stark typisiert: die Typen von Unions werden in C nicht überprüft.[3]

Manchmal wird starkes Tippen auch mit statischem Tippen gleichgesetzt. In diesem Fall ist C stark typisiert.

Schwaches Tippen

Eine Sprache, die nicht stark typisiert ist, ist schwach typisiert. Bei schwacher Typisierung gilt das gleiche Problem wie bei starker Typisierung: Der Begriff wird nicht eindeutig verwendet, und einige Sprachen, die von einem Autor als schwach typisiert gekennzeichnet werden, werden vom anderen Autor als stark typisiert gekennzeichnet.

Im Gegensatz zu Sprachen mit starker Typisierung legen Sprachen mit schwacher Typisierung dem Programmierer wenige Regeln auf, wenn es darum geht, wie Typen verwendet und kombiniert werden. Normalerweise bedeutet dies, dass der Compiler (oder Interpreter) bei Bedarf für die korrekte Konvertierung von einem Typ in einen anderen sorgt (implizite Konvertierung).

Ein Vorteil der schwachen Typisierung besteht darin, dass der Compiler oder Interpreter die Typisierungskonvertierung übernimmt, sodass der Programmierer dies nicht tun muss. Ein Nachteil der schwachen Typisierung besteht darin, dass der Compiler oder Interpreter mögliche Fehler in einem Programm weniger erkennen kann.

Schwach vs. stark und statisch vs. dynamisch

Obwohl dies von der verwendeten Definition der starken Typisierung abhängt (wenn starke Typisierung nicht mit statischer Typisierung gleichgesetzt wird), sind die beiden Kategorien unabhängig voneinander. Ob eine Sprache statisch oder dynamisch typisiert ist, hängt ab von wann Art der Prüfung stattfindet. Ob eine Sprache stark oder schwach typisiert ist, hängt ab von die Rate in denen die Typprüfung stattfindet: Je mehr Typprüfungen durchgeführt werden (wie strenger eine Sprache), desto stärker ist sie typisiert.

Sicher und unsicheres Tippen (sicheres und unsicheres Tippen)

Eine Sprache ist typsicher wenn Operationen und Typkonvertierungen, die zu einem unsicheren Zustand führen, nicht erlaubt sind. Nehmen wir das folgende C-Fragment als Beispiel:

int x = 4;char y[] = "37";char *z = x y;

Die Variable z zeigt nun auf eine Adresse, deren Inhalt undefiniert ist. Angenommen, der Compiler schlägt vor j[] einen Speicherplatz von 3 Byte reserviert hat, ab Adresse 100 sieht der Speicher so aus:

VariablePunkte zu adressierenInhalt
ja100'3'
101'7'
102' '
103??
z104??

Was ist an der Adresse wo z zeigt, ist nicht vorhersehbar. Vielleicht zufällige Daten oder das Ergebnis einer vorherigen Berechnung. Wenn das Programm weiter unten den Inhalt der Adresse, wo z Wenn Sie darauf zeigen, dass es überprüft wird, stürzt es wahrscheinlich ab oder gibt ein zufälliges Ergebnis zurück. Das obige C-Programm ist richtig eingegeben, aber nicht sicher. Wir nennen eine Sprache, in der dies möglich ist unsicher getippt.

Eine Sprache, die Berechnungen macht mit Zeiger macht möglich ist nie Typ sicher. Viele Sprachen verwenden daher keine Zeiger, aber Verweise (z. B. Java und Perl). Der einzige Weg, um einen zu bekommen Referenz kann erstellt werden, indem die Adresse bereits vorhandener (und somit initialisierter) Daten übernommen wird: a Referenz kann dann nur auf vorhandene, gültige Daten verweisen.

Ente tippen

sehen Ente tippen für den Hauptartikel zu diesem Thema.

Wenn du in einem bist objektorientierten Programmiersprache eine Methode eines Objekts aufruft, überprüft der Compiler (oder Interpreter) den Typ dieses Objekts. Der Typ eines Objekts ist die Klasse, von der das Objekt eine Instanz ist. Dann prüft der Compiler, ob die Klasse, zu der das Objekt gehört, tatsächlich die aufgerufene Methode besitzt. Wenn nicht, wird ein Fehler generiert.

Beispiel: Angenommen, wir haben ein Objekt mit der folgenden Deklaration erstellt: myObject = neues Objekt(). Wenn der Compiler nun auf die folgende Anweisung stößt: myObject.start(), der Compiler weiß das myObject vom Typ Objekt ist. Dann prüft der Compiler, ob die Klasse Objekt in der Tat eine Methode Start() hast. Ist dies nicht der Fall, wird ein Fehler generiert. Die Art und Weise, wie Sie ein Objekt verwenden dürfen hängt daher von der Art dieses Objekts ab.

Das ist jedoch nicht notwendig. Wenn die auf einem Objekt erlaubten Operationen nur vom Objekt selbst abhängen, sprechen wir von spreken Ente tippen. Beim Duck-Typing schaut der Compiler auf das Objekt selbst und nicht die Klasse (Typ), zu der es gehört.

Im obigen Beispiel prüft ein Compiler einer Duck-Typing-Sprache nicht, ob die Klasse Objekt eine Methode Start() hat, aber nur, ob das Objekt myObject eine Methode Start() hast. In einer Sprache, die es erlaubt, neue Eigenschaften und Methoden für Objekte zu definieren (Methoden und Eigenschaften, die die Klasse, deren Instanz das Objekt ist, nicht hat), macht dies einen wesentlichen Unterschied.

Beispiele für Duck-Typing-Programmiersprachen sind Javascript, Python und Rubin.

Siehe auch