Ein Feld ist eine Sammlung gleichartiger Datentypen, so wie etwa Tupel und Vektoren in der Mathematik, wobei die Menge der in der Sammlung vorhandenen Daten in der Regel vorgegeben ist (ist sie es nicht, spricht man von dynamischen Arrays) und jedes einzelne Element der Sammlung über einen Index identifizierbar ist (ganz so, wie wir es aus der Mathematik kennen, wenn wir xi für das i-te Element im Tupel x schreiben). Wollen wir also etwa 10 natürliche Zahlen speichern, so benötigen wir ein Feld von natürlichen Zahlen der Länge 10 (der Mathematiker würde von einem 10-Tupel natürlicher Zahlen sprechen); die einzelnen Zahlen im Feld sind über ihren Index identifizierbar, wobei der Index je nach verwendeter Programmiersprache von 0 bis 9 oder von 1 bis 10 reicht. In der Informatik hat es sich eingebürgert, den Zugriff auf das i-te Element eines Tupels x mit Hilfe eckiger Klammern zu schreiben, etwa so
(das entspricht genau dem xi aus der Mathematik):
    x[i]
Bei der Notation des Feld-Datentyps an sich möchte ich mich im weiteren an der Vektor-Schreibweise der Mathematik orientieren; ein Feld von 10 natürlichen Zahlen würde also mit N10 beschrieben werden.

Ein Datenverbund ist einem Feld ähnlich, nur dass die einzelnen Bestandteile nicht notwendigerweise den gleichen Datentyp haben müssen; somit können auch komplexere Strukturen beschrieben werden, wie sie in der Informatik häufig vorkommen. Zusätzlich ist es möglich, den einzelnen Bestandteilen eines Verbundes explizite Namen zu geben, so dass sie nicht über ihren Index angesprochen werden müssen (was in vielen modernen Programmiersprachen auch gar nicht mehr geht). Zusätzlich kann der gesamte Verbund noch einen Namen bekommen, damit er im Programm an mehreren Stellen benutzt werden kann. Nehmen wir zum Beispiel an, dass wir für einen Algorithmus ein regelmäßiges n-Eck, also ein Polygon, beschreiben wollen. Dieses besteht aus zwei Informationen: der Anzahl der Ecken v (vertices, eine natürliche Zahl) und der Kantenlänge e (edge length, eine reelle Zahl). Wir können also etwa schreiben:

type Polygon:
  v ∈ N
  e ∈ R

Liegt ein Objekt eines solchen Datentyps vor, ist es in der Informatik üblich, auf die einzelnen Bestandteile des Objektes über den sogenannten Punkt-Operator zuzugreifen. Haben wir also ein Polygon p, so können wir seine Kantenlänge abfragen über den Code:
p.e
Jetzt hat man bei der Definition des Datentyps Polygon schon eine Besonderheit gesehen: ich habe den einzelnen Bestandteilen einen konkreten Datentyp vorgegeben; beim bisherigen Code habe ich das nicht gemacht. Im Grunde ist es möglich, den Typ einer Variablen (und eines Datentyp-Bestandteils) nicht weiter zu spezifizieren; in der Tat wird das sogar in vielen Programmiersprachen so gemacht (in erster Linie in den sogenannten Scriptsprachen). Der Nachteil dieser Vorgehensweise ist natürlich, dass insbesondere Fremdcode so schlechter gelesen werden kann, da erst herausgefunden werden muss, was eine bestimmte Variable genau repräsentiert. Hinzu kommt aber noch ein ganz pragmatischer Nachteil: an irgendeiner Stelle muss dem Computer ja mitgeteilt werden, welche Rechenoperation er zum Beispiel für zwei Variablen wählen soll. Wie wir wissen, werden etwa ganze und reelle Zahlen unterschiedlich addiert; wenn beim Schreiben eines Programms noch nicht bekannt ist, von welchem Datentyp eine Variable ist, so muss dieser zur Laufzeit bestimmt werden, was Rechenzeit und Speicherplatz kostet. Aus diesem Grund wird der Datentyp einer Variablen häufig spezifiziert. Das kann implizit geschehen (zum Beispiel kann bei der ersten Zuweisung an eine Variable im Programmcode der Datentyp bestimmt werden) oder explizit, indem man den gewünschten Typ hinschreibt, die Variable also deklariert. Das kann zum Beispiel für verschiedene Variablen in etwa so aussehen, ganz, wie aus der Mathematik bekannt (und diese Notation werde ich auch weiterhin benutzen):

  var1 ∈ N
  var2 ∈ Z8
  var3 ∈ Polygon

Damit haben wir jetzt fast alles an Rüstzeug zusammen, um uns den eigentlich spannenden Themen der Informatik zu zuwenden: den Algorithmen und Datenstrukturen. In den folgenden Artikeln werde ich mich diesem Themengebiet widmen, wobei ich jedoch auch immer hie und da einen Exkurs in die Theorie der Programmiersprachen wagen werde. Wenn bestimmte Themen gewünscht werden, schreibt sie einfach in die Kommentare oder mir eine Mail – wenn sie nicht zu kompliziert sind, werde ich gerne einen Artikel dazu schreiben.

1 / 2

Kommentare (7)

  1. #1 Dr. Webbaer
    September 28, 2011

    Wie werden Datentypen, allgemeiner: Einstellungen auf Datenebene, sprachlicherseits genau implementiert?

  2. #2 Tim
    September 28, 2011

    hi marcus,

    sollte es in dem beispiel mit dem punkt-operator und dem polygon nicht p.e heißen, wenn du die kantenlänge abfragen willst?

    ansonsten ein schöner artikel. die gesamte reihe “wie rechner rechnen” und auch die jetztige gefallen mir gut. vielen dank dafür!

  3. #3 Marcus Frenkel
    September 28, 2011

    @Tim
    Danke für den Hinweis, habe es korrigiert.

    @Dr. Webbaer
    Was meinen Sie genau damit? Die primitiven Datentypen sind lediglich Bitketten im Speicher, die unterschiedlich interpretiert werden. Und die zusammengesetzten Typen sind auch nur Folgen von Bitketten.

  4. #4 Dr. Webbaer
    September 28, 2011

    Vielleicht haben Sie’s vor ohnehin später zu erläutern, aber die Logik, die Daten sprachlicherseits typisiert und so dem Anwender/Programmierer verfügbar (inklusive “Meldungen”) macht, wurde wohl noch nicht direkt beschrieben.

  5. #5 rolak
    September 30, 2011

    [sprachlicherseitige typisierung]…noch nicht direkt beschrieben

    1. Falls Mitgeliefertes der Programmiersprachen gemeint ist: Erste Grundlagen der Mathematik und doch, es wurde hier im blog schon beschrieben.
    2. Falls problemangepasste Datentypen der Programmiersprachen gemeint sind: Das steht hier im thread.
    3. Falls Umgangssprachen gemeint sind: Das hat mit dem Thema nichts zu tun. Eher damit, doch er beliebt ja auch dort eher OT zu verfassen.
  6. #6 Dr. Webbaer
    Oktober 2, 2011

    @rolak
    Yup!, irgendwo hier hat Dr. Webbaer einige Kenntnislücken, was dasjenige betrifft, das zwischen den Bitmanipulationen, den absoluten Grundlagen und der Programmierung einer Hochsprache liegt. Wie genau bspw. das Überlaufen einer Integers oder die Zuordnung eines Funktionsarguments (Dr. W bleibt übrigens gerne noch beim Parameter für “Innen und außen” – vgl. auch die ursprüngliche Wortbedeutung) falschen Typs i.p. Compilerbau bzw. vom Compiler oder Interpreter bearbeitet wird, interessiert eigentlich auch nicht weiter…

  7. #7 Marcus Frenkel
    Oktober 2, 2011

    Irgendwie steh ich noch immer auf dem Schlauch, was nun genau die Frage ist. Vielleicht noch einmal mit einer Formulierung in Umgangs- und nicht in Prosadeutsch versuchen, dann gibt es vielleicht auch eine Antwort drauf.