«Die bedeutendste Programmiersprache, die je geschaffen wurde«
— Alan Kay, „on Lisp“

Als McCarthy in den späten 1950er Jahren Lisp entwickelte, unterschied sich die Sprache radikal von bestehenden Sprachen, deren wichtigste war .
Lisp verkörperte neun neue Ideen:
1. Bedingte Aussagen (Conditionals). Bedingte Aussagen sind if-then-else-Konstruktionen. Heute betrachten wir sie als selbstverständlich. Sie wurden McCarthy während der Entwicklung von Lisp erfunden. (Fortran hatte zu dieser Zeit nur goto-Anweisungen, die eng mit der gesteuerten Abzweigung auf der zugrunde liegenden Hardware verbunden waren.) McCarthy brachte die bedingten Aussagen ins Algol ein, wo sie sich dann auf andere Sprachen verbreiteten.
2. Funktionstypen (A function type). In Lisp sind Funktionen Erstklassige Objekte – sie sind Datentypen, genauso wie Zahlen, Zeichenfolgen usw., und haben eine literale Darstellung, können in Variablen gespeichert und als Argumente übergeben werden usw.
3. Rekursion (Recursion). Rekursion existierte natürlich als mathematische Konzepte lange vor Lisp, aber Lisp war die erste Programmiersprache, die sie unterstützte. (Das könnte implizieren, dass Funktionen als Erstklassige Objekte konzipiert wurden.)
4. Ein neues Konzept von Variablen (A new concept of variables). In Lisp sind alle Variablen effektive Zeiger. Werte gehören zu den Typen und nicht zu den Variablen, und die Zuweisung oder Bindung von Variablen bedeutet das Kopieren von Zeigern, und nicht das, auf was sie zeigen.
5. Automatische Speicherverwaltung (Garbage-collection).
6. Programme bestehen aus Ausdrücken (Programs composed of expressions). Programme in Lisp sind Ausdrucksbaum, 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“ von „Anweisungen“ unterscheiden.
Es war nur natürlich, so eine Unterscheidung in Fortran zu haben, da die Sprache linear orientiert war (was nicht überraschend ist für eine Sprache, deren Eingabeformat eine Lochkarte war). Man konnte keine verschachtelten Anweisungen haben. Und solange man mathematische Ausdrücke benötigte, um zu arbeiten, war es nicht sinnvoll, dass noch etwas anderes einen Wert zurückgibt, da es möglicherweise nichts gab, das auf eine Rückgabe wartete.
Die Einschränkungen wurden mit dem Aufkommen block-strukturierter Sprachen aufgehoben, aber zu diesem Zeitpunkt war es bereits zu spät. Der Unterschied zwischen Ausdrücken und Aussagen hatte sich bereits gefestigt. Er zog von Fortran zu Algol und dann zu deren Nachkommen weiter.
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. Symboldatentyp (A symbol type). Symbole unterscheiden sich von Zeichenfolgen, in diesem Fall können Sie auf Gleichheit prüfen, indem Sie die Zeiger vergleichen.
8. Notation für Code (A notation for code) unter Verwendung von Baumstrukturen 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 der Lesezeit kompilieren oder ausführen, oder Code lesen oder ausführen, während Sie kompilieren, oder Code während der Ausführungszeit lesen oder kompilieren.
Das Ausführen von Code während der Lesezeit ermöglicht Benutzern, die Syntax von Lisp neu zu programmieren; das Ausführen von Code während der Kompilierung ist die Grundlage für Makros; das Kompilieren zur Laufzeit ist die Grundlage dafür, Lisp als Erweiterungssprache in Programmen wie Emacs zu verwenden; und schließlich ermöglicht das Lesen zur Laufzeit Programmen, über s-Ausdrücke zu interagieren, eine Idee, die kürzlich in XML neu erfunden wurde.
Fazit
Als Lisp erfunden wurde, waren all diese Ideen weit entfernt von den üblichen Programmierpraktiken, die durch die Hardware, die Ende der 1950er Jahre verfügbar war, diktiert wurden.
Im Laufe der Zeit hat sich die Standardsprache, verkörpert im Erfolg beliebter Sprachen, schrittweise in Richtung Lisp entwickelt. Die Punkte 1-5 sind jetzt weit verbreitet. Punkt 6 beginnt, im Mainstream aufzutauchen. In Python gibt es in gewisser Form Punkt 7, obwohl die passende Syntax fehlt. Punkt 8, der (mit Punkt 9) Makros in Lisp ermöglicht, existiert immer noch nur in Lisp, möglicherweise weil (a) er diese Klammern oder etwas ebenso Schlechtes erfordert, und (b) wenn Sie diese letzte Kraftsteigerung hinzufügen, können Sie nicht mehr behaupten, dass Sie eine neue Sprache erfunden haben, sondern nur einen neuen Dialekt von Lisp entwickelt haben; -)
Obwohl es für moderne Programmierer hilfreich ist, ist es seltsam, Lisp aus der Perspektive seiner Unterschiede zu zufälligen Verfahren in anderen Sprachen zu beschreiben. Vielleicht ist das nicht das, was McCarthy im Sinn hatte. Lisp wurde nicht entworfen, um die Fehler von Fortran zu korrigieren; es entstand vielmehr als Nebenprodukt eines Versuchs .
Quelle: habr.com
