Datentyp

Zusammenfassung von Objektmengen mit den darauf definierten Operationen
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 13. November 2006 um 09:47 Uhr durch 84.142.245.185 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Formal bezeichnet ein Datentyp in der Informatik die Zusammenfassung von Objektmengen mit den darauf definierten Operationen. Dabei werden durch den Datentyp unter Verwendung einer so genannten Signatur ausschließlich die Namen dieser Objekt- und Operationsmengen spezifiziert. Ein so spezifierter Datentyp besitzt noch keine Semantik. n und Operationen Namen für Operationen auf diesen Mengen repräsentieren. Ein Beispiel soll dies für eine vereinfachte Version des bekannten und weiter unten genauer beschriebenen (konkreten) Datentyp Integer zeigen, der hier Simple Integer heiße:

Simple Integer
 Sorten        int
 Operationen   empty:                -> int
               +    : int x int      -> int
               -    : int x int      -> int
End Simple Integer

Dies ist eine Signatur für einen angenommenen Datentyp Simple Integer, auf dem nur zwei Operationen + und - (neben der "Erzeuger-Operation") erlaubt sind. Die einzige Sorte nennen wir int. Die Operation empty dient zur Erzeugung eines int-Elementes. Die Operationen + und - sind jeweils zweistellig und liefern jeweils wiederum ein Element der Sorte int. Wichtig ist, dass es sich hier um eine rein syntaktische Spezifikation handelt. Was ein int ist, wird nirgendwo definiert. Hierzu müsste noch eine Zuordnung des Sortennamens zu einer Menge erfolgen. Eine sinnvolle Zuordnung wäre in diesem Fall etwa die Menge der natürlichen Zahlen. Auch über die Arbeitsweise der Operationen ist nichts weiter ausgesagt als ihre Stelligkeit und ihr Ergebnis. Ob das +-Symbol der Arbeitsweise der Summenoperation entspricht, wird hier nicht festgelegt - dies wäre auch völlig unmöglich, da nichteinmal bekannt ist, ob die Operation auf den natürlichen Zahlen arbeitet. Derartige Zuordnungen fallen in den Bereich der Semantik. Eine um die Semantik erweiterte Spezifikation könnte daher folgendermaßen aussehen:

Simple Integer
 /* reine Syntax */
 Sorten        int
 Operationen   empty:                -> int
               +    : int x int      -> int
               -    : int x int      -> int
 /* Zuordnung einer Semantik */
 Mengen        int = IN
 Funktionen    empty = {}
               +    : int x int entspreche der Summe zweier Zahlen aus IN
               -    : int x int entspreche der arithmetischen Differenz zweier Zahlen aus IN
End Simple Integer

Damit wird allerdings der Bereich einer Signatur bereits überschritten. Diese Spezifikation würde man vielmehr als Algebra bezeichnen. Die Spezifikation kommt auf diese Weise jedoch dem programmiersprachlichen Verständnis des Begriffes Datentyp näher, dem sich ein Großteil des restlichen Artikels widmet.

Datentypen in Programmiersprachen

Viele Programmiersprachen bieten eine eigene Menge an vordefinierten Datentypen, bei denen das Prinzip des jeweiligen Wertebereichs, wie beispielsweise Ganze Zahlen, Fließkommazahlen oder Zeichenketten, gleich ist. Die tatsächlichen Namen dieser Datentypen und die genauen Definitionen der Wertebereiche und der dazugehörigen Operationen unterscheidet sich jedoch zum Teil stark, da jene von der verwendeten Programmiersprache, der verwendeten Rechnerplattform und anderen compilerabhängigen Faktoren abhängen.

Datentypen werden in der Programmierung verwendet, um Speicherbereichen eine konkrete Semantik zuzuweisen. Diese Speicherbereiche werden Variablen oder Konstanten genannt. Die Datentypen ermöglichen es einem Compiler oder Laufzeitumgebung, die Typverträglichkeit der vom Programmierer angegebenen Operationen zu überprüfen. Unzulässige Operationen werden zum Teil bereits beim Compilieren erkannt, so dass beispielsweise die Division einer Zeichenkette ‚HANS’ durch die Zahl ‚5’, was nicht sinnvoll und in üblichen Programmiersprachen undefiniert ist, verhindert wird.

Man unterscheidet elementare, zusammengesetzte und abstrakte Datentypen.

Elementare Datentypen

Elementare (einfache) Datentypen können nur ein Datum des entsprechenden Wertebereichs aufnehmen. Sie besitzen eine festgelegte Anzahl von Werten (Diskretheit) sowie eine fest definierte Ober- und Untergrenze (Endlichkeit). Es wird dabei zwischen ordinalen und nichtordinalen Datentypen unterschieden.

Ordinale Datentypen

Ordinale Datentypen sind dadurch gekennzeichnet, dass ihrem Wert eine eindeutige Ordnungsnummer zugeordnet ist, das heißt jeder außer dem ersten Wert besitzt genau einen direkten Vorgänger und jeder außer dem letzten Wert besitzt genau einen direkten Nachfolger (geordnete Menge). Ordinale Datentypen sind abzählbar und u.a.:

Nichtordinale Datentypen

Nichtordinale Datentypen sind dadurch gekennzeichnet, dass ihre Werte keine eindeutigen Vorgänger bzw. Nachfolger besitzen. Nichtordinale Datentypen sind u.a.:

Zeigertypen / Dynamische Datentypen

Eine Besonderheit sind Zeiger, dessen wirklicher Wertebereich in der Regel anonym bleibt, da es 'nur' eine Referenz auf einen anderen beliebigen Datentyp ist. Je nach referenziertem Typ werden Zeiger auf bestimmte Elemente gesondert benannt, wie beispielsweise Zeiger auf Dateien, Drucker oder Pipes.

  • Zeiger
    • Bezeichnung: ACCESS, POINTER oder auch nur kurz Stern (*)
    • Wertebereich: Adresse des Basistyps (Meist anonym)
    • Operationen: Referenz, Dereferenz, in einigen Sprachen: +, -, *, /
  • konstanter Nullzeiger
    • Bezeichnung: NULL, VOID oder NIL
    • Wertebereich: ohne
    • Operationen: = (Gleichheit)
    • Bedeutung: Dieser Zeiger repräsentiert die Undefiniertheit bzw. die Abwesenheit aller anderen Typen

Zusammengesetzte Datentypen

Zusammengesetzte Datentypen sind ein Datenkonstrukt, welches aus einfacheren Datentypen besteht. Da sie theoretisch beliebig komplex werden können, werden sie auch häufig schon zu den Datenstrukturen gezählt. Den meisten Programmiersprachen gemeinsam sind:

  • Reihung, Tabelle; Feld (mehrdeutig!)
    • Bezeichnung: ARRAY of ...
    • Wertebereich: Abbildung einer endlichen Menge (Indexmenge) auf den Wertebereich eines Basistyps (Elementtyp). Die Indexmenge muss dabei ordinal sein. Durch Anwenden mehrerer Indizes entsteht eine mehrdimensionale Reihung.
    • Operationen: <, >, =, Zuweisung
    • Beispiel: type 3D-Vektor is ARRAY(1..3) of INTEGER;
  • Zeichenkette (Im Grunde sind Zeichenketten selbst nur eine Reihung des Typs Character (Zeichen). Da sie jedoch in vielen Programmiersprachen vordefiniert sind, werden sie hier gesondert aufgelistet.)
  • Verbund
    • Bezeichnung: RECORD oder STRUCT
    • Wertebereich: Ein Verbund enthält eine Folge verschiedener Komponenten, welche verschiedene Datentypen haben können. Als Komponententyp ist jeder Typ zulässig.
    • Operationen: Zuweisung, Gleichheit (stark programmiersprachenabhängig!)
    • Beispiel: type Prüfung is RECORD (Fach: STRING, Schueler: STRING, Punkte: INTEGER, Lehrer: STRING, Termin: DATUM)
    • In vielen Programmiersprachen existieren Möglichkeiten, den Speicherbereich eines Verbunds mehrfach unterschiedlich zu interpretieren. Das wird Variantenrecord oder UNION genannt. Dabei ist jedoch meist keine Typsicherheit mehr gegeben.

Abstrakte Datentypen

Als Abstrakte Datentypen bezeichnet man in der Informatik spezielle Datentypen, deren Operationen genau spezifiziert sind, die jedoch im Gegensatz zu den elementaren und zusammengesetzten Datentypen nicht an einen konkreten Wertebereich gebunden sind. Die Bindung an den Wertebereich findet erst durch die konkrete Ausprägung des abstrakten Datentypen statt.

Auch bei den abstrakten Datentypen ist die Abgrenzung zu den Datenstrukturen schwierig, da die Datentypen je nachdem, ob der Schwerpunkt der Betrachtung auf den Daten oder auf den darauf definierten Operationen liegt, Datenstruktur oder Abstrakter Datentyp genannt werden.

Einige Programmiersprachen, wie Ada oder Modula-2 unterstützen gezielt die Erstellung von abstrakten Datentypen.

Siehe auch

Wertemenge