In der Programmierung ist eine Variable ein abstrakter Behälter für einen Wert, der bei der Ausführung eines Computerprogramms auftritt. Im Normalfall wird eine Variable im Quelltext durch einen Namen bezeichnet und hat eine Adresse im Speicher des Computers.

Der durch eine Variable repräsentierte Wert und gegebenenfalls auch die Größe kann – im Unterschied zu einer Konstante – zur Laufzeit des Rechenprozesses verändert werden.

Arten von Variablen Grundsätzlich unterscheidet man zwischen Wertevariablen und referenziellen Variablen. In einer Wertevariablen wird ein Wert direkt abgelegt, während eine referenzielle Variable als Wert die Speicheradresse des eigentlichen Wertes, einer Funktion oder eines Objektes enthält. Deshalb werden referenzielle Variablen auch als Zeiger bezeichnet.

Beispiele in der Programmiersprache C# const int i = 3; // Konstante; keine Variable int j = 3; // Wertevariable object k = (object)3; // referenzielle Variable auf einen Wert object o = new object(); // referenzielle Variable auf ein Objekt object n = null; // referenzielle Variable auf das null-Objekt (Zeiger auf Speicheradresse 0) Func<int> f = () => 3; // referenzielle Variable auf eine Funktion

Verwendung von Variablen Es lassen sich verschiedene Arten der Verwendung von Variablen unterscheiden: Eingabevariablen erhalten Werte, die von außen ins Programm, die Funktion oder Methode eingegeben werden (siehe Parameter). Ausgabevariablen enthalten später die Resultate der Rechnung. Referenzvariablen (Zeiger) dienen sowohl als Eingangs- als auch Ausgangsvariable. Der Wert kann während der Rechnung verändert werden. Hilfsvariablen nehmen Werte auf, die im Verlauf der Rechnung benötigt werden. Umgebungsvariablen repräsentieren die äußeren Randbedingungen eines Programms. Metasyntaktische Variablen dienen zur bloßen Benennung von Entitäten oder Teilabschnitten des Programmcodes. LaufzeitvariablenFestlegen und Löschen von Laufzeitvariablen – ein Beitrag im C++-Community-Forum (die betreffende Seite wurde zuletzt geändert am 10. Juli 2008); mit einem Zitat vom Visual Studio Analyzer, wo es heißt:

Sichtweisen von Variablen Das Konzept der Variablen wird von Programmiersprachen unterschiedlich interpretiert: in einer rein funktionalen Programmiersprache sind Variablen einfach nur Bezeichner, das heißt, sie werden wie im Lambda-Kalkül nur dazu verwendet, die Eingabeparameter für eine Funktion zu bezeichnen. Während der Berechnung eines Funktionswerts ändert sich der Wert der Variablen deshalb nicht. Ein Ausdruck mit Variablen hat stets den gleichen Wert, unabhängig davon, an welcher Stelle im Programm er auftritt. Diese Eigenschaft ist unter dem Begriff referentielle Transparenz bekannt. in einer imperativen Programmiersprache kann sich dagegen der Wert einer Variablen während des Programmablaufs ändern. Der gleiche Ausdruck mit Variablen kann deshalb an verschiedenen Stellen des Programms oder zu verschiedenen Zeiten in der Programmausführung ganz unterschiedliche Werte haben. Dementsprechend definieren verschiedene Programmiersprachen den Begriff der Variablen ganz unterschiedlich. Im Fall von Java heißt es:

In der Sprachdefinition von Scheme heißt es dagegen

Allgemein müssen für eine Variable in einer imperativen Programmiersprache vier Aspekte unterschieden werden: der Speicherplatz selbst als Behältnis für Daten, die in dem Speicherplatz abgelegten Daten, die Adresse des Speicherplatzes und der Bezeichner, unter dem der Speicherplatz angesprochen werden kann. Kompliziert wird die Situation außerdem dadurch, dass unter einem bestimmten Bezeichner an verschiedenen Stellen des Programms oder zu verschiedenen Zeiten in der Programmausführung unterschiedliche Speicherplätze angesprochen sein können und dass es auch anonyme, also namenlose Variablen gibt.

L-Wert und R-Wert von Variablen Typisch für imperative Programmiersprachen ist, dass ein Bezeichner auf der linken Seite einer Wertzuweisung eine andere Bedeutung („L-Wert“) hat als auf ihrer rechten Seite („R-Wert“). Die Anweisung x := x + 1 bedeutet: „Nimm den Wert der Variablen mit dem Namen x, erhöhe ihn um eins und speichere dies an die Adresse von x.“ Der L-Wert einer Variablen ist also ihre Adresse, der R-Wert ihr Inhalt.

Variablen als Parameter von Funktionen Auch die Parameter einer Funktion werden in deren Deklaration durch Variablen repräsentiert, die dann formale Parameter heißen. Beim Aufruf der Funktion werden den formalen Parametern dann Ausdrücke als tatsächlicher Parameter zugeordnet. Für die Übergabe der tatsächlichen Parameter an die Funktion gibt es unterschiedliche Mechanismen. Verbreitet sind die Übergabe durch Wert und die Übergabe durch Referenz.

Typen von Variablen Mit jeder Variablen in einem Programm ist notwendigerweise ein bestimmter Datentyp (kurz: Typ) verbunden. Dies ist schon allein deshalb notwendig, weil nur der Datentyp festlegt, welche Operationen auf und mit der Variablen sinnvoll und zulässig sind. Der Datentyp einer Variablen kann auch die Speichergröße der Variablen festlegen. In der Regel hat der Programmierer die Möglichkeit, in einer Deklaration diesen Typ festzulegen. In vielen Programmiersprachen ist eine solche explizite Deklaration sogar verpflichtend. Andere Programmiersprachen bieten implizite Deklarationen, die dann verwendet werden, wenn keine expliziten Deklarationen vorhanden sind. So kannte Fortran die Konvention, dass Variablen, deren Namen mit Buchstaben zwischen I und N beginnen, vom Typ INTEGER sind und alle anderen vom Typ REAL, sofern nichts anderes festgelegt wird. Andere Programmiersprachen kennen sogenannte latente Typen. Hier sind Deklarationen nicht nötig, sondern die Maschine erkennt den Typ einer Variablen bei ihrer ersten Verwendung an ihrem Inhalt und führt diesen Typ dann stillschweigend weiter mit. In manchen Programmiersprachen kann der nicht explizit angegebene Typ einer Variablen unter gewissen Voraussetzungen auch vom Compiler mittels Typinferenz anhand anderer Typen, mit denen die Variable in einem Zusammenhang steht, erschlossen werden.

In dynamisch typisierten Programmiersprachen kann sich der Typ einer Variablen erst zur Laufzeit eines Programmes ergeben und auch während der Programmausführung ändern. Folgendes Beispiel in JavaScript illustriert dies: function show(value) { if (typeof value === 'number') value += " ist eine Zahl";

console.log(value); }

show('Hallo Welt!'); show(42);

Variablen in einer Blockstruktur Ein wichtiges Konzept von Programmiersprachen ist das Unterprogramm, ob es nun Prozedur, Funktion, Methode oder noch anders heißt. Die allgemeinste Form dieses Konzepts ist der in der Programmiersprache Algol 60 erstmals eingeführte Block. Praktisch alle Programmiersprachen, die dieses Konzept in irgendeiner Form anbieten, erlauben es, dass Blöcke ihre eigenen Variablen besitzen, die sich von den Variablen anderer Blöcke eindeutig unterscheiden lassen. Solch eine Variable heißt lokale Variable. Eine Variable, die im ganzen Programm für alle Blöcke zur Verfügung steht, heißt globale Variable. Die Programmiersprache PHP kennt sogar den Begriff der superglobalen Variablen, die für alle Programme verfügbar ist, die zur selben Zeit von einem PHP-Interpreter bearbeitet werden.

Globale Variablen sind scheinbar bequem, weil sie im ganzen Programm sichtbar sind. Es ist nicht notwendig, sie beim Aufruf einer Funktion als Parameter zu übergeben. Sie werden aber auch leicht zur Fehlerquelle, wenn man zum Beispiel eine globale Variable versehentlich oder sogar bewusst für verschiedene Zwecke benutzt.

Auch kann es passieren, dass man eine lokale Variable mit dem Namen der globalen Variablen verwendet, von dem man annimmt, dass er im Programm bisher noch nicht benutzt wurde. Wenn es diesen Namen aber schon als Variable mit passendem Typ gibt, sofern dieser überhaupt vom Compiler oder vom Laufzeitsystem geprüft wird, dann wird deren Wert unkontrolliert überschrieben und umgekehrt. Ein schwer zu findender Fehler ist oft die Folge.

Erfahrene Entwickler verwenden globale Variablen nur auf modularer Ebene und nur dann, wenn es sich nicht vermeiden lässt.

Sichtbarkeitsbereich von Variablen (Scope) Unter dem Sichtbarkeitsbereich (englisch scope) einer Variablen versteht man den Programmabschnitt, in dem die Variable nutzbar und sichtbar ist. Da eine lokale Variable in den meisten Programmiersprachen den gleichen Namen tragen darf wie eine globale Variable, sind Sichtbarkeitsbereiche nicht notwendig zusammenhängend: Durch die Deklaration einer lokalen Variable wird die gleichnamige globale Variable für einen bestimmten Block „verdeckt“, das heißt, sie ist in diesem Block nicht sichtbar.

Die Sichtbarkeitsregeln können auf zwei unterschiedliche sich gegenseitig ausschließende Arten festgelegt werden. Dabei ist das Konzept der Bindung wichtig. Bindung bedeutet hier die Zuordnung eines bestimmten Namens zu der damit verbundenen Variablen.

lexikalisch (oder statisch), das heißt, der umgebende Quelltext bestimmt die Bindung dynamisch, das heißt, die Ausführungsschicht zur Laufzeit des Programms bestimmt die Bindung.

Im Fall einer lexikalischen Bindung sind die Bindungen für einen ganzen Block immer die gleichen, weil sie allein durch die Blockstruktur vorgegeben sind. Man kann daher allein durch Analyse des Quelltextes einer Funktion verstehen, wie sich die Funktion verhält. Dieses Konzept unterstützt daher modulare Programmierung.

Bei dynamischen Bindungsregeln können zur Laufzeit immer neue Bindungen eingeführt werden. Diese gelten dann so lange, bis sie explizit aufgehoben werden oder durch eine neue dynamische Bindung verdeckt werden. Man kann daher durch Analyse des Programmtextes einer Funktion nicht notwendigerweise verstehen, wie sich diese verhält. Selbst die Analyse des gesamten Programmtextes eines Programms hilft nicht. Es lässt sich statisch nicht verstehen, wie sich die Funktion verhält. Ihr Verhalten hängt von den jeweiligen (direkt und indirekt) aufrufenden Funktionen ab. Dies widerspricht dem Konzept des modularen Programmierens.

Die meisten modernen Programmiersprachen unterstützen nur lexikalische Bindung, zum Beispiel C++, C, ML, Haskell, Python, Pascal. Einige wenige unterstützen nur dynamische Bindung, zum Beispiel Emacs Lisp, Logo, und einige, zum Beispiel Perl und Common Lisp, erlauben dem Programmierer, für jede lokale Variable festzulegen, ob sie nach lexikalischen (statischen) oder dynamischen Regeln gebunden sein soll.

Verschiedene Gültigkeitsbereiche von Variablen

Beispiel lexikalisch im Gegensatz zu dynamisch C++ und C verwenden lexikalische (statische) Gültigkeitsbereiche: int x = 0; int f() { return x; } int g() { int x = 1; return f(); } /* g() => 0 */

Im obigen Programmfragment ergibt g() immer 0 (den Wert der globalen Variablen x, nicht den Wert der lokalen Variablen x in g()). Dies ist so, weil in f() immer nur das globale x sichtbar ist.

In Perl können lokale Variablen lexikalisch (statisch) mit dem Schlüsselwort my oder dynamisch mit dem irreführenden Schlüsselwort local deklariert werden.What’s the difference between dynamic and static (lexical) scoping? Perl FAQ 4.3 Das folgende Beispiel entspricht dem obigen in C:

$x = 0; sub f { return $x; } sub g { my $x = 1; return f(); } print g()."\n";

Dieses Beispiel benutzt my, um $x in g() einen lexikalischen (statischen) Sichtbarkeitsbereich zu geben. Daher wird g() immer 0 ergeben. f() kann g()’s $x nicht sehen, obwohl dies zum Zeitpunkt, zu dem f() aufgerufen wird, noch existiert.

$x = 0; sub f { return $x; } sub g { local $x = 1; return f(); } print g()."\n";

Dieses Beispiel benutzt local, um $x in g() einen dynamischen Sichtbarkeitsbereich zu geben. Somit kann f() den lokal, in g(), geltenden Wert von $x verwenden und g() liefert den Wert 1.

In der Praxis sollte man in der Regel für Variablen in Perl "my" verwenden.

Lebensdauer von Variablen