Datentyp

Formal bezeichnet ein Datentyp (vom englischen data type) oder eine Datenart in der Informatik die Zusammenfassung von Objektmengen mit den darauf definierten Operationen. Dabei werden durch den Datentyp des Datensatzes unter Verwendung einer sogenannten Signatur ausschließlich die Namen dieser Objekt- und Operationsmengen spezifiziert. Ein so spezifizierter Datentyp besitzt noch keine Semantik.

Die weitaus häufiger verwendete, aber speziellere Bedeutung des Begriffs Datentyp stammt aus dem Umfeld der Programmiersprachen und bezeichnet die Zusammenfassung konkreter Wertebereiche und darauf definierter Operationen zu einer Einheit. Beispiele können Ganz- oder Kommazahlen, Zeichenketten oder auch komplexere Typen wie Datum/Zeit oder Objekte sein. Zur Unterscheidung wird für diese Datentypen in der Literatur auch der Begriff Konkreter Datentyp verwendet. Für eine Diskussion, wie Programmiersprachen mit Datentypen umgehen.

Der gedankliche Übergang von der formalen Definition zu der im Umfeld von Programmiersprachen verwendeten Definition konkreter Datentypen geschieht dabei über die sukzessive Einführung einer Semantik zu den formal spezifizierten Namen der Objekt- und Operationsmengen. Die Konkretisierung der Operationsmenge führt zuAbstrakten Datentypen beziehungsweise Algebraischen Strukturen. Mit der weiteren Konkretisierung der Objektmenge ergibt sich der Konkrete Datentyp.

Formale Definition eines Datentyps durch eine Signatur

Eine Signatur ist ein Paar (Sorten, Operationen), wobei Sorten Namen für Objektmengen 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   zero:   -> 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 zero 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 nicht einmal 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   zero:   -> int
+ : int x int -> int
: int x int -> int
/* Zuordnung einer Semantik */
Mengen int = IN
Funktionen zero = 0
+ : 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, Gleitkommazahlen oder Zeichenketten, gleich ist. Die tatsächlichen Namen dieser Datentypen und die genauen Definitionen der Wertebereiche und der dazugehörigen Operationen unterscheiden sich jedoch zum Teil stark, da jene von der verwendeten Programmiersprache, der verwendeten Plattform 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 Kompilieren 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 und zusammengesetzte Datentypen. Ein weiterer Ordnungsbegriff ist Ordinaler Datentyp.

Ordinale Datentypen

Ordinale Datentypen sind dadurch gekennzeichnet, dass auf ihnen eine feste Ordnungsrelation definiert ist, die ihren Werten eine eindeutige Ordnungsnummer zuordnet. Dadurch ist die Reihenfolge der Werte festgelegt. Als Folge hat

Ob ein elementarer Datentyp auch ein ordinaler Datentyp ist, hängt von der Festlegung in der konkreten Programmiersprache ab. Beispiele:

Elementare Datentypen

Elementare Datentypen, auch einfache Datentypen oder primitive Datentypen genannt, können nur einen Wert des entsprechenden Wertebereichs aufnehmen. Sie besitzen eine festgelegte Anzahl von Werten (Diskretheit) sowie eine fest definierte Ober- und Untergrenze (Endlichkeit). Daher können reelle Zahlen als Gleitkommazahlen nur mit einer bestimmten Genauigkeit abgebildet werden. Für elementare Datentypen sind in einer Programmiersprache Grundoperationen definiert, bei den Zahlen sind das die Grundrechenarten. Datentypen haben je nach Programmiersprache und Wertebereich unterschiedliche Bezeichnungen und werden groß oder klein geschrieben (hier zur Übersicht alle groß).

Ganze Zahlen

Natürliche Zahlen

Festkommazahlen (Dezimalzahlen)

Aufzählungstypen

Boolean (logische Werte)

Zeichen (einzelnes Zeichen)

Gleitkommazahlen

Genauigkeit von Gleitkommazahl-Typen
  Bitanzahl
n
Wertebereich
von … bis
signifikante
Stellen
HALF 16 3,1·10−5 6,6·104 4
SINGLE, REAL 32 1,5·10−45 3,4·1038 7–8
REAL 48 2,9·10−39 1,7·1038 11–12
DOUBLE, REAL 64 5,0·10−324 1,7·10308 15–16
REAL 64 1,1·10−306 1,8·10308 15–16
EXTENDED 80 1,9·10−4951 1,1·104932 19–20

Bitmengen

Bitmengen stellen eine Menge von mehreren Bits dar. In einigen Programmiersprachen gibt es zur Wahrung der Typsicherheit einen eigenen Datentyp und eigene Operatoren (zum Beispiel für die Vereinigungsmenge oder die Schnittmenge) für Bitmengen.

Bitmengen sind nicht mit Aufzählungstypen oder Datenfeldern zu verwechseln, da mehrere Elemente des Datentyps (respektive der Menge) gleichzeitig angesprochen werden können. In vielen Programmiersprachen werden ganzzahlige Datentypen für die Repräsentation von Bitmengen benutzt, so dass Zahlen und Bitmengen zuweisungskompatibel sind, obwohl arithmetische Operatoren bei Bitmengen und Mengenoperatoren im Zusammenhang mit ganzen Zahlen keinen Sinn ergeben.

Zeigertypen / Dynamische Datentypen

Eine Besonderheit sind Zeiger, deren wirklicher Wertebereich in vielen Programmiersprachen anonym bleibt, da sie „nur“ Referenzen auf beliebige andere Datentypen sind. Je nach referenziertem Typ werden Zeiger auf bestimmte Elemente gesondert benannt, wie beispielsweise Zeiger auf Dateien, Drucker oder Pipes.

Objektorientierte Programmiersprachen speichern den vom Zeiger referenzierten Datentyp (zum Beispiel bei Instanzvariablen) zusammen mit der Adresse, auf die der Zeiger verweist, damit die Zuweisungskompatibilität nicht nur für den Datentyp der Adressierung, sondern auch für den referenzierten Inhalt geprüft werden kann. Dies ist dann sogar zur Laufzeit möglich und für einige Anwendungen (beispielsweise bei Polymorphie) auch notwendig.

Zeiger

Konstanter Nullzeiger

Prozedurtypen

Einige Programmiersprachen, wie zum Beispiel Oberon, verwenden Prozedurtypen, die für Zeigervariablen verwendet werden, die auf verschiedene Prozeduren mit identischen formalen Parameterlisten zeigen können.

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:

Zusätzliche individuelle Formatangaben

Bei der Verwendung von Datentypen im Quelltext eines Programms werden oft zu einem gewählten Datentyp individuelle und zusätzliche Formatangaben implementiert. Zum Beispiel kann ein Datum (oder allgemein eine Zeitangabe) als ganzzahliger elementarer Datentyp angelegt werden, zu dem Angaben zur Form der Verarbeitung/Darstellung ergänzt werden. Das Datum ist dann z.B. in Millisekunden seit dem 1. Januar 1970 0:00 Uhr gespeichert und kann, davon ausgehend, in bestimmte andere Formen (wie 'TT.MM.JJJJ' oder 'MM.TT hh:ss') überführt werden; siehe. Alternativ könnte ein Datum natürlich auch als Verbund (z.B. aus drei Zahlen für Tag, Monat und Jahr) dargestellt werden.

Funktionen als Werte erster Ordnung

In vielen zeitgenössischen Programmiersprachen sind neben Funktionszeigern auch reguläre Funktionswerte, Funktionsliterale bzw. anonyme Funktionen verfügbar. Diese wurden in Anlehnung an den Lambda-Kalkül entwickelt und bereits 1958 (wenn auch mit fehlerhafter dynamischer Bindung) in LISP implementiert. Eine korrekte, d.h. statische Bindung wurde z.B. für Algol 68 spezifiziert. Dass Funktionen bis heute z.T. nicht als Werte begriffen werden, liegt an der erst jetzt überhaupt einsetzenden Verbreitung dieser Konzeption außerhalb der Informatik.

Universeller Datentyp

Unter einem universellen Datentyp wird der Typ der Werte in einer Programmiersprache mit Unterstützung für typenlose Variablen verstanden. Hierbei handelt es sich meist um die diskriminierte Vereinigung der Typen der auftretenden Werte (elementare, zusammengesetzte, Funktionen etc.). Der universelle Datentyp tritt charakteristischerweise in universellen Skriptsprachen auf. Als Beispiele für die Verwendung von universellen Datentypen in Sprachen anderer Gattung sei der Lambda-Kalkül, in dem Funktionen die einzigen Werte sind, und Prolog hervorgehoben, in der die Daten durch die Herbrand-Struktur gegeben sind.

Abstrakte Datentypen

Definition
Ein Abstrakter Datentyp (ADT) ist eine Sammlung von Daten in Variablen – verbunden mit der Definition aller Operationen, die auf sie zugreifen.

Da der Zugriff (lesend oder schreibend) nur über die festgelegten Operationen erfolgt, sind die Daten nach außen gekapselt. Jeder ADT enthält einen Datentyp bzw. eine Datenstruktur.

Objektorientierte Programmiersprachen unterstützen durch ihr Klassenkonzept die Erstellung von ADTs, da hier Daten und Operationen gebunden werden, und die Daten geschützt werden können. Einige modulare Programmiersprachen wie Ada oder Modula-2 unterstützen ebenfalls gezielt die Erstellung von abstrakten Datentypen.

Aus fachlicher Sicht definiert ein Abstrakter Datentyp einen definierten Wertebereich mit fachlicher Bedeutung und seinen spezifischen Ausprägungen. So ist der Datentyp 'Kundennummer' möglicherweise vom Elementartyp 'Ganze Zahlen', unterscheidet sich jedoch durch eine definierte Länge und z.B. einer Prüfziffer in der letzten Stelle. – Es bildet dadurch eine Untermenge alle ganzen Zahlen in der definierten Länge. Es können hier auch komplexe Daten mit einer Abhängigkeit zueinander als ADT vereint werden. Dies ist am Beispiel einer Darstellung von Zeiträumen gebräuchlich. Es werden ein Beginndatum und ein Endedatum (beide haben den Datentyp 'Date') über eine Integritätsbedingung verknüpft. Dadurch wird letztlich der zulässige Wertebereich des Endedatums an weitere Bedingungen geknüpft. – Letztendlich ist ein ADT ein beliebig komplexer Wertebereich, der an statische und/oder dynamische Werte und zugeordnete Regeln zur Wertbestimmung gebunden ist.

Anonyme Datentypen

Einige Programmiersprachen und die XML-Strukturdefinitionssprache XML Schema unterstützen das Konzept des anonymen Datentyps. Dabei handelt es sich um einen Datentyp, für den kein Name definiert wird.

Trenner
Basierend auf einem Artikel in: Wikipedia.de
Seitenende
Seite zurück
©  biancahoegel.de
Datum der letzten Änderung: Jena, den: 21.12. 2022