Ich fange an, anhand der SICP-Videos Scheme zu lernen, und möchte als nächstes zu Common Lisp übergehen.
Die Sprache scheint sehr interessant zu sein, und die meisten Leute, die Bücher darüber schreiben, befürworten, dass sie eine unvergleichliche 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 benutzen, aber stattdessen ist es fast unmöglich, Lisp-Stellenanzeigen zu finden.
Ich hoffe, es ist nicht nur die Klammer, da sie nach einer Weile kein großes Problem mehr sind.
programming-languages
lisp
usage
Andrea
quelle
quelle
Antworten:
Ausdruckskraft ist nicht immer ein positives Sprachmerkmal in einem Unternehmensumfeld. Java ist 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, expressive Sprachen zu missbrauchen. Ein erfahrener Java-Programmierer kann schlecht geschriebenen Code schnell umgestalten. Je ausdrucksvoller die Sprache, desto schwieriger wird es, schrecklichen Code zu verstehen und umzugestalten. LISP-Makros sind ein gutes Beispiel. Makros sind mächtige Werkzeuge in den richtigen Händen. In den falschen Händen können sie zu verwirrendem und schwer zu debuggendem Code führen.
LISP ist eine riskante Wahl für Führungskräfte. Wenn etwas schief geht, gibt niemand dem Management die Schuld, eine beliebte objektorientierte Sprache gewählt zu haben, die von einem großen Unternehmen wie Oracle oder Microsoft unterstützt wird. Es ist viel einfacher, Programmierer mit Erfahrung in populären, leicht zu erlernenden Sprachen einzustellen.
Selbst fortschrittliche Unternehmen, die eine leistungsfähigere Sprache verwenden möchten, entscheiden sich normalerweise nicht für LISP. Dies liegt daran, dass viele der neueren Sprachen versuchen, Kompromisse einzugehen, indem sie leistungsstarke Funktionen von LISP entlehnen und gleichzeitig für die breite Masse leicht zu erlernen sind. Scala und Ruby folgen diesem Modell. Schlechte Programmierer können sie schnell abrufen und weiterhin denselben mittelmäßigen Code schreiben, den sie in Java geschrieben haben. Gute Programmierer können die erweiterten Funktionen nutzen, um schönen Code zu schreiben.
Klammern sind nicht das Problem. Haskell ist eine unglaublich leistungsfähige und ausdrucksstarke Sprache mit einer ähnlichen Syntax wie Python oder Ruby und wurde aus den gleichen Gründen wie LISP nicht häufig verwendet.
Trotz alledem hoffe ich ...
Clojure hat die Chance, populär zu werden. Es läuft auf der JVM, arbeitet hervorragend mit Java zusammen 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.
quelle
Wenn Sie der Meinung sind, dass Sprachen aufgrund ihrer technischen Vorzüge ausgewählt wurden, werden Sie mit einer Enttäuschung konfrontiert, die Sie um den Verstand bringt.
Solche Entscheidungen werden basierend auf Strippers And Steaks getroffen . Microsoft kann sie sich leisten. Oracle kann. Sun gab so viel Geld für Java aus, dass sie bankrott gingen. Zweimal. Eine dezentrale, heterogene, freiwillige Gemeinschaft kann damit nicht konkurrieren.
Witzigerweise sagen die Lisp-Firmen 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, ...)
quelle
Ich habe keine Erfahrung in der Arbeit für ein echtes Unternehmen, aber ich weiß, warum es mir schwer gefallen ist, LISP anzuwenden.
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 "Welche Lisp" -Frage. Ich arbeite normalerweise unter Linux als Hauptplattform, aber die Dinge, die ich mache, müssen mit Windows kompatibel sein. Das heißt, wenn ich eine zu verwendende Technologie evaluiere, muss es mir das Leben erleichtern, wenn ich mit zwei völlig 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 nicht sehr gut unterstützt werden, für meine eigenen Nebenprojekte. Da ich jedoch nie die Möglichkeit habe, ein großes Softwareprojekt darin zu schreiben, habe ich nicht die erforderliche Erfahrung.
Als ich jetzt 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 klar war, was genau im Code vorging.
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 Codezählung entfernt. Nicht das nützlichste Werkzeug, aber es macht Spaß, es zu tun. Es beinhaltet Dateizugriff, ein bisschen Analysieren und Zählen. Ich hatte ungefähr eine Woche zuvor dasselbe Tool in Python implementiert.
Ich muss auf Befehlszeilenargumente zugreifen. Dann erfahre ich, dass es keine Standardmethode gibt, um Befehlszeilenargumente abzurufen. Sie sind alle nicht standardmäßige Funktionen. Es ist überhaupt nicht plattformübergreifend. Von da an wird es meistens nur schlimmer, da in der Sprache nicht viele Bibliotheken eingebaut sind. Am Ende bin ich zu Haskell gewechselt und bin nicht weit in Common Lisp vorgedrungen (daher sind meine Beschwerden möglicherweise nicht einmal gültig).
Diese Art von Nicht-Standard-Dingen hat mich in der Vergangenheit immer gequält. C ++ hat das gleiche Problem, aber mit Bibliotheken wie Boost können Sie diese Schwächen umgehen.
Es hilft auch nicht, dass die Lisp-Syntax für alles andere als S-Ausdrücke etwas hässlich ist.
quelle
IMO, es liegt hauptsächlich an:
Die Dinge sehen etwas besser aus, vor allem, wenn Clojure da ist.
quelle
Ich habe LISP vor einer Milliarde Jahren am College gelernt.
LISP ist wie FORTH großartig für Logik. Bei den meisten Programmen geht es jedoch nicht um Logik, sondern darum, Daten auf langweilige mechanische Weise zu manipulieren. Zum Beispiel gibt es zur Zeit keine Möglichkeit, die numerische Ausgabe richtig auszurichten.
In LISP geht es um verschachtelte Funktionen, und die Leute denken einfach nicht so. Sie denken in DO A, B, C, D, dann E. Nicht tun A, was B und C beinhaltet, dann D und E. Dies beinhaltet eine Art Nebenläufigkeit, die verwirrend ist. Abgesehen von vordefinierten Aufgaben wie "Einkommensteuererklärung einreichen" denken die Menschen nicht gleichzeitig, sondern nacheinander. Aus diesem Grund dominieren heute die Verfahrenssprachen.
Infolgedessen können Produral-Codes wie Java und C leicht ins Englische übersetzt werden. LISP-Code kann nicht; Keine menschliche Sprache ist so 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.
quelle
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 es selbst zugegeben habe) schwierig sein kann, zu sehen, wie Sie Lisp-Code in ein großes Programm verwandeln. Es ist einfach zu schreiben, aber schwer zu entwerfen. Ich denke nicht, dass eines der Konzepte besonders schwierig ist, aber die DIY-Mentalität ist so stark, dass ich oft nicht weiß, wo ich überhaupt anfangen soll.
Mit einer OOP-Sprache wie Java oder C # können Sie das Typsystem verwenden, um sich in Richtung eines Arbeitsmodells zu steigern und dieses aufzubauen. Mit Lisp (oder Lua oder Javascript für diese Angelegenheit) gibt es die Vorstellung, dass Sie rausgehen und es tun können, wie Sie wollen. Wenn Sie OOP möchten, erstellen Sie einfach Ihr eigenes OOP-System! Abgesehen davon, dass Sie Ihr eigenes OOP erstellen oder das eines anderen lernen, ist dies eine neue Barriere über der Sprache, bevor Sie brauchbare Programme erhalten. Außerdem habe ich immer das Gefühl, dass die OOP in Lisp oder Lua nicht wirklich da ist. Ich könnte sie einfach ignorieren, wenn ich es wirklich wollte. 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 integrierte Disziplin, sodass der Programmierer seine begrenzten Reserven auf das Beenden von Projekten konzentrieren kann, anstatt die Sprache zu optimieren.
EDIT: Als Analogie, die mir gerade aufgefallen ist, ist es, als müssten Sie Holzarbeiten erledigen und zwei Personen bieten Ihnen ihre Werkzeugkästen an. Die Werkzeuge einer Person sind irgendwie mies, würden aber im Grunde genommen die Arbeit mit ein wenig Mühe erledigen. Die andere Person hat einen großen Teilebehälter, 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.
quelle
Ich habe mich schon lange darüber gewundert und sogar auf Lisp-Konferenzen versucht zu verstehen, was diese "dunkle Seite" von Lisp ist, die alle davon abhält, es 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 mit Sicherheit etwas über Lisp weiß (zum Beispiel Google - Peter Norvig arbeitet für sie), es nicht benutzt.
Die einzige teilweise Erklärung, die mir einfällt, ist, dass die meisten großartigen Ideen von Lisp mittlerweile alltäglich sind. Die einzig wirklich wichtige fehlende (eine äußerst wichtige IMO) ist die Leichtigkeit der Metaprogrammierung.
Leider sehe ich keine einfache Möglichkeit, dieses Konzept für andere Sprachen zu adsorbieren, da die Metaprogrammierung eine homoikonische und reguläre Sprache erfordert (ich spreche von der allgemeinen Metaprogrammierung, nicht von der abgedrehten Nur-Template-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 einen 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 Ihr AST fest und auch komplex und unregelmäßig mit vielen verschiedenen Knotentypen ist. Lisp hat stattdessen einen einigermaßen regulären (und erweiterbaren!) AST und Sie codieren normalerweise bereits, indem Sie den AST direkt schreiben.
Die Metaprogrammierung ist von Natur aus schwieriger (und die Meta-Metaprogrammierung noch schwieriger), und die meisten Programmierer und Manager bevorzugen anscheinend nur die Antwort "Niemand würde das brauchen".
Besonders schade finde ich, dass "neue" Sprachen
go
letztendlich textbasierte Metaprogrammierung verwenden, wenn sie benötigt werden (externe Codegeneratoren, die Textdateien schreiben) und "Magie" (dh der Compiler kann das, was die Programmierer nicht können).Ich denke, die Lösung für das Komplexitätsproblem sind leistungsfähige Tools und Bildung. Der Trend geht offenbar stattdessen zu stumpfen Werkzeugen und so zu tun, als sei das Problem nicht vorhanden.
quelle
Es scheint, dass selbst CL keine sehr gute Bibliotheksunterstützung hat. Zumindest nach 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.
quelle
Mächtig zu sein, bedeutet nicht notwendigerweise, dass es weit verbreitet ist. Kennen Sie den Begriff "Für den alltäglichen Fall optimieren"? Leider haben schon viele gesagt, dass Mittelmäßigkeit, wenn sie konsequent versichert wird, für Menschen viel besser ist als große Hits mit vielen Misserfolgen dazwischen.
Dies ist nicht nur bei Lispeln der Fall, sondern bei vielen Technologien. Ein guter Touch über die Unix-Textverarbeitungswerkzeuge awk, sed und perl erspart Ihnen Tage des Programmierens. Leider habe ich gesehen, dass die Leute Tage damit verbracht haben, solche Aufgaben in anderen Werkzeugen schlecht auszuführen, was mit diesen Werkzeugen in wenigen Minuten effizienter hätte erledigt werden können. Aber wenn man sein ganzes Leben in einer Sonnenfinsternis verbringt, wird man den Wert dieser Dinge niemals zu schätzen wissen. Sie schreiben vielleicht ein riesiges Programm mit Lesbarkeit und Wartbarkeit und all dem, aber was bringt es, ein solches Programm zu schreiben, ohne es zu schreiben?
Ein weiterer Aspekt beim Entwerfen von Werkzeugen heutzutage ist, wie nützlich sie sind, um sie direkt zur Lösung eines Problems zu verwenden. Sie können nicht zu generisch bauen und dann sagen, Sie werden das alles durch Bibliotheken und Frameworks absichern. Es ist ein wenig schwierig, die Dinge auf diese Weise zu lösen. Ein gutes Werkzeug passt sich gut der Umgebung und den damit verbundenen Problemen an. Aus diesem Grund bleiben Tools wie PHP, Perl und AWK trotz endlosem Trolling und Bashing weiterhin relevant, da sie zu nützlich sind, um sie wegzuwerfen, und oftmals viel Arbeit leisten als eine allgemeine Sprache mit vielen eingeschraubten Bibliotheken und Frameworks.
In ähnlicher Weise werden Sie feststellen, dass Sprachen wie Java / Python sehr gut sind und ich würde für bestimmte Aufgaben das Beste sagen. Besonders Python ist sehr 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 eigene Nische. Und sie lösen bestimmte Probleme sofort. Ich denke und ich bin mir sicher, dass Lispel in Bereichen und Problemen gut abschneidet, für die es eine gute Lösung sein soll.
quelle
Bei der Webentwicklung mit Lisp-Dialekten kann es ein kleines Problem mit Hühnchen und Eiern geben - weil nur wenige Leute Lisp verwenden, Hosts es entweder nicht zulassen oder nicht einfach machen und weil es nicht einfach ist, wenige Leute benutze es. Tatsächlich kann es einfacher sein, Lisp auf einem Host zum Laufen zu bringen, als Sie vielleicht denken, selbst wenn es etwas mehr Arbeit erfordert als der standardmäßige PHP-Service. Ich habe vor kurzem mit ein wenig Aufwand Guile- Scheme-Apps hier zum Laufen gebracht .
quelle
IMO, es ist meistens eine Frage des schlechten Timings: Lisp war alt (und per Definition nicht mehr aufregend), lange bevor es für die meisten Menschen oder Verwendungszwecke praktisch wurde. Clojure (zum Beispiel) hat eine viel bessere Chance. Ihr Erfolg wird wesentlich mehr davon abhängen, als neu, modisch und cool wahrgenommen zu werden, als alles, was so praktisch ist wie die Interoperation mit Java (und allem anderen, was auf der JVM läuft).
quelle