Prozedurbindungen lassen sich dynamisch verändern:Lisp erlaubt Modifikationen während des Tests

18.07.1986

Im Zeichen der Kl-Euphorie der jüngsten Vergangenheit hat auch die Bedeutung von "Lisp" zugenommen. Von ihrer Grundkonzeption auf die Belange der Listenverarbeitung ausgelegt, erobert die MlT-Entwicklung zunehmend neue Einsatzbereiche. Dieter Kolb* beschreibt die Struktur der Programmiersprache.

Der steile Aufstieg von Lisp in den letzten Jahren hat eine Reihe von Gründen: So wurde beispielsweise die Verfügbarkeit von Lisp-Systemen durch besonders geeignete Hardware zu relativ günstigen Preisen verbessert. Typische Anwendungen, zum Beispiel Expertensysteme, sind auf dem Vormarsch, und die Realisierung dieser Applikationen wird erleichtert durch die Fähigkeiten der modernen Lisp-Maschinen bezüglich Grafikverarbeitung und Kommunikation in lokalen Netzen.

Ein wesentliches Konzept von Lisp ist die dynamische Speicherplatzzuweisung in Verbindung mit einer automatischen Speicherplatzbereinigung, genannt "Garbage Collection".

Speicherplatz wird bei Bedarf automatisch bereitgestellt, ohne besondere Anforderungen durch das Programm. Nicht mehr benötigter Speicherplatz wird als solcher vom System erkannt und für erneute Verwendung freigegeben.

Ansätze, wie sie in anderen höheren Programmiersprachen zu finden sind, verlangen vom Programmierer, benötigten Speicherplatz explizit anzufordern, etwa durch einen Aufruf der Prozedur "New". Der Programmierer muß dann Buch über alle angeforderten Speicherplätze und deren aktuelle Verwendung führen. Nur so ist es möglich, nicht mehr benötigten Speicherplatz zu erkennen und explizit freizugeben. Mit Hilfe einer selbstentwickelten Speicherverwaltung muß dieser gesammelt und einer erneuten Verwendung zugeführt werden.

Solche für Rapid-Prototyping störenden Routine-Aufgaben, die den Programmierer von der Lösung einer eigentlichen Aufgabe abhalten, sollten vom Programmiersystem wahrgenommen werden. Dabei wird auch das explizite Handhaben von Zeigern unnötig; sie kommen in Lisp nicht vor.

Ein weiteres wesentliches Konzept der Programmiersprache ist die dynamische Bildung von Prozeduren. Die Aufruf-Logik "F00 ruft FIE" wird in konventionellen Programmiersprachen spätestens zum Ladezeitpunkt des Programms hergestellt. In Lisp erfolgt die jeweilige Prozedurbindung dynamisch erst zum Zeitpunkt des Prozeduraufrufs. Diese Konstruktion erlaubt es, die aufzurufende Prozedur dynamisch zu ändern beziehungsweise zu ersetzen.

Das Konzept erlaubt auch das einfache Modifizieren von Programmen durch Austausch oder Editieren von Prozeduren während des Programmtests. Selbst bei kompilierten Prozeduren entfällt ein Neu-Übersetzen oder Neu-Binden des gesamten Programms. Innerhalb des laufenden Programms, zum Beispiel beim Auftreten eines Fehlers, können Prozeduren verändert oder ersetzt werden und das Programm läßt sich anschließend fortsetzen.

Diese Idee der dynamischen Prozedurbindung wird auch von zahlreichen Lisp-Werkzeugen ausgenutzt. So schaltet sich die Ablaufverfolgung (Trace) vor den Aufruf der Prozedur FIE, wenn deren Aufrufe protokolliert werden sollen.

In Lisp werden Programme und Daten in gleicher Weise als sogenannte "symbolische Ausdrücke" dargestellt. Lediglich die Art der Verwendung solcher Ausdrücke entscheidet darüber, ob in einem konkreten Fall der Ausdruck als Programm oder als Datenstruktur zu interpretieren ist.

Die Grundfunktionen, die Lisp anbietet, stehen im gleichen Rang wie die vom Programmierer definierbaren Prozeduren.

Die Programmiersprache Lisp (=List Processing) existiert in ihren Grundzügen seit 1959. Sie wurde von John McCarthy am Massachusetts Institute of Technology (MIT) entwickelt. John McCarthy ist auch Mitverfasser des "Revised Report on the Alg. Lang Algol 60". In den ersten Jahren wurde Lisp hauptsächlich für Anwendungen wie die symbolische Berechnung algebraischer Ausdrücke eingesetzt. Die Sprachbeschreibung "Lisp 1,5 Programmer's Manual" erreichte eine klassische Bedeutung für die funktionale Definition von Programmiersprachen. Lisp 1,5 enthielt bereits sowohl einen Interpreter als auch einen Compiler. Lisp ist in seiner Grundkonzeption eine listenverarbeitende Programmiersprache. Die wesentlichsten primitiven Datenobjekte sind Atome und Listen. Atome entsprechen in konventionellen Programmiersprachen den Symbolen oder Bezeichnern, während Listen eine Folge von Atomen oder weiterer Listen sind.

_AU:*Dieter Kolb ist Mitarbeiter der Siemens AG, München.