«Die beste Programmiersprache aller Zeiten«
— Alan Kay, «über Lisp»

Als McCarthy Lisp in den späten 1950er Jahren entwickelte, unterschied es sich radikal von bestehenden Sprachen, von denen die wichtigste .
Lisp verkörperte neun neue Ideen:
1. Konditionalsätze. Bedingte Anweisungen sind Wenn-Dann-Sonst-Konstrukte. Heute halten wir sie für selbstverständlich. Sie waren McCarthy während der Entwicklung von Lisp. (Fortran hatte damals nur goto-Anweisungen, die eng mit der Verzweigungsanweisung auf der zugrunde liegenden Hardware verbunden waren.) McCarthy führte während seiner Zeit im Algol-Komitee Konditionalsätze in Algol ein, von wo aus sie sich in andere Sprachen verbreiteten.
2. Funktionale Typen (ein Funktionstyp). In Lisp sind Funktionen erstklassige Objekte – sie sind ein Datentyp, genau wie Zahlen, Zeichenfolgen usw., und haben eine wörtliche Darstellung, können in Variablen gespeichert werden, können als Argumente übergeben werden usw.
3. Rekursion. Natürlich gab es Rekursion als mathematisches Konzept schon vor Lisp, aber Lisp war die erste Programmiersprache, die es unterstützte. (Dies ist möglicherweise implizit mit der Erstellung von Funktionen als erstklassige Objekte verbunden.)
4. Ein neues Konzept von Variablen. In Lisp sind alle Variablen effektiv Zeiger. Werte sind das, was Typen haben, nicht Variablen, und das Zuweisen oder Binden von Variablen bedeutet das Kopieren von Zeigern und nicht das, worauf sie zeigen.
5. Garbage Collection.
6. Aus Ausdrücken bestehende Programme. Lisp-Programme sind Ausdrucksbäume, von denen jeder einen Wert zurückgibt. (Einige Lisp-Ausdrücke können mehrere Werte zurückgeben.) Dies steht im Gegensatz zu Fortran und vielen anderen erfolgreichen Sprachen, die zwischen „Ausdrücken“ und „Anweisungen“ unterscheiden.
Eine solche Unterscheidung war in Fortran selbstverständlich, da die Sprache zeilenorientiert war (was bei einer Sprache, deren Eingabeformat eine Lochkarte war, nicht überraschend ist). Sie konnten keine verschachtelten Anweisungen haben. Und solange Sie mathematische Ausdrücke zum Arbeiten brauchten, hatte es keinen Sinn, irgendetwas anderes einen Wert zurückgeben zu lassen, weil es möglicherweise nichts gab, das eine Rückgabe erwartete.
Mit dem Aufkommen blockstrukturierter Sprachen wurden die Beschränkungen aufgehoben, aber da war es schon zu spät. Die Unterscheidung zwischen Ausdrücken und Aussagen ist bereits gut etabliert. Es wurde von Fortran an Algol und von dort an deren Nachkommen weitergegeben.
Wenn eine Sprache vollständig aus Ausdrücken besteht, können Sie Ausdrücke beliebig zusammenstellen. Sie können entweder schreiben (mit der Syntax )
(if foo (= x 1) (= x 2))oder
(= x (if foo 1 2))7. Ein Symboltyp. Symbole unterscheiden sich von Zeichenfolgen. In diesem Fall können Sie die Gleichheit durch Vergleichen von Zeigern überprüfen.
8. Eine Notation für Code mithilfe von Symbolbäumen.
9. Die gesamte Sprache ist immer verfügbar. Es gibt keine klare Unterscheidung zwischen Lesezeit, Kompilierzeit und Laufzeit. Sie können Code während des Lesens kompilieren oder ausführen, Code während des Kompilierens lesen oder ausführen oder Code während der Ausführung lesen oder kompilieren.
Durch das Ausführen von Code während des Lesens können Benutzer die Lisp-Syntax neu programmieren. Das Ausführen von Code zur Kompilierzeit ist die Grundlage für Makros. Die Laufzeitkompilierung ist die Grundlage für die Verwendung von Lisp als Erweiterungssprache in Programmen wie Emacs. und schließlich ermöglicht das Lesen zur Laufzeit Programmen die Kommunikation über S-Ausdrücke, eine Idee, die kürzlich in XML neu erfunden wurde.
Fazit
Als Lisp erfunden wurde, waren all diese Ideen weit entfernt von den gängigen Programmierpraktiken, die die in den späten 1950er Jahren verfügbare Hardware vorgab.
Im Laufe der Zeit entwickelte sich Lisp zur Standardsprache, was sich im Erfolg populärer Sprachen widerspiegelte. Die Punkte 1-5 werden mittlerweile weitgehend akzeptiert. Punkt 6 beginnt, im Mainstream aufzutauchen. Python verfügt über eine Form von Punkt 7, allerdings gibt es keine geeignete Syntax. Punkt 8, der (zusammen mit Punkt 9) Makros in Lisp ermöglicht, ist immer noch nur in Lisp verfügbar, wahrscheinlich weil (a) er diese Klammern oder etwas ähnlich Schlimmes erfordert und (b) man, wenn man diese letzte Leistungssteigerung hinzufügt, nicht mehr behaupten kann, eine neue Sprache erfunden zu haben, sondern nur, einen neuen Lisp-Dialekt entwickelt zu haben; -)
Obwohl dies für moderne Programmierer nützlich ist, ist es seltsam, Lisp im Hinblick darauf zu beschreiben, wie es sich von den in anderen Sprachen verwendeten Zufallstechniken unterscheidet. Dies ist möglicherweise nicht das, was McCarthy im Sinn hatte. Lisp wurde nicht entwickelt, um die Fehler von Fortran zu beheben. es erschien eher als Nebenprodukt eines Versuchs .
Source: habr.com
