Im letzten Artikel ging es um eins der primären Konzepte beim Programmieren, nämlich die Funktionen. Im aktuellen Artikel wollen wir uns mit einem zweiten fundamentalen Konzept beschäftigen: den Variablen.
In einem früheren Artikel gab es schon einmal eine abstraktere Einführung zu den Variablen, heute wollen wir uns etwas konkreter damit beschäftigen. Fangen wir zuerst wieder mit etwas technischem Hintergrund an!
Wie bereits im letzten Artikel geschrieben, befindet sich ein Programm während der Ausführung im Programmspeicher des Rechners, das heißt, die einzelnen Anweisungen sind in einzelne Speicherzellen geschrieben. Daneben benötigt ein Programm aber natürlich auch immer noch die Möglichkeit, Daten in irgendeiner Form verwalten zu können. Zu diesem Zweck gibt es noch den Datenspeicher; dieser ist wie der Programmspeicher aus einzelnen Zellen aufgebaut, die beliebige Inhalte (also: Zahlen) aufnehmen können und ebenfalls durch eine Adresse identifiziert werden.1 Diese Speicherzellen werden durch entsprechende Anweisungen modifiziert – sie repräsentieren (zusammen mit einigen anderen Informationen) den Programmzustand. Die Daten im Speicher sind wesentlicher Bestandteil der Programmabarbeitung, da sie einerseits den Programmablauf beeinflussen (wir werden noch sehen, wie) und andererseits natürlich die berechneten Ergebnisse des Programms repräsentieren.
1 Um Verwirrung zu vermeiden: Programmspeicher und Datenspeicher liegen – je nach Architektur des Rechnersystems – zusammen im Arbeitsspeicher (so ist das bei handelsüblichen Rechnern) oder können echt physikalisch getrennte Speicher sein. Wenn sie zusammen im Arbeitsspeicher liegen, sind es oft einfach zwei getrennte, durch das Betriebssystem vergebene Speicherbereiche.
Prinzipiell sind 2 verschiedene Datenspeicher zu unterscheiden: der Stack und der Heap. Mit Stack wird neben dem Datenspeicher auch eine bestimmte Datenstruktur beschrieben, bei der die Daten gestapelt (engl: to stack) werden. Konkret werden beim Stack-Speicher neue Daten “oben aufgelegt”; um ältere, tiefer gelegene Daten zu entfernen, müssen immer zuerst die weiter oben befindlichen entfernt werden (den Vorteil dieses Vorgehens erkläre ich später). Demgegenüber können Daten im Heap an (fast) beliebiger Stelle hinzugefügt und wieder entfernt werden.2 Beide Datenspeicher-Arten kommen in modernen Programmen vor und werden uns auch immer wieder begegnen; im Detail werden wir uns aber erst in den nächsten Artikeln damit beschäftigen.
2 Ebenso wie Programm- und Datenspeicher sind Stack und Heap in der Regel lediglich 2 getrennte Bereiche im gleichen Arbeitsspeicher.
Nun ist natürlich die große Frage: mit was für Anweisungen lassen sich die Speicherzellen der Daten modifizieren, sprich auslesen und beschreiben. Natürlich könnte man ein Programm direkt anweisen, in eine Speicherzelle mit einer bestimmten Adresse einen Wert zu schreiben oder daraus einen Wert zu lesen; das würde aber erstens zu ziemlich unleserlichen Programmen führen und zweitens mit der Arbeitsweise moderner Betriebssysteme fatal kollidieren. Wir benötigen also eine andere Möglichkeit, Daten anzusprechen.
Der Grundmechanismus hierfür sind die titelgebenden Variablen (ein Hinweis vorab, für mitlesende Mathematiker: Variablen sind in der Informatik prinzipiell denen der Mathematik ähnlich, unterscheiden sich aber in einigen fundamentalen Punkten, die im Folgenden klar werden sollten). Im Grunde ist eine Variable erst einmal nichts anderes als der Verweis auf eine Speicherzelle, versteckt hinter einem schönen Namen. Der Vorteil ist, dass erstens das Programm weitaus lesbarer wird, wenn man Namen statt Speicheradresse verwendet, und dass zweitens der Compiler beim Kompilieren eines Programms dafür sorgen kann, dass die Variablen mit vernünftigen Speicheradressen assoziiert werden (wobei hier keine festen, “absoluten”, sondern dynamische, “relative”, Adressen vergeben werden – mehr dazu vielleicht später). Diese Variablen können nun benutzt werden, um passende Werte in den Speicher zu schreiben.
Nehmen wir einmal an, wir hätten zwei Variablen x
und y
, welche natürliche Zahlen repräsentieren. Um den Wert 42
in die durch x
repräsentierte Speicherzelle zu schreiben, würde man in C++ einfach die folgende Anweisung an passender Stelle einfügen – man spricht von einer Zuweisung:
x = 42;
Zum Lesen des Wertes von x
reicht die Verwendung des Namens, etwa so (y
speichert danach das Quadrat von x
):
Kommentare (8)