Die Zuweisung (assignment operator)
Was bedeutet die folgende Zeile:
x = 1
Die Antwort auf die Frage ist gar nicht so einfach: es fehlt der Kontext. In diesem Artikel gehen wir der Bedeutung des Gleichheitszeichens nach.
Gleichheit in der Mathematik
Eine Erinnerung an den Mathematikunterricht wird wach:
x ist eine Variable und 1 ist der Wert der Variable. Damit können wir Gleichungssysteme lösen, wie zum Beispiel dieses:
x = 1 y = 2 z = x + y
Für den Mathematiker bedeutet x = 1 also
Der Ausdruck rechts vom =-Zeichen gleichwertig ist mit dem Ausdruck links vom =-Zeichen.
1 = x enthält dieselbe Aussage.
Zuweisungsoperator in der Informatik
x = 1
Diese Zeile bedeutet in den meisten Programmiersprachen eine Zuweisung. Die Langform wäre:
Der Variablen mit der Bezeichnung x weisen wir den konstanten Wert 1 zu. Im weiteren Verlauf des Programms wird die Variable mit der Bezeichnung x den konstanten Wert 1 haben, und zwar solange bis der Variablen mit Bezeichnung x einen neuer Wert zugewiesen wird.
Nicht alle Programmiersprachen verwenden dazu das = Zeichen
Cobol verlangt:
move 1 to x.
In Pascal ist es:
x := 1;
Bleiben wir beim = Zeichen für den Zuweisungsoperator.
Gleich ist nicht gleich Gleich
Beispiel: Gleichheit vs. Zuweisung
x = 1 x = 2
Diese zwei Zeilen bereiten dem Mathematiker Kopfzerbrechen. Als Gleichungssystem aufgefasst bedeuten die beiden Zeilen: 1 = 2 – was ja nicht möglich ist.
Dieselben zwei Zeilen sind Alltag für den Informatiker: Zuerst nimmt x den Wert 1 an. Und danach nimmt x den Wert 2 an. Das ist alles.
Noch ein Beispiel: Gleichheit vs. Zuweisung und die Reihenfolge
1 = x
Für den Mathematiker bedeutet 1 = x dasselbe wie x = 1
1 = x bietet dem Informatiker Kopfzerbrechen, weil die Zuweisung immer den Wert rechts vom Zuweisungsoperator in die Variable links vom Zuweisungsoperator schiebt. Und bei 1 = x steht links vom Zuweisungsoperator nicht eine Variable, sondern der konstante ganzzahlige Wert 1. Untersuchen wir das genauer:
Speicherplatz im Memory (RAM)
Aus Sicht des Computers bedeutet x noch etwas anderes: x belegt Speicherplatz im Memory (RAM = Random Access Memory).
Wie viel Speicherplatz belegt wird, hängt ganz vom Datentyp von x ab. In unserem ‘Programm’ haben wir keine Aussage darüber gemacht.
Python und Memory
Handelt es sich um ein Python Programm, dann wird der Python (genauer der Python-Interpreter) dem Kontext entnehmen, dass x eine ganze Zahl sein muss und entsprechend viel Platz im Memory dafür reservieren.
Java und Memory
Handelt es sich um ein Java-Programm, dann müssen wir als Programmierer Java (genauer dem Java-Compiler) mitteilen, von welchem Datentyp x sein soll.
Mit
int x = 1;
teilen wir Java mit, dass die Variable mit der Bezeichnung x den Datentyp int haben soll und zu Beginn den Wert 1 annehmen soll. Im weiteren Verlauf des Programms brauchen wir den Datentyp von x nicht mehr zu definieren. Also
int x = 1; x= 2;
Ist gültiger Java Code.
int bedeutet für den Java-Compiler, dass 32 Bit Platz im Memory zur Verfügung gestellt werden. Ein Bit ist ja diejenige Einheit, die den Wert 0 oder 1 annehmen kann.
8 aufeinanderfolgende Bit werden als Byte bezeichnet. Und ein Byte ist die kleinste, adressierbare Einheit in einem Computer. Adressierung ist notwendig, um im Memory den Wert von x sehr schnell zu finden.
32 Bit sind also 4 Byte
Mit dem Befehl int x = 1 weisen wir in Java also den Compiler an, im Memory nach 4 aufeinanderfolgenden Byte zu suchen, die noch frei sind und diese für den Wert der Variablen mit Bezeichnung x zu reservieren.
Diese 4 Byte werden für die Dauer des Programms den Wert von x in binärer Form enthalten. Der Wert von x kann sich ständig ändern, je nachdem, was der Programmcode verlangt.
Wir können also schreiben:
int x = 4 x = 2 * x
Damit passiert folgendes:
- Es werden 4 Byte Platz reserviert für x und mit dem Wert 4 belegt.
- In der nächsten Zeile wird zuerst der Ausdruck rechts vom Zuweisungsoperator ausgewertet: Der Wert von x wird genommen (also 4) und mal 2 gerechnet (also 8)
- Jetzt erfolgt die Zuweisung: Das Ergebnis (also 8) wird in die 4 Byte, die für x reserviert sind, geschrieben und damit geht der frühere Wert (also 4) vergessen.
Die Umwandlung zwischen den für uns gewohnten Dezimalzahlen in die Binären Zahlen mit 0 und 1 überlassen wir getrost dem Computer.
Die Wahl des Datentyps
Als Java Programmierer wählen wir den Datentyp sorgfältig. Zu jeder Zeit müssen genügend Bit und Byte vorhanden sein, um alle möglichen Werte für die Variable darzustellen.
Mit long x = 1 weisen wir Java an, 64 bit für x zu reservieren – also 8 Byte.
In Python ist das Leben als Programmierer einfacher. Der Python-Interpreter teilt die Datentypen zu und geht dabei sehr großzügig um mit den Bytes im Memory.
Das ist ein wichtiges Kriterium bei der Wahl der Programmiersprache:
Bei einer typsicheren Sprache wie Java, C, C# können wir als Programmierer den Speicherbedarf gut steuern und optimieren.
Bei einer nicht-typsicheren Sprache, wie Python, ist das nicht der Fall – dafür codieren wir schneller.
Platz gegen Zeit – ein häufiger Trade Off in der Informatik.
Fazit:
Das = Zeichen wird in der Informatik als Zuweisungsoperator verwendet und hat damit eine grundsätzlich andere Bedeutung als das Gleichheitszeichen in der Mathematik.
In der Informatik steht links vom Zuweisungsoperator immer die Bezeichnung einer Variablen.
Rechts vom Zuweisungsoperator steht ein beliebiger Ausdruck.
Wird die Zuweisung ausgeführt, dann wird der Ausdruck rechts vom Zuweisungsoperator ausgewertet und in den Speicherplatz geschrieben, der für die Variable links vom Zuweisungsoperator im RAM reserviert wird.
Jede Variable hat einen Datentyp, dieser gibt an, wie viel Speicherplatz belegt wird.
Nur in typ-sicheren Sprachen kümmert sich der Programmierer um die Datentypen und optimiert den Memory-Bedarf des Programms.