it-swarm.dev

Warum ist LISP nicht weiter verbreitet?

Ich fange an, Schema durch die SICP-Videos zu lernen, und ich möchte als nächstes zu Common LISP wechseln.

Die Sprache scheint sehr interessant zu sein, und die meisten Leute, die Bücher darüber schreiben, befürworten, dass sie eine beispiellose Ausdruckskraft hat. CL scheint eine anständige Standardbibliothek zu haben.

Warum ist LISP nicht weiter verbreitet? Wenn es wirklich so mächtig ist, sollten die Leute es überall verwenden, aber stattdessen ist es fast unmöglich, beispielsweise LISP-Stellenanzeigen zu finden.

Ich hoffe, es ist nicht nur die Klammer, da sie nach kurzer Zeit kein großes Problem mehr sind.

50
Andrea

Ausdruckskraft ist nicht immer ein positives Sprachmerkmal in einem Unternehmensumfeld. Java ist zum Teil deshalb sehr beliebt, weil es leicht zu erlernen, leicht zu schreiben und leicht zu lesen ist. Mittelmäßige Programmierer können in Java immer noch sehr produktiv sein, selbst wenn ihr Code wortreich und unelegant ist.

Darüber hinaus ist es leicht, Ausdruckssprachen zu missbrauchen. Ein Experte Java Programmierer kann schlecht geschriebenen Code schnell umgestalten. Je ausdrucksvoller die Sprache ist, desto schwieriger wird es, schrecklichen Code zu verstehen und umzugestalten. LISP-Makros sind ein gutes Beispiel. Makros sind leistungsstarke Werkzeuge auf der rechten Seite Hände. In den falschen Händen können sie zu verwirrendem und schwer zu debuggendem Code führen.

LISP ist eine riskante Wahl für die Geschäftsleitung. Wenn etwas schief geht, wird niemand das Management beschuldigen, eine beliebte objektorientierte Sprache ausgewählt zu haben, die von einem großen Unternehmen wie Oracle oder Microsoft unterstützt wird. Es ist viel einfacher, Programmierer mit Erfahrung in beliebten, leicht zu erlernenden Sprachen einzustellen.

Selbst fortschrittliche Unternehmen, die bereit sind, eine leistungsfähigere Sprache zu verwenden, entscheiden sich normalerweise nicht für LISP. Dies liegt daran, dass viele der neueren Sprachen versuchen, Kompromisse einzugehen, indem sie leistungsstarke Funktionen von LISP ausleihen und gleichzeitig für die Massen leicht zu erlernen sind. Scala und Ruby folgen diesem Modell. Schlechte Programmierer können sie schnell erkennen und weiterhin denselben mittelmäßigen Code schreiben, den sie in Java erstellt haben. Gute Programmierer können dies ausnutzen der fortgeschritteneren Funktionen, um schönen Code zu schreiben.

Klammern sind nicht das Problem. Haskell ist eine unglaublich mächtige und ausdrucksstarke Sprache mit einer Syntax ähnlich Python oder Ruby und es hat nicht) Es wurde aus den gleichen Gründen wie LISP nicht weit verbreitet.

Trotz alledem hoffe ich ...

Clojure hat die Chance, populär zu werden. Es läuft auf der JVM, hat eine großartige Interaktion mit Java und vereinfacht die gleichzeitige Programmierung erheblich. Dies sind alles wichtige Dinge für viele Unternehmen.

* Dies ist meine Perspektive als professioneller JVM-Programmierer mit Erfahrung in Java, Clojure, JRuby und Scala.

70
dbyrne

Warum ist LISP nicht weiter verbreitet? Wenn es wirklich so mächtig ist, sollten die Leute es überall benutzen,

Wenn Sie glauben, dass Sprachen aufgrund ihrer technischen Vorzüge ausgewählt werden, werden Sie eine seelenzerstörende Enttäuschung erleben.

Solche Entscheidungen werden basierend auf Strippers And Steaks getroffen. Microsoft kann sie sich leisten. Oracle kann. Sun gab so viel Geld aus, um zu hypen Java, dass sie bankrott gingen. Zweimal. Eine dezentrale, heterogene, freiwillige Community kann damit nicht konkurrieren.

stattdessen ist es fast unmöglich, beispielsweise LISP-Stellenanzeigen zu finden.

Lustigerweise sagen die LISP-Unternehmen genau das Gegenteil: Sie haben ständig offene Stellen, können aber nicht genug Leute finden, um sie zu besetzen. (Gleiches gilt für Haskell, ML, O'Caml, Forth, Smalltalk, ...)

17
Jörg W Mittag

Ich habe keine Erfahrung in der Arbeit für ein echtes Unternehmen, aber ich weiß, warum es für mich schwierig war, LISP zu verwenden.

Dies erinnert mich zunächst an diesen Blog-Beitrag: http://steve-yegge.blogspot.com/2006/04/LISP-is-not-acceptable-LISP.html

Das Hauptproblem, das ich mit LISP habe, ist die Frage "Welches LISP". Normalerweise arbeite ich unter Linux als Hauptplattform, aber die Dinge, die ich mache, müssen mit Windows kompatibel sein. Das heißt, wenn ich eine zu evaluierende Technologie evaluiere, muss dies mir das Leben erleichtern, wenn ich an zwei radikal unterschiedlichen Betriebssystemen arbeite. Ich mag diese Anforderung nicht, aber sie für ein reales Projekt zu verwenden, ist eine Anforderung. Jetzt verwende ich Sprachen, die unter Windows keine sehr gute Unterstützung für meine persönlichen Nebenprojekte bieten. Da ich jedoch nie die Möglichkeit habe, ein großes Softwareprojekt darin zu schreiben, habe ich nicht die erforderliche Erfahrung.

Als ich nun versuchte, eine funktionale Sprache zu lernen, wollte ich unbedingt Common LISP lernen. Es schien das Richtige zu sein. Ich habe angefangen, Practical Common LISP als Ausgangspunkt zu lesen, da ich die integrierten Funktionen wirklich nicht kannte und ein Projekt brauchte, an dem ich in LISP arbeiten konnte. S-Ausdrücke waren schön und einfach. Alle diese Klammern waren unglaublich schön für mich, da es als Tag klar war, was genau im Code geschah.

Also versuche ich mein erstes Programm in LISP außerhalb des Buches zu schreiben. Ich wollte ein Befehlszeilentool, das Codezeilen zählt und triviale Zeilen aus der Codezahl entfernt. Nicht das nützlichste Werkzeug, aber es macht Spaß. Es beinhaltet Dateizugriff, ein bisschen Parsen und Zählen. Ich hatte das gleiche Tool in Python ungefähr eine Woche zuvor implementiert).

Ich muss auf Befehlszeilenargumente zugreifen. Dann erfahre ich, dass es keinen Standardweg gibt, um Befehlszeilenargumente abzurufen. Sie sind alle nicht standardmäßige Funktionen. Es ist überhaupt nicht plattformübergreifend. Von da an wird es meistens nur noch schlimmer, da in der Sprache nicht viele Bibliotheken eingebaut sind. Am Ende wechselte ich zu Haskell und kam nicht weit in Common LISP (daher sind meine Beschwerden möglicherweise nicht einmal gültig).

Diese Art von nicht standardmäßigen Dingen war in der Vergangenheit immer ein Schmerz für mich. C++ hat das gleiche Problem, aber mit Bibliotheken wie Boost können Sie diese Schwachstellen umgehen.

Es hilft auch nicht, dass die LISP-Syntax für alles andere als S-Ausdrücke etwas hässlich ist.

9
jsternberg

IMO, es liegt hauptsächlich an:

  • Schlechte Bibliotheksunterstützung. Sicher, es gibt jetzt Quicklisp, was die Installation von Bibliotheken vereinfacht, aber es kompensiert nicht, dass sie immer noch ziemlich wenige sind, und einige sind schlecht dokumentiert oder nicht sehr gut gepflegt. Im Vergleich zu Python besteht eine gute Chance, dass beim Schreiben einer nicht trivialen LISP-Anwendung (unabhängig vom jeweiligen Dialekt) mindestens ein oder zwei Räder neu erfunden werden müssen.
  • Mangelnde Vertrautheit mit dem Modell der Entwicklungswerkzeuge. Die meisten Leute, die ich kenne, sind ziemlich eingeschüchtert, weil sie SLIME und Emacs verwenden müssen, was für Leute, die an Eclipse und Visual Studio gewöhnt sind, verständlich ist. Es gibt zwei Eclipse-Plugins, ich glaube, ich habe erst vor ein paar Jahren eines davon ausprobiert und es war ziemlich fehlerhaft. Das gesamte LISP-Ökosystem scheint zwischen den Tagen, als es Teil eines vollwertigen LISP-laufenden Systems war, und dem modernen Standard einer anderen Sprache festgefahren zu sein. Das Erlernen von LISP beschränkt sich nicht nur auf das Erlernen einer neuen Sprache. Sie müssen auch eine völlig andere Arbeits- und Denkweise erlernen. Wenn Sie dies als Hobby tun, ist dies in Ordnung. Es ist jedoch fraglich, ob es sich lohnt, es in einer Sprache zu tun Geschäft.

Die Dinge sehen jedoch etwas besser aus, besonders wenn Clojure in der Nähe ist.

8
donkey_lz

Ich habe LISP vor einer Milliarde Jahren im College gelernt.

LISP eignet sich wie FORTH hervorragend für die Logik. Bei der meisten Programmierung geht es jedoch nicht um Logik, sondern darum, Daten auf langweilige mechanische Weise zu manipulieren. Zum Beispiel gibt es zu der Zeit keine Möglichkeit, die numerische Ausgabe richtig zu rechtfertigen.

Bei LISP geht es um verschachtelte Funktionen, und die Leute denken einfach nicht so. Sie denken in Bezug auf DO A, B, C, D, dann E. Nicht A, was B und C beinhaltet, dann D und E. Dies beinhaltet eine Art Parallelität, die verwirrend ist. Mit Ausnahme vordefinierter Aufgaben wie "Einkommensteuererklärung einreichen" denken die Menschen nicht gleichzeitig, sondern nacheinander. Deshalb dominieren heute prozedurale Sprachen.

Infolgedessen kann produraler Code liks Java und C können leicht ins Englische übersetzt werden. LISP-Code kann nicht; keine menschliche Sprache ist auf diese Weise strukturiert.

Es ist also großartig für die Problemlösung, aber die Problemlösung ist bei der Programmierung nicht sehr wichtig. Dateneingabe, Validierung, Ausgabeformatierung, bei denen LISP furchtbar schwach war.

5
Andy Canfield

Ich denke, ein Problem mit LISP, das noch nicht erwähnt wurde, ist, dass es für einen mittelmäßigen oder unerfahrenen Programmierer (wie ich selbst, gebe ich frei zu) schwierig sein kann zu sehen, wie Sie LISP-Code in ein großes Programm verwandeln. Es ist leicht zu schreiben, aber schwer zu archivieren. Ich denke nicht, dass eines der Konzepte besonders schwierig ist, aber die DIY-Mentalität ist so stark, dass ich oft ratlos bin, wo ich überhaupt anfangen soll.

Mit einer OOP Sprache wie Java oder C #) können Sie das Typsystem verwenden, um sich auf ein funktionierendes Modell vorzubereiten und dieses auszubauen. Mit LISP (oder Lua oder Javascript) gibt es die Vorstellung, dass Sie rausgehen und es tun können, wie Sie wollen. Wenn Sie OOP wollen, machen Sie einfach Ihr eigenes OOP System! Außer Ihr eigenes System OOP oder das Erlernen eines anderen ist eine neue Barriere neben der Sprache, bevor Sie verwendbare Programme erhalten. Außerdem habe ich immer das Gefühl, dass das OOP in LISP oder Lua nicht wirklich da ist, wie ich könnte es einfach ignorieren, wenn ich es wirklich wollte, also was ist der Sinn?

Kurz gesagt, ich denke, das Programmieren in LISP erfordert viel Disziplin, und das ist sehr schwer zu bekommen. Stark typisierte Sprachen und OOP Sprachen) bieten beide eine Art eingebaute Disziplin, sodass der Programmierer seine begrenzten Reserven auf das Beenden von Projekten konzentrieren kann, anstatt die Sprache zu optimieren.

EDIT: Als Analogie, die mich gerade beeindruckt hat, ist es so, als müssten Sie Holzarbeiten erledigen und zwei Leute bieten Ihnen ihre Werkzeugkästen an. Die Werkzeuge einer Person sind irgendwie mies, würden aber im Grunde genommen die Arbeit mit ein wenig Aufwand erledigen. Die andere Person hat einen großen Behälter mit Teilen, verspricht jedoch, dass Sie diese Teile kombinieren können, um die besten Werkzeuge zu erhalten, die Sie jemals verwendet haben, die perfekt zu Ihrem Griff passen und von bester Qualität sind. Sie müssen sie nur zuerst bauen.

5
CodexArcanum

Ich habe mich schon lange gefragt und bin sogar zu LISP-Konferenzen gegangen, um zu verstehen, was diese "dunkle Seite" von LISP ist, die alle davon abhält, sie zu übernehmen.

Ich habe keine vollständige anständige Antwort gefunden.

Unwissenheit mag der Grund für die fehlende Popularität sein, aber was mich mehr verwundert, ist, dass selbst wer LISP mit Sicherheit kennt (zum Beispiel Google - Peter Norvig arbeitet für sie), es nicht verwendet.

Die einzige teilweise Erklärung, die ich finde, ist, dass die meisten großartigen LISP-Ideen mittlerweile alltäglich sind. Die einzige wirklich wichtige fehlende (eine äußerst wichtige IMO) ist die einfache Metaprogrammierung.

Leider sehe ich keine einfache Möglichkeit, dieses Konzept für andere Sprachen zu adsorbieren, da die Metaprogrammierung für Nizza eine homoikonische und reguläre Sprache erfordert (ich spreche von allgemeiner Metaprogrammierung, nicht von der heruntergekommenen Nur-Vorlagen-Version). Mit anderen Worten, es erfordert grundsätzlich den LISP-Ansatz für die Syntax: Code ist Daten und Daten sind Code. Das Schreiben von Code in einer syntaxreichen Sprache, die ein AST manipuliert), ist schwieriger, da Sie zwei Sprachen beherrschen müssen: das Schreiben des Codes und das Schreiben des AST. Dies ist besonders schwierig, wenn Sie AST ist fest und auch komplex und unregelmäßig mit vielen verschiedenen Knotentypen. LISP hat stattdessen eine einigermaßen regelmäßige (und erweiterbare!) AST und Sie bereits normal Code durch direktes Schreiben des AST.

Die Metaprogrammierung ist von Natur aus schwieriger (und die Meta-Metaprogrammierung noch mehr usw.), und die meisten Programmierer und Manager bevorzugen anscheinend nur die Antwort "Niemand würde das brauchen".

Ich finde es besonders traurig, dass "neue" Sprachen wie go bei Bedarf textbasierte Metaprogrammierung verwenden (externe Codegeneratoren schreiben Textdateien) und "magic" (dh der Compiler kann das tun, was die Programmierer nicht können). .

Ich denke, die Lösung für das Komplexitätsproblem sind mächtige Werkzeuge und Bildung. Der Trend geht offenbar stattdessen zu stumpfen Werkzeugen und es ist nicht vorhanden, das Problem vorzutäuschen.

2
6502

Es scheint, dass selbst CL keine sehr gute Bibliotheksunterstützung hat. Zumindest laut Leuten, die von LISP zu Python gewechselt sind:

http://www.redmountainsw.com/wordpress/archives/reddit-switches-from-LISP-to-python

Persönlich kenne ich ein Schema und spiele gerne damit, kann mir aber nicht vorstellen, ein nicht triviales Projekt in dieser Sprache zu machen.

1

Mächtig zu sein bedeutet nicht unbedingt eine weit verbreitete Verwendung. Haben Sie von dem Begriff "Für den allgemeinen Fall optimieren" gehört? Leider haben, wie viele vor der Mittelmäßigkeit gesagt haben, wenn sie konsequent versichert sind, viel besser für die Menschen als große Hits mit vielen Fehlern dazwischen.

Dies ist nicht nur bei LISP der Fall, sondern bei vielen Technologien. Perl ist eine gute Sache mit Unix-Textverarbeitungswerkzeugen, awk, sed und kann Ihnen Tage der Programmierung ersparen. Leider habe ich gesehen, dass Leute Tage damit verbringen, solche Aufgaben in anderen Tools schlecht zu erledigen, was mit diesen Tools in Minuten effizienter hätte erledigt werden können. Aber wenn man sein ganzes Leben in Eclipse verbringt, wird man den Wert dieser Dinge nie zu schätzen wissen. Sie können ein riesiges Programm mit Lesbarkeit und Wartbarkeit und all dem schreiben, aber was bringt es, ein solches Programm zu schreiben, ohne es zu schreiben, hätte die Arbeit leicht erledigen können.

Ein weiterer Aspekt beim Entwerfen von Werkzeugen in diesen Tagen, wie nützlich sie sofort sind, um sie direkt zur Lösung eines Problems zu verwenden. Sie können nicht etwas zu generisches erstellen und dann sagen, dass Sie all dies durch Bibliotheken und Frameworks absichern werden. Es ist ein wenig schwierig, die Dinge auf diese Weise zu klären. Ein gutes Werkzeug passt gut zur Umgebung und den Problemen, die damit verbunden sind. Deshalb bleiben Tools wie PHP, Perl und Awk trotz endlosem Trolling und Bashing weiterhin relevant, da sie zu nützlich sind, um sie wegzuwerfen, und oft viel Arbeit leisten als eine allgemeine Sprache mit vielen Bibliotheken und Frameworks.

Ebenso werden Sie feststellen, dass Sprachen wie Java/Python sehr gut sind und ich würde für bestimmte Aufgaben am besten sagen. Python ist besonders gut und leicht zu lernen und zu schreiben. Auch diese Sprachen sind wirklich gut, wenn Ihre Datenendpunkte Standard sind. Eine Art Datenbank oder XML oder Daten dieser Art. Grundsätzlich strukturierte Daten.

LISP wird noch lange da sein, aber nicht unbedingt weit verbreitet. Wie Sie sehen werden, hat jedes Werkzeug seine Nische. Und sie lösen bestimmte Probleme sofort sehr gut. Ich denke und ich bin sicher, dass LISP in Bereichen und Problemen, für die es gut gelöst werden soll, gute Ergebnisse erzielt.

1
kamaal

Bei der Webentwicklung mit LISP-Dialekten kann es zu einem Henne-Ei-Problem kommen - da nur wenige Leute LISP verwenden, lassen Hosts es entweder nicht zu oder machen es nicht einfach, und weil es nicht einfach ist, gibt es nur wenige Leute benutze es. Tatsächlich kann es jedoch einfacher sein, LISP auf einem Host zum Laufen zu bringen, als Sie vielleicht denken, selbst wenn es etwas mehr Arbeit erfordert als der Standarddienst PHP Service. Ich habe es kürzlich bekommen guile Scheme Apps funktionieren hier mit nur wenig Aufwand.

1
gcbenison

IMO, es ist meistens eine Frage des schlechten Timings: LISP war alt (und fast per Definition nicht mehr aufregend), lange bevor es für die meisten Menschen oder Anwendungen praktisch wurde. Clojure (zum Beispiel) hat eine viel bessere Chance. Sein Erfolg wird weit mehr davon abhängen, als neu, modisch und cool wahrgenommen zu werden, als alles, was so praktisch ist wie die Zusammenarbeit mit Java (und alles andere, was auf der JVM läuft).

0
Jerry Coffin