Was Lisp so besonders machte

«Die größte Programmiersprache, die je geschaffen wurde«
— Alan Kay, „auf Lisp“

Was Lisp so besonders machte

Als McCarthy Ende der 1950er Jahre Lisp entwickelte, unterschied es sich radikal von bestehenden Sprachen, von denen die wichtigste die war Fortran.

Lisp stellte neun neue Ideen vor:

1. Bedingungen. Bedingte Anweisungen sind Wenn-Dann-Sonst-Konstruktionen. Jetzt halten wir sie für selbstverständlich. Sie waren erfunden McCarthy während der Entwicklung von Lisp. (Fortran verfügte damals nur über goto-Anweisungen, die eng mit einer Verzweigungsanweisung auf der zugrunde liegenden Hardware verknüpft waren.) Während seiner Zeit im Algol-Komitee steuerte McCarthy Bedingungen zu Algol bei, von wo aus sie sich auf andere Sprachen ausbreiteten.

2. Ein Funktionstyp. In Lisp sind Funktionen erstklassige Objekte – sie sind ein Datentyp, genau wie Zahlen, Strings usw., und haben eine wörtliche Darstellung, können in Variablen gespeichert werden, können als Argumente übergeben werden usw.

3. Rekursion. Rekursion existierte als mathematisches Konzept natürlich schon vor Lisp, aber Lisp war die erste Programmiersprache, die sie unterstützte. (Dies ist möglicherweise impliziert, wenn Funktionen als erstklassige Objekte erstellt werden.)

4. Ein neues Konzept von Variablen. In Lisp sind alle Variablen effektive Zeiger. Werte sind das, was Typen haben, nicht Variablen, und das Zuweisen oder Binden von Variablen bedeutet, Zeiger zu kopieren, nicht das, worauf sie zeigen.

5. Müllabfuhr.

6. Aus Ausdrücken zusammengesetzte 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.

Diese Unterscheidung war in Fortran selbstverständlich, da die Sprache zeilenorientiert war (keine Überraschung für eine Sprache, deren Eingabeformat eine Lochkarte war). Sie konnten keine verschachtelten Anweisungen haben. Und solange man mathematische Ausdrücke brauchte, um zu funktionieren, hatte es keinen Sinn, irgendetwas anderes einen Wert zurückgeben zu lassen, weil möglicherweise gar nichts darauf wartete, zurückgegeben zu werden.

Die Beschränkungen wurden mit dem Aufkommen blockstrukturierter Sprachen aufgehoben, aber da war es zu spät. Die Unterscheidung zwischen Ausdrücken und Aussagen wurde bereits festgelegt. Es ging von Fortran auf Algol und weiter auf ihre Nachkommen über.

Wenn eine Sprache ausschließlich aus Ausdrücken besteht, können Sie Ausdrücke nach Ihren Wünschen verfassen. Sie können entweder schreiben (unter Verwendung der Syntax Arc)

(if foo (= x 1) (= x 2))

oder

(= x (if foo 1 2))

7. Ein Symboltyp. Zeichen unterscheiden sich von Zeichenfolgen. In diesem Fall können Sie die Gleichheit durch Vergleichen von Zeigern überprüfen.

8. Eine Notation für Code Verwendung von Symbolbäumen.

9. Die gesamte Sprache ist immer verfügbar. Es gibt keinen offensichtlichen Unterschied zwischen Lesezeit, Kompilierzeit und Laufzeit. Sie können Code kompilieren oder ausführen, während Sie lesen, oder Code lesen oder ausführen, während Sie kompilieren, oder Code lesen oder kompilieren, während er ausgeführt wird.

Durch das Ausführen von Code beim Lesen können Benutzer die Syntax von Lisp neu programmieren. Das Ausführen von Code zur Kompilierungszeit 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 Laufzeitlesen Programmen die Kommunikation mithilfe von S-Ausdrücken, eine Idee, die kürzlich in XML neu erfunden wurde.

Abschluss

Als Lisp zum ersten Mal erfunden wurde, waren diese Ideen weit entfernt von den herkömmlichen Programmierpraktiken, die durch die in den späten 1950er Jahren verfügbare Hardware vorgegeben waren.

Im Laufe der Zeit entwickelte sich die Standardsprache, verkörpert durch den Erfolg populärer Sprachen, allmählich zu Lisp. Die Punkte 1-5 werden mittlerweile weitgehend akzeptiert. Punkt 6 beginnt im Mainstream aufzutauchen. In Python gibt es in irgendeiner Form eine Klausel 7, obwohl es keine geeignete Syntax gibt. 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 Schlechtes erfordert und (b) wenn Sie diese neueste Leistungssteigerung hinzufügen, können Sie dies tun behaupten nicht mehr, eine neue Sprache erfunden zu haben, sondern nur noch, einen neuen Lisp-Dialekt entwickelt zu haben; -)

Obwohl dies für moderne Programmierer nützlich ist, ist es seltsam, Lisp im Hinblick auf seinen Unterschied zu den in anderen Sprachen verwendeten Zufallstechniken zu beschreiben. Das war vielleicht nicht das, was McCarthy dachte. Lisp wurde nicht entwickelt, um die Fehler von Fortran zu korrigieren; es schien eher ein Nebenprodukt des Versuchs zu sein Berechnungen axiomatisieren.

Source: habr.com

Kommentar hinzufügen