LISP (und Dialekte wie Scheme, Common LISP und Clojure) werden von der Industrie kaum unterstützt, obwohl sie recht gute Programmiersprachen sind. (Im Moment scheint es, als ob sie etwas an Bodenhaftung gewinnen).
Nun, dies hängt nicht direkt mit der Frage zusammen, welche würden Sie für ein Produktionsprogramm einen LISP-Dialekt verwenden? Was für ein Programm und warum? Verwendungen, wie sie in einen anderen Code integriert werden (z. B. C), sind ebenfalls enthalten. Beachten Sie jedoch, dass dies in Ihrer Antwort so gemeint ist. Breite Konzepte werden bevorzugt, aber auch spezifische Anwendungen sind in Ordnung.
Antworten:
Würden Sie einen LISP-Dialekt für ein Produktionsprogramm verwenden?
Absolut
Was für ein Programm und warum?
Lisp ist eine allgemeine dynamische Sprache. Heutzutage treten dieselben grundlegenden Schwierigkeiten auf wie bei anderen dynamischen Mehrzwecksprachen, die nicht von Microsoft veröffentlicht werden: native Threads, GUI-Integration, deterministische GC-Operationen und geringer Speicherbedarf.
Ich glaube, native Threads werden von LispWorks und SBCL erzielt. Möglicherweise andere? Ich habe nicht vollständig untersucht.
LispWorks und Franz Common Lisp - kommerzielle Produkte - integrieren sich erfolgreich in die Benutzeroberfläche. Ich habe nicht das Geld, um sie zu kaufen, ich weiß nicht, wie gut es funktioniert. Ich vermute, sie funktionieren ganz gut ...
Eine deterministische GC-Operation kann durchgeführt werden (sie wird in Java bis zu einem gewissen Grad erfolgreich durchgeführt), aber ich weiß nicht, ob vorhandene (gewartete) Lisp-Systeme einen Code dafür haben.
Ich glaube, dass einige Lisps einen geringen Speicherbedarf haben.
Mein grundlegender Punkt ist, dass Common Lisp technisch bereit ist, Produktionssysteme herzustellen. Und das tut es auch .
Die überwiegende Mehrheit der Entwickler ist verrückt nach dynamischen Sprachen, Makros, Klammern, fehlender bevorzugter IDE, schlechten Erfahrungen auf dem College, nicht vielen Jobs und nutzt diese dann nicht.
Persönlich würde ich von Grund auf in einer Teamumgebung ein vollwertiges Produktionssystem in Common Lisp aufbauen.
bearbeiten: Ich habe nicht wirklich geantwortet, warum Lisp im Gegensatz zu anderen Sprachen.
In meiner Lisp-Erfahrung - nicht signifikant, aber wesentlich mehr als "Hallo Welt" - fand ich, dass die Sprache nach den ersten "Argh new language" -Schmerzen äußerst brauchbar war. Der Großteil der Sprache passt auf eine sehr regelmäßige und ziemlich offensichtliche Weise zusammen, die ich nicht wirklich für andere Sprachen finde. Ein Teil davon ist das Zusammenführen von Ausdrücken und Anweisungen. Ein Teil davon ist der Kernlistendatentyp. Ein Teil davon ist das Typensystem. Ein Teil davon ist das Makrosystem. Verstehen Sie mich nicht falsch, es gibt Schmerzpunkte. Aber sie treten mich nicht so sehr ins Gesicht wie die Schmerzpunkte anderer Sprachen.
Ein vereinfachtes Beispiel ist Pythons Listenlängenroutine. Der Python-Ansatz besteht darin, anzurufen
len(mysequence)
. Aber wenn wir darüber nachdenken, ist eine Länge eine Eigenschaft einer Sequenz. Istmysequence.len()
also eine passendere Idee. Lisp hebt diese syntaktische Unterscheidung im Wesentlichen auf.(length thing)
ist sowohl die Funktionsaufrufsyntax als auch die Methodensyntax. Natürlich finden manche Leute das frustrierend und wollen den syntaktischen Unterschied. Ich hätte lieber die Regelmäßigkeit.edit2: Ich habe den Teil meiner MS-Arbeit, der auf dem Desktop läuft, auf Common Lisp konvertiert und es war bisher eine Freude, damit zu arbeiten.
quelle
Ich persönlich kenne Leute, die Lisp in Form von Clojure in einigen Investmentbanken und Startups in London einsetzen. Ich habe Clojure auch als primäre Entwicklungssprache für mein eigenes Startup ausgewählt, daher bin ich bereit, mein Geld dort unterzubringen, wo mein Mund ist :-)
Ich fand es eine sehr aufschlussreiche Erfahrung, Clojure im letzten Jahr zu lernen (nach viel Erfahrung mit Java und C #). Hauptgründe dafür sind:
Es scheint aus folgenden Gründen auch eine praktische Wahl für den realen Einsatz in der Produktion zu sein:
quelle
Ich würde LISP verwenden, wenn es die beste Wahl für den Job wäre. Nur ein paar Dinge, die die "beste Wahl" beeinflussen:
All diese Faktoren sind bei der Entscheidung zu berücksichtigen, ob LISP für ein Projekt geeignet ist. In der Geschäftswelt habe ich das noch nie erlebt.
quelle
Absolut. Paul Graham erklärt es gut .
quelle
Wo: Emacs ist eine reale Anwendung, die LISP verwendet.
Warum: Es war eine großartige Möglichkeit, die Zuordnung zwischen Tastenanschlag und Aktion auszudrücken. Es ist interpretiert und es ist schnell und es ist gut definiert und es ist einfach.
quelle
Sowohl Macsyma als auch Autocad basieren auf einem Lisp-Dialekt. Ich würde sie sowohl als "echte Welt" als auch als Emacs klassifizieren.
quelle
Ich würde es auf jeden Fall in Betracht ziehen. Speziell für neue Entwicklungsarbeiten, die ein gewisses Potenzial für paralleles Rechnen hatten. Das scheint ein Sweet Spot für diese Arten von funktionalen Sprachen zu sein.
quelle
Lisp ist eine der besten Möglichkeiten, um Compiler zu implementieren. Und da die Verwendung von DSLs und eDSLs jetzt zunimmt, wird Lisp immer wertvoller. Ich verwende einen Lisp-Dialekt für alle meine DSL-bezogenen Aufgaben.
quelle
Im Moment versuche ich, newLisp als Ersatz für Php auf meiner persönlichen Website über das Dragonfly- Framework zu verwenden. Wenn ich herausfinden kann, wie ich Apache zum Spielen bringen kann, benutze ich es (der eingebaute Webserver funktioniert sehr gut, aber ich würde lieber Apache durcharbeiten). Und wenn das passiert, werde ich newLisp überall dort verwenden, wo ich Php verwenden würde, weil ich Php nicht mag und ich newLisp mag.
Derzeit ist Clojure keine gute Wahl für Android-Apps, aber ich weiß, dass die Leute daran arbeiten. Wenn das herausgefunden wird, wäre das ein weiterer Ort, an dem ich einen Lisp-Dialekt für reale Anwendungen verwenden würde ... aber auch das liegt daran, dass ich Java einfach nicht mag.
Aber ehrlich gesagt, ich bevorzuge Ruby gegenüber Lisp ... aber dies ist hauptsächlich eine Frage der Gemeinschaft und der Dokumentation.
quelle
Ich habe in Common Lisp eine proprietäre kommerzielle Anwendung namens Tankan implementiert , die unter Microsoft Windows als native ausführbare Datei ausgeführt wird.
Es ist ein Programm, mit dem Sie sich darin üben können, japanische Kanji-Zeichen auswendig zu lernen.
Das Programm wird als HTTP-Hintergrundserver ausgeführt. Die Ausführung dieses Servers und das Navigieren zu seinen Seiten wird von einer winzigen Symbolanwendung für den Systembenachrichtigungsbereich ("Tray") koordiniert, die ich mit Visual C ++ entwickelt habe.
Die winzige Taskleistensymbolanwendung startet, überwacht und stoppt den Lisp-basierten Server und kommuniziert mit ihm über Win32-Pipes, die an die Standardeingabe und -ausgabe gebunden sind. Über eine Pipe informiert der Lisp-Server die Taskleistensymbolanwendung über die genaue URL mit der richtigen Portnummer, und diese Taskleistensymbolanwendung kann den Browser über die Shell-API starten, um diese URL zu durchsuchen. Der Benutzer klickt einfach doppelt auf das Symbol, um die Benutzeroberfläche aufzurufen.
Das Lisp-Programm behält in seinem Speicher einen ziemlich komplexen Sitzungszustand bei, der den Eingabeverlauf des Benutzers und verschiedene Beziehungen zwischen verschiedenen Objekten enthält. Die kreisförmige Objektnotation von Lisp (durch die
*print-circle*
Variable aktiviert ) und die Funktionsweise bei benutzerdefinierten CLOS-print-object
Methoden sind eine enorme Hilfe bei der Implementierung der Persistenz: Benutzer können den Status auf der Festplatte speichern und dort fortsetzen, wo sie aufgehört haben. Alles wird gespeichert, einschließlich des Status der Benutzeroberfläche. Sowohl im Objektgraphen als auch in den Zyklen gibt es viele gemeinsame Unterstrukturen. Außerdem viel statische Kruft, die nicht beibehalten werden muss, wie der Inhalt von Wörterbucheintragsobjekten. Mit den benutzerdefinierten Druckobjektmethoden von ANSI Common Lisp können Sie komprimierte gedruckte Darstellungen für Objekte erstellen, die dennoch maschinenlesbar sind.In der Web-Benutzeroberfläche wird fast kein JavaScript verwendet. Sogar die Steuerelemente zum Ausblenden und Anzeigen von Teilen der Benutzeroberfläche werden durch Übermitteln des Formulars und erneutes Rendern des HTML-Codes vorgenommen. Jedes Detail des UI-Status befindet sich daher auf dem Server und bleibt erhalten, wenn der Benutzer speichert. Die Neuerstellung des HTML ist sehr schnell. Dies geschieht durch einen riesigen Lisp-Backquote-Ausdruck, der ein HTML-generierendes Makro füttert. Der von Clozure Common Lisp (CCL) kompilierte Code macht dies so schnell, dass Sie kaum bemerken, dass Sie beim Klicken auf die Schaltfläche [+] auf der Benutzeroberfläche eine Anforderung an einen Server senden, der die Datei neu generiert gesamte Stopfseite und nicht nur lokales JavaScript, um die Sichtbarkeit eines lokalen Dokumentelements zu ändern.
Das Programm wurde ursprünglich mit CLISP entwickelt. Dank ANSI CL, einer Standardsprache, mit Implementierungen, die gut übereinstimmen und nicht zu viele Tücken in der Sprache aufweisen ("undefiniertes" oder "implementierungsdefiniertes" Verhalten), ist eine Portierung nach CCL recht einfach.
CLISP wurde nicht aufgegeben. Es wird weiterhin für die Stromversorgung des Lizenz-Backends verwendet, wobei ein Großteil der gleichen gemeinsamen Codebasis verwendet wird.
Ich habe ein ursprüngliches Lizenzierungssystem für das Programm entwickelt, das die von der IronClad-Bibliothek bereitgestellte Krypto-Ellipsenkurve verwendet, um Lizenzen zu signieren und zu zertifizieren. (Ich erinnere mich anscheinend, dass ich möglicherweise das Befehlszeilenprogramm von OpenSSL verwendet habe, um die EC-Parameter für den Serverschlüssel zu generieren.)
Lizenzen werden als Lisp-Objekte dargestellt. Es ist eine Hommage an die Portierbarkeit von Lisp, dass ein von Clozure Common Lisp kompiliertes Windows-Programm eine auf S-Ausdrücken basierende Lizenz generieren kann, ein CLISP-Programm, das auf einem Debian-Server ausgeführt wird, das fehlende Feld für die digitale Signatur in diesem Objekt ausfüllen und an senden kann das Windows-Programm, das die Signatur validieren kann.
Neben dem CGI-basierten Lizenzierungsdienst habe ich auf dem Server eine einfache Befehlszeilen-API zum Verwalten von Lizenzen. Sie können Lizenzen auflisten, bestimmte suchen und deren Attribute bearbeiten, beispielsweise das Ablaufdatum einer temporären Lizenz, um einem Benutzer eine Ausnahme zu gewähren. Das Lizenz-Backend generiert auch E-Mails. Ich habe keine Bibliothek für das CGI-Handling auf der Serverseite verwendet: nur handgerollten Lisp-Code für den Umgang mit den Apache-Umgebungsvariablen und Befehlszeilenargumenten. (Obwohl Bibliothekscode für die URL-Codierung und die HTML-Generierung verwendet wird.) Für die Speicherung wird keine Datenbank verwendet. Die Lizenzen werden in eine Datei namens verkettet
licenses.lisp
und das war's.quelle
Wenn mich jemand bezahlt hat, sicher.
Sie wären wahrscheinlich mehr daran interessiert, jemanden zu bezahlen, der die Sprache versteht. Ich habe nur ein paar Mal mit Elisp und Schema gespielt.
quelle