«Eine der bedeutendsten Programmiersprachen aller Zeiten«
— Alan Kay, „über Lisp“

Als McCarthy Ende der 1950er Jahre Lisp entwickelte, unterschied er sich radikal von den bestehenden Sprachen, wobei die wichtigste .
Lisp brachte neun neue Ideen hervor:
1. Bedingte Anweisungen (Conditionals). Bedingte Anweisungen sind if-then-else-Konstruktionen. Heute betrachten wir sie als selbstverständlich. Sie wurden während der Entwicklung von Lisp. (Fortran hatte zu der Zeit nur goto-Anweisungen, die eng mit der Sprunganweisung auf der darunterliegenden Hardware verknüpft waren.) McCarthy, der im Algol-Komitee war, führte die bedingten Anweisungen in Algol ein, von wo sie sich auf andere Sprachen verbreiteten.
2. Funktionstypen (A function type). In Lisp sind Funktionen Erstklassige Objekte — sie sind Datentypen, ebenso wie Zahlen, Strings usw., haben eine literale Darstellung, können in Variablen gespeichert und als Argumente übergeben werden usw.
3. Rekursion (Recursion). Rekursion existierte zwar zuvor als mathematisches Konzept, jedoch war Lisp die erste Programmiersprache, die sie unterstützte. (Dies wird möglicherweise durch die Schaffung von Funktionen als Erstklassige Objekte impliziert.)
4. Ein neues Konzept von Variablen. In Lisp sind alle Variablen effektive Zeiger. Werte gehören zu Typen und nicht zu Variablen, und die Zuweisung oder Bindung von Variablen bedeutet das Kopieren von Zeigern und nicht das, worauf sie zeigen.
5. Garbage Collection.
6. Programme aus Ausdrücken zusammengesetzt. Programme in Lisp sind Ausdrucksbäume, von denen jeder einen Wert zurückgibt. (Einige Lisp-Ausdrücke können mehrere Werte zurückgeben.) Dies steht im Kontrast zu Fortran und vielen anderen erfolgreichen Sprachen, die 'Ausdrücke' und 'Aussagen' unterscheiden.
In Fortran war es natürlich, eine solche Unterscheidung zu haben, da die Sprache linear orientiert war (nicht überraschend für eine Sprache, bei der das Eingabeformat eine Lochkarte war). Sie konnten keine verschachtelten Aussagen haben. Und während Sie mathematische Ausdrücke für die Arbeit benötigten, war es sinnlos, etwas anderes einen Wert zurückgeben zu lassen, da es möglicherweise nichts gab, das auf eine Rückgabe wartete.
Mit dem Aufkommen blockstrukturierter Sprachen wurden die Einschränkungen aufgehoben, doch bis dahin war es bereits zu spät. Der Unterschied zwischen Ausdrücken und Aussagen hatte sich bereits etabliert. Er setzte sich von Fortran über Algol bis hin zu deren Nachfolgern fort.
Wenn eine Sprache vollständig aus Ausdrücken besteht, können Sie Ausdrücke nach Belieben erstellen. Sie können entweder (unter Verwendung der Syntax )
(if foo (= x 1) (= x 2))oder
(= x (if foo 1 2))7. Symboltyp (A symbol type). Zeichen unterscheiden sich von Strings, sodass Sie sie auf Gleichheit überprüfen können, indem Sie die Zeiger vergleichen.
8. Notation für Code (A notation for code) unter Verwendung von Bäumen aus Symbolen.
9. Die gesamte Sprache ist immer verfügbar (The whole language always available). Es gibt keinen klaren Unterschied zwischen Lesezeit, Kompilierungszeit und Ausführungszeit. Sie können Code während des Lesens kompilieren oder ausführen, oder Code lesen oder ausführen, während Sie kompilieren, oder Code während der Ausführung lesen oder kompilieren.
Die Ausführung von Code zur Laufzeit ermöglicht es den Benutzern, die Syntax von Lisp neu zu programmieren; die Codeausführung während der Kompilierung bildet die Grundlage für Makros; die Kompilierung zur Laufzeit ist die Grundlage für die Verwendung von Lisp als Sprache zur Erweiterung in Programmen wie Emacs; und schließlich ermöglicht das Lesen zur Laufzeit, dass Programme über s-Ausdrücke interagieren, eine Idee, die kürzlich in XML neu erfunden wurde.
Fazit
Als Lisp ursprünglich erfunden wurde, waren all diese Ideen weit entfernt von den üblichen Programmierpraktiken, die durch die Hardware diktiert wurden, die Ende der 1950er Jahre verfügbar war.
Im Lauf der Zeit hat sich die Standardsprache, die den Erfolg populärer Sprachen verkörpert, allmählich in Richtung Lisp entwickelt. Die Punkte 1 bis 5 sind mittlerweile weit verbreitet. Punkt 6 beginnt, im Mainstream sichtbar zu werden. In Python gibt es in gewisser Weise Punkt 7, obwohl die geeignete Syntax fehlt. Punkt 8, der (neben Punkt 9) Makros in Lisp ermöglicht, existiert nach wie vor nur in Lisp, möglicherweise weil (a) er diese Klammern oder etwas ebenso Unangenehmes erfordert und (b) wenn Sie diese letzte Leistungssteigerung hinzufügen, können Sie nicht länger behaupten, eine neue Sprache erfunden zu haben, sondern lediglich einen neuen Dialekt von Lisp entwickelt; -)
Obwohl dies für moderne Programmierer nützlich ist, ist es seltsam, Lisp im Hinblick auf seine Abweichungen von zufälligen Techniken, die in anderen Sprachen angenommen werden, zu beschreiben. Vielleicht ist das nicht das, was McCarthy im Sinn hatte. Lisp wurde nicht entworfen, um die Fehler von Fortran zu beheben; es entstand eher als Nebenprodukt eines Versuchs .
Quelle: habr.com
