WerkzeugeAndere Sprachen
|
LISPLISP ist eine Familie von Programmiersprachen, die 1958 erstmals spezifiziert wurde und am Massachusetts Institute of Technology (MIT) in Anlehnung an den Lambda-Kalkül entstand. Auf Basis von Lisp entstanden zahlreiche Dialekte. Zu den bekanntesten zählen Common Lisp und Scheme. Daher bezieht sich der Begriff Lisp oft auf die Sprachfamilie und nicht auf einen konkreten Dialekt oder eine konkrete Implementierung.
[Bearbeiten] Geschichte
Eine Lisp-Maschine im MIT-Museum
LISP steht für List Processing. Damit waren ursprünglich FORTRAN-Unterprogramme gemeint, mit denen symbolische Berechnungen durchgeführt werden sollten, wie sie im Lambda-Kalkül gebraucht werden. Steve Russell, einer der Studenten von John McCarthy, kam dann auf die fundamentale Idee, einen Interpreter für diese Ausdrücke zu programmieren, womit die Programmiersprache LISP geboren war. Die Grunddatenstrukturen von Lisp sind Einzelwerte (Skalarwerte), die Atome genannt werden, und Listen. Die Listen können beliebig verschachtelt werden (Listen von Listen). Damit lassen sich auch leicht Datenstrukturen wie ein assoziatives Array implementieren. Die Listen werden mit runden Klammern dargestellt: (A B C) Auch Programmanweisungen sind Listen, wobei das erste Listenelement die auszuführende Funktion identifiziert. Es gibt somit keinen grundsätzlichen Unterschied zwischen Daten und Programmanweisungen. Dies ermöglicht u. a., Programmteile zur Laufzeit beliebig zu manipulieren. Der Programmierer kann so beispielsweise neue Kontrollstrukturen oder Objektsysteme (OOP) entwickeln (Metaprogrammierung, Makros). Lisp bietet dem Programmierer große Flexibilität und weitreichende Einflussmöglichkeiten, weshalb es manchmal auch als programmierbare Programmiersprache bezeichnet wird. Datenstrukturen werden dynamisch aufgebaut, ohne dass der Programmierer explizit Speicherplatz reservieren oder freigeben muss (siehe auch automatische Speicherbereinigung). Deklarationen für Daten sind nicht nötig, und ein Lisp-Symbol kann als Variable beliebige Arten von Objekten bezeichnen. Viele dieser Eigenschaften sind im Laufe der Zeit in weitere Programmiersprachen übernommen worden. Anfang der 1960er waren sie jedoch ihrer Zeit weit voraus. In den 1970er und 1980er Jahren wurden spezielle Lisp-Maschinen entwickelt und vertrieben. Diese ermöglichten das schnelle Ausführen von Lisp-Programmen, was auf damaligen allgemeinen Computern nur unter dem Verzicht von Typ-Überprüfung und Garbage Collection möglich war. Dies hat sich durch schnellere Computer jedoch geändert. Programme in Lisp können interpretiert oder von einem Compiler in effizienten Code übersetzt werden. Typische Compiler sind Batch-Compiler oder inkrementelle Compiler. Inkrementelle Compiler können einzelne Ausdrücke übersetzen. Batch-Compiler übersetzen einzelne Lisp-Dateien oder ganze Lisp-Programme. Compiler übersetzen entweder in einen Bytecode für eine virtuelle Maschine oder in Maschinencode für einen Prozessor. Das Akronym LISP wird manchmal scherzhaft als „Lots of Irritating Superfluous Parentheses“ (eine Menge ärgerlicher, überflüssiger Klammern) interpretiert. [Bearbeiten] BedeutungHistorisch war Lisp zusammen mit Prolog eine der Programmiersprachen der künstlichen Intelligenz. Im Unterschied zu Europa, wo Programmiersprachen wie Assembler, Fortran oder Pascal als klassische Vertreter der Familie der prozeduralen Programmiersprachen gelehrt wurden, war und ist zum Teil bis heute in den USA LISP die erste gelehrte Programmiersprache. Das hatte einen großen Einfluss, da es sich bei den klassischen Vertretern der prozeduralen Sprachfamilien um Vertreter einer statischen Verarbeitungsweise von Daten handelt, während dagegen unter anderem LISP ein strikt dynamisches Konzept vertritt. [Bearbeiten] SyntaxLisp benutzt S-Expressions als externes Format, um sowohl Source-Code als auch Daten darzustellen. Funktions- und Makroaufrufe werden als Listen geschrieben, die als erstes Element den Namen der Funktion bzw. des Makros enthalten. Kommentare werden mit Ein Beispiel in Common Lisp: ;; Addiere 2 und 2: (+ 2 2) ;; Setze die Variable p auf den Wert 3,1415: (setf p 3.1415) ;; Definiere eine Funktion, die ihr Argument quadriert: (defun square (x) (* x x)) ;; Quadriere die Zahl 3: (square 3) [Bearbeiten] Minimaler Funktionsumfang für LispNur ganz wenige Operatoren und ein allgemeiner Mechanismus zur Funktionsdefinition sind nötig, um ein minimales Lisp-System zu implementieren. Die folgenden Funktionen sind im ursprünglichen Bericht von McCarthy enthalten:
Bereits mit diesen Sprachmitteln kann ein bemerkenswerter Teil der Funktionen, die übliche Lisp-Systeme mitbringen, definiert werden. [Bearbeiten] Zitate
[Bearbeiten] Lisp-DialekteHeute häufig verwendete Dialekte:
Andere Lisp-Dialekte:
[Bearbeiten] Einzelnachweise[Bearbeiten] Literatur
[Bearbeiten] Weblinks
|