Verwenden von VariablesEdit
Sichtbarkeit und Lebensdauer von VariablesEdit
Variablen können je nach Deklaration und Verwendung unterschiedliche Sichtbarkeit oder Gültigkeitsbereiche haben. Der Gültigkeitsbereich bezieht sich auf die Fähigkeit, an einem bestimmten Punkt im Programm auf den Inhalt einer bestimmten Variablen zuzugreifen.
Normalerweise wird der Gültigkeitsbereich einer Variablen durch ihren umschließenden Block bestimmt. Ein Block kann in einigen Sprachen explizit eingeschlossen werden (begin / end, {/} Paare), während in anderen der Block implizit ist.Wenn ein Programm eine Variable in diesem Bereich deklariert, wird sie als globale Variable bezeichnet.
Eine lokale Variable ist dagegen nur innerhalb ihres Blocks sichtbar oder „im Gültigkeitsbereich“.
Betrachten Sie diesen Code:
integer globalVariableglobalVariable = 5begin integer localVariable localVariable = 7 globalVariable = 8endlocalVariable = 3 /* <-- this is a syntax error */
Die globale Variable wird außerhalb eines Blocks deklariert, befindet sich also im (impliziten) globalen Gültigkeitsbereich und ist somit eine globale Variable. die lokale Variable wird im begin / end-Block deklariert und beschränkt ihren Gültigkeitsbereich auf diesen Block.
Die Variable globalVariable beginnt mit 5, wird im Block mit 8 belegt und endet mit 8. Die Variable localVariable wird 7 zugewiesen und verlässt dann den Gültigkeitsbereich, bevor sie illegal 3 zugewiesen wird. Auf dieser Ebene gibt es keine Variable localVariable .
Die Lebensdauer einer Variablen gibt an, wann die Variable aktiv ist. Im vorhergehenden Beispiel wird eine globale Variable zu Beginn des Programms erstellt und hat eine Lebensdauer, die der Länge des Programms entspricht. Für localVariable wird es erst kurz nach der block begins Direktive erstellt. Sein Leben ist vorbei, wenn das Programm die End-Direktive übergibt.
Dynamic memory allocationEdit
Viele Programme haben sehr spezifische Zwecke und benötigen sehr spezifische und kleine Speicherbereiche. Wenn wir ein Programm zum Lesen von Bilddateien schreiben würden, sind wir uns nicht sicher, wie groß die Bilder genau sein könnten. Einige könnten Hunderte von Megabyte sein, während einige Kilobyte oder weniger sein könnten. Das Zuweisen von Hunderten von Megabyte, die nicht benötigt werden, würde die Ausführung des Programms auf einigen Computern erschweren, während das Zuweisen von zu wenig Speicher bedeuten würde, dass einige Bilder nicht verarbeitet werden können.
Ein guter Ansatz für dieses Problem ist die Zuweisung von Speicher nach Bedarf. Dies wird als dynamische Speicherzuweisung bezeichnet. Wir fragen einfach nach so viel wie wir brauchen, während das Programm läuft (anstatt zur Kompilierungszeit), nicht mehr und nicht weniger. In unserem Beispiel können wir damit sowohl große als auch kleine Bilddateien effizient und effektiv bearbeiten. Es gibt einige zusätzliche Komplexität, da es nicht mehr die Sprache ist, die sich mit den Details der Zuweisung befasst, sondern wir direkt. Wenn wir in unserem Beispiel auf einem Computer der unteren Preisklasse arbeiten, ist möglicherweise nicht genügend Speicher für große Bilddateien vorhanden, sodass wir in solchen Situationen erkennen (und möglicherweise ordnungsgemäß fehlschlagen) müssen.Die dynamische Speicherzuweisung ist eine Hauptquelle für „Speicherlecks“, bei denen Programme einen Speicherbereich zuweisen, verwenden und dann damit arbeiten, ihn jedoch nicht mehr als verfügbar markieren. Diese Probleme können schwer aufzuspüren sein, da Lecks im Gegensatz zu anderen Fehlern nicht ohne weiteres erkennbar sind.
Einige moderne Sprachen verfügen über integrierte Mechanismen, um Speicherlecks zu verhindern, die als Garbage Collection bezeichnet werden. Dieses System verfolgt, welche Zuweisung wo verwendet wird, wenn sie außerhalb des Geltungsbereichs liegt. Garbage Collection hat eine leichte Leistungseinbuße, aber es ist jetzt allgemein als Fortschritt angesehen. Java und Python haben zum Beispiel einen Garbage Collector.