Welche dieser alten Kritikpunkte an gewöhnlichem Lispus gelten heute noch?

29

In A Critique of Common Lisp, geschrieben von Rodney A. Brooks und Richard P. Gabriel aus Stanford im Jahr 1984, werden einige Entwurfsentscheidungen des Normalisierungsausschusses von Common Lisp erörtert. Während der größte Teil der Diskussion gültig bleibt, gibt es zwei Aussagen, die sich auf die derzeit verfügbare Technologie beziehen und heute möglicherweise falsch sind.

Diese beiden Aussagen sind:

Zu viele Kosten der Sprache wurden mit der Ermahnung abgewiesen, dass 'jeder gute Compiler' sich um sie kümmern kann. Bisher hat noch niemand einen Compiler geschrieben, der einen Bruchteil der erwarteten Tricks ausführt - und wird dies wahrscheinlich auch nicht ohne großen Aufwand tun.

Da ich ein Anfänger oder sogar ein Lehrling von Common Lisp bin, kann ich nicht spezifischer sein als die Autoren. Sie scheinen zu behaupten, dass in verschiedene Aspekte der Sprache eine große Allgemeinheit und Flexibilität eingebaut wurde, was das Schreiben eines guten Compilers ziemlich schwierig macht.

In COMMON LISP wurde die Gleitkomma-Arithmetik etwas zu stark kontrolliert. Und obwohl das korrekte Verhalten eines Gleitkomma-intensiven Programms erreicht werden kann, kann die Leistung stark variieren.

Soweit ich weiß, scheint es möglich, effizienten numerischen Code in Common Lisp zu schreiben, aber es ist schwieriger als es sein muss.

Das war vor dreißig Jahren. Wie sollte ich diese Aussage heute betrachten, wenn ich bereit bin, Common-Lisp-Programme für eine der gemeinsamen Implementierungen freier Software (CLISP, SBCL et al.) Zu schreiben?

user40989
quelle
Gute Frage! Würde gerne von jemandem hören, der sich mit Common Lisp zu diesem Thema auskennt. Ich befürchte, dass sie immer noch gelten, basierend auf der offensichtlichen relativen Beliebtheit von Common Lisp heutzutage.
1
Fließkommazahlen sind schwer zu finden. Einige Sprachen geben ein strenges Modell vor und leiden unter Leistungseinbußen, andere verwenden ein lockeres Modell und sind schwer zu überlegen. Zum Beispiel ist es mir zu schwer, über einfache Gleitkommaprogramme in C # nachzudenken. Daher stehe ich gerne auf der Seite von Sprachdesignern, die strenge Gleitkommazahlen verwenden, auch wenn dies Leistung kostet.
CodesInChaos
2
Auf der anderen Seite implementiert moderne Hardware im Allgemeinen IEEE-Gleitkommazahlen, sodass ihr Verhalten wahrscheinlich vorhersehbarer ist als das der 1984 verfügbaren Implementierungen.
microtherion

Antworten:

31

Das Papier ist in vielerlei Hinsicht interessant.

Der interessanteste Teil ist dieser: Die Autoren fälschten das Papier von 1984 nur zwei Jahre später, 1986, selbst. Brooks und Gabriel entwickelten einen hochoptimierenden Lisp-Compiler und verkauften ihn mehrere Jahre kommerziell sehr erfolgreich: Lucid Common Lisp (PDF).

Die Wartung für diesen Lisp-Compiler ist weiterhin über LispWorks verfügbar : Es heißt jetzt Liquid Common Lisp .

Die Compiler-Optimierungen von Liquid CL sind in Kapitel 3 des Advanced User's Guide : Optimieren von Lisp-Programmen dokumentiert .

In Lucid CL wurden mehrere kommerzielle Anwendungen geschrieben und bereitgestellt. Beispielsweise wurde in meiner Heimatstadt das erste öffentliche Verkehrsinformationssystem für den HVV (Hamburger Verkehrsverbund) mit Lucid CL auf einer SUN SPARC-Station bereitgestellt. Es stand der Öffentlichkeit in Bahnhöfen über einen großen Touchscreen und im Callcenter zur Verfügung.

Lucid CL war erfolgreich, weil sein Compiler für den Produktionsmodus schnelle Common-Lisp-Anwendungen erstellte, hauptsächlich für Unix / RISC-Plattformen.

Brooks und Gabriel schreiben 1986 über Lucid Common Lisp:

Es wurde gezeigt, dass der dynamisch retargetable Compiler ein Mittel ist, mit dem eine einfache Kompilierung für eine Vielzahl von Lisp-Implementierungen durchgeführt werden kann. ein Mittel zum Portieren von Lisp-Systemen auf eine Vielzahl von Computern; und ein Tool zum Erzeugen von qualitativ hochwertigem und leistungsstarkem Code für eine Vielzahl von Computern aus einer gemeinsamen Quelle.

So hatten sie gerade das umgesetzt, was die A-Kritik von Common Lisp für schwierig oder unmöglich hielt.

Heutzutage führen die fortschrittlicheren Implementierungen eine Menge Optimierungen durch, aber die Hardware ist auch mehr als 1000 Mal schneller als 1984. Eine VAX 11/780 verfügte damals über ein MIPS (Millionen Anweisungen pro Sekunde) und eine Lisp-Maschine befand sich ebenfalls in dieser Bereich. Ein Motorola 68000 hatte eine Taktrate von 8 MHz.

Die Kritik an der Gleitkomma-Leistung und der allgemein variierenden Leistung ist immer noch gültig, aber dies spiegelt die Wahl der Implementierer wider. Einige Implementierungen wurden nicht als Hochleistungscompiler entwickelt. Ihr Hauptaugenmerk könnte auf Portabilität, Kompaktheit oder etwas anderem liegen und daher haben sie unterschiedliche Implementierungsziele.

Als Benutzer / Entwickler ist man nicht gezwungen, portablen Code zu schreiben und alle über zehn derzeit unterstützten Common Lisp-Systeme zu verwenden. Verwenden Sie die Implementierung, die für das Anwendungsproblem am besten geeignet ist.

Rainer Joswig
quelle
Ihre Antwort ist sehr präzise und detailliert, es verdient auf jeden Fall die Prämie!
user40989
1
"Hochoptimiert" bedeutet nicht unbedingt, dass der Compiler "clever genug" ist. Die Worte "ausreichend klug" werfen die Frage auf "zu welchem ​​Zweck?". Es gibt immer noch Anwendungen (hauptsächlich für sehr eingeschränkte Embedded-Plattformen), die Sie nicht in Common Lisp schreiben würden, da die Optimierung immer noch nicht alle Laufzeit-Overheads aus dynamischer Typisierung, Heap-Zuweisung und Garbage-Collection entfernen kann. Natürlich ist Common Lisp in diesem "Versagen" keineswegs einzigartig. In freier Wildbahn wurde noch keine Sprache beobachtet, die wirklich für absolut alles geeignet ist.
Steve314
@ Steve314: Klare CL-Ziele waren der Markt für große Lisp-basierte KI-Systeme, CAD-Systeme usw. auf Unix-Workstations und Servern. Lucid CL-Ziel waren keine eingebetteten Systeme. Lucid CL behebt den Laufzeit-Overhead bei dynamischer Typisierung, Heap-Zuweisung und vielen anderen Optimierungsbereichen - einschließlich eines performanten Garbage Collectors. Dennoch wird meistens GC benötigt. In der Regel werden bei der Anwendung spezielle Techniken verwendet, um ein Verbrauchen zu vermeiden und somit die GC-Rate zu verringern, z. B. Ressourcenpools.
Rainer Joswig
21

Als dieses Papier 1984 geschrieben wurde, war ein Computer mit 1 Megabyte RAM und einer 20-Megabyte-Festplatte, der auf Ihrem Schreibtisch sitzen kann, eine große Sache. Natürlich werden Streitigkeiten über die Praktikabilität einer Sprache auf so hohem Niveau entstehen, wie Lisp es mit spartanischer Hardware zu tun hat. Die Fortschritte sowohl in der Hardware als auch in der Compilertechnologie, die seitdem stattgefunden haben, haben das Schreiben und Ausführen von Lisp-Programmen ungeachtet etwaiger numerischer Ineffizienzen in der Sprache erheblich vereinfacht.

Programmierer tauschen oft Recheneffizienz gegen Programmiereffizienz. Lisp kann eine langsame Sprache sein (in einigen Implementierungen, aber auch in anderen Sprachen), hat aber auch den Ruf, schnell entwickelt zu werden, und viele Programme erfordern keine hochoptimierte Infrastruktur, um eine angemessene Leistung zu erzielen.

Die Wahl der Lisp-Implementierung kann das Leistungsprofil Ihrer Programme stark beeinflussen. Beispielsweise gibt CLISP ohne weiteres zu, dass "Wenn Ihr Code stark numerisch ist, bevorzugen Sie möglicherweise CMUCL." In mehreren modernen Lisp- (und Scheme-) Implementierungen können Sie numerische Typhinweise angeben, um die numerische Leistung zu verbessern.

Kurz gesagt, die Situation ist heute viel besser als damals.

Robert Harvey
quelle