Würden Sie (einen Dialekt von) LISP für eine reale Anwendung verwenden? Wo und warum? [geschlossen]

31

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.

Anto
quelle
6
Zählt der Emacs als "echte" Anwendung? gnu.org/software/emacs/emacs-lisp-intro
S.Lott
1
@S.Lott: Ja. Wenn Sie elisp zum Erstellen von Erweiterungen für Emacs verwenden, ist das in Ordnung und eine Anwendung eines LISP-Dialekts
Anto
GNU Guile ist genau für diesen Zweck gedacht.
1
Obwohl es interessant ist, denke ich, dass diese Frage nicht mehr für diese Site geeignet ist. Mehrere Gründe: 1 - zu weit gefasst, 2 - es wird eine Liste mit Antworten angefordert, 3 - keine eindeutige Entscheidung, welche die "richtige" Antwort ist, 4 - zu zeitlich lokalisiert ("hat nicht viel Unterstützung in der Branche erhalten"). 5- Es lädt zur Diskussion und Debatte ein.
Andres F.

Antworten:

18

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. Ist mysequence.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.

Paul Nathan
quelle
2
Soweit ich gehört habe, wird LISP in vollwertigen Produktionssystemen eingesetzt, aber normalerweise nur für bestimmte Logikverarbeitungen, die in LISP einfacher zu programmieren sind als in anderen Sprachen. Videospiel-KI und statistische Datenvorverarbeitung waren Beispiele, die ich einmal zitiert habe. Ich hatte einmal einen Manager, der sagte: "Jedes ausreichend komplexe System verfügt über eine integrierte, halbherzige LISP-Implementierung." Ein ähnliches Sprichwort lautete: "Jedes ausreichend aufgeblähte System verfügt über einen eingebauten E-Mail-Reader."
FrustratedWithFormsDesigner
4
@Frustrated: Ja, das sind das n-te Gesetz von Greenspun und das jwz-Gesetz.
Paul Nathan
2
Viele dieser Probleme werden von Clojure einfach dadurch gelöst, dass es speziell für die Kompatibilität mit Java entwickelt wurde und Java ersetzt. Natürlich gibt es auch Schema- und CL-Implementierungen für die JVM (z. B. Kawa, ABCL).
Jörg W Mittag
4
Clojure nervt mich irgendwie, weil es eine weitere Fragmentierung ist.
Paul Nathan
Fragmentierung ist keine schlechte Sache. Was in Clojure wirklich nervt, ist das Fehlen von gepunkteten Paaren. Kann es als eine Lisp-ähnliche Sprache ohne solch eine grundlegende Sache gezählt werden?
SK-logic
11

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 hat einen starken Schwerpunkt auf funktionale Programmierung (mehr als die meisten anderen Lisps). Der Autor und BDFL Rich Hickey hat Haskell häufig als eine seiner Inspirationen für das Sprachdesign angeführt, was bedeutet, dass Sie Dinge wie vollständig unveränderbare Datenstrukturen und faulen unendlichen Sequenzen usw. erhalten.
  • Makro-Metaprogrammierung - Die Lisp-Philosophie "Code ist Daten" ist schwer zu verstehen, es sei denn, Sie haben sie tatsächlich erlebt, aber dies ist einer der Gründe, warum Lisps so ausdrucksstark und produktiv ist. Grundsätzlich haben Sie die Möglichkeit, die Sprache entsprechend Ihrer Problemdomäne zu erweitern.
  • Hervorragende Unterstützung für die gleichzeitige Verwendung mehrerer Kerne - Ich denke, Clojure ist derzeit die beste Sprache für die gleichzeitige Programmierung. Eine aufschlussreiche Präsentation hierzu finden Sie unter http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
  • Die interaktive Entwicklung auf der REPL ist eine großartige, produktive Möglichkeit, Anwendungen zu erstellen. Es gibt Ihnen ein echtes Gefühl der Macht, Ihren laufenden Anwendungscode dynamisch zu ändern und Live-Datenstrukturen programmatisch zu untersuchen .....

Es scheint aus folgenden Gründen auch eine praktische Wahl für den realen Einsatz in der Produktion zu sein:

  • Durch die Ausführung auf der JVM mit sehr einfacher Java-Interoperabilität erhalten Sie Zugriff auf alle Bibliotheken und Tools im Java-Ökosystem
  • Sie verwenden die JVM, eine bewährte Plattform für Unternehmensanwendungen. Clojure profitiert von all den netten JVM-Funktionen wie der hervorragenden kostenlosen GC- und JIT-Kompilierung.
  • Standardmäßig handelt es sich um eine dynamische Sprache , die sich für die Entwicklung und das Rapid Prototyping mit kaum einer Kesselplatte eignet. Sie können jedoch statische Typhinweise hinzufügen, um eine gute Leistung dort zu erzielen, wo Sie sie benötigen.
  • Es ist eine pragmatische und hilfreiche Gemeinschaft - die Art von Kultur, in der Menschen Dinge erledigen und der Fokus auf gut gestalteten Lösungen liegt, die echte Probleme lösen
  • Es gibt Toolunterstützung in mehreren IDEs . Ich persönlich benutze Eclipse mit Counterclockwise Plugin (weil ich die Java-Integration benötige), aber es gibt viele andere Optionen.
mikera
quelle
8

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:

  • Hersteller-Support. Die von uns verwendete LISP-Implementierung - Wenn etwas schief geht und unsere Entwicklung und damit unsere Fristen beeinträchtigt, wird der Anbieter dann gemeinsam mit uns auf eine Lösung hinarbeiten?
  • Bibliotheksunterstützung. Welche Bibliotheken gibt es? String-Manipulation, Mathematik, Datenzugriff, Web-Servlets (oder LISP-Äquivalente), Windows-Toolkit usw. Ich möchte dieses Zeug nicht von Grund auf neu schreiben müssen.
  • Tool-Unterstützung - Wie gut ist die IDE? Fest / stabil oder schuppig? Gute Editorunterstützung? Integrierter Debugger? Wenn ich GUI-Entwicklung in LISP machen muss, gibt es eine visuelle IDE oder muss ich GUI-Layout von Hand codieren (ich hasse es, das zu tun).
  • Entwickler-Buy-In (ich möchte wirklich nicht zu viel Zeit damit verbringen müssen, meinen Teamkollegen eine ganz neue Sprache beizubringen)

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.

FrustratedWithFormsDesigner
quelle
Ich stimme Ihnen zu, dass die Produktivität häufig mehr von verfügbaren Tools und Bibliotheken als von der Sprache selbst beeinflusst wird (vorausgesetzt, die Sprache bietet einige grundlegende Funktionen).
Giorgio
6

Absolut. Paul Graham erklärt es gut .

... 1995 wussten wir etwas, von dem wir glauben, dass es unsere Konkurrenten nicht verstanden haben, und nur wenige verstehen es jetzt: Wenn Sie Software schreiben, die nur auf Ihren eigenen Servern ausgeführt werden muss, können Sie jede gewünschte Sprache verwenden. ..

Wir haben Lisp gewählt. Zum einen war klar, dass eine schnelle Entwicklung in diesem Markt wichtig sein würde. Wir fingen alle bei Null an, sodass ein Unternehmen, das neue Funktionen vor seinen Konkurrenten entwickeln konnte, einen großen Vorteil haben würde. Wir wussten, dass Lisp eine wirklich gute Sprache zum schnellen Schreiben von Software ist, und serverbasierte Anwendungen verstärken den Effekt einer schnellen Entwicklung, da Sie Software in dem Moment freigeben können, in dem sie fertig ist.

Wenn andere Unternehmen Lisp nicht nutzen wollten, umso besser. Es könnte uns einen technologischen Vorsprung verschaffen, und wir brauchten jede Hilfe, die wir bekommen könnten ...

Man könnte also sagen, dass die Verwendung von Lisp ein Experiment war. Unsere Hypothese war, dass wir, wenn wir unsere Software in Lisp schreiben, in der Lage wären, Funktionen schneller als unsere Konkurrenten auszuführen und auch Dinge in unserer Software zu tun, die sie nicht können. Und weil Lisp so hochkarätig war, bräuchten wir kein großes Entwicklungsteam, sodass unsere Kosten niedriger wären. Wenn dies so wäre, könnten wir ein besseres Produkt für weniger Geld anbieten und trotzdem einen Gewinn erzielen. Wir würden am Ende alle Benutzer bekommen, und unsere Konkurrenten würden keine bekommen und schließlich das Geschäft aufgeben. Das hatten wir jedenfalls gehofft.

Was waren die Ergebnisse dieses Experiments? Etwas überraschend hat es funktioniert. Wir hatten schließlich viele Konkurrenten in der Größenordnung von zwanzig bis dreißig, aber keine ihrer Software konnte mit unserer mithalten. Wir hatten einen wysiwyg Online Store Builder, der auf dem Server lief und sich dennoch wie eine Desktop-Anwendung anfühlte. Unsere Konkurrenten hatten CGI-Skripte. Und wir waren ihnen in Sachen Ausstattung immer weit voraus. In der Verzweiflung versuchten die Konkurrenten manchmal, Funktionen einzuführen, die wir nicht hatten. Bei Lisp war unser Entwicklungszyklus jedoch so schnell, dass wir manchmal innerhalb von ein oder zwei Tagen ein neues Feature duplizieren konnten, das ein Konkurrent in einer Pressemitteilung angekündigt hatte. Bis Journalisten, die über die Pressemitteilung berichteten, uns anriefen, würden wir auch das neue Feature haben.

Unseren Konkurrenten muss es so vorgekommen sein, als hätten wir eine Art Geheimwaffe - wir entschlüsseln ihren Enigma-Verkehr oder so. Wir hatten zwar eine Geheimwaffe, aber es war einfacher, als sie dachten. Niemand hat uns Neuigkeiten über ihre Merkmale mitgeteilt. Wir konnten Software nur schneller entwickeln, als es irgendjemand für möglich gehalten hätte ...

Kevin Cline
quelle
8
"... Paul Graham schrieb ursprünglich reddit in Lisp auf den Rücken einer Serviette, während er auf einen Kaffee wartete. Es war so mächtig, dass es in Python umgeschrieben werden musste, damit gewöhnliche Computer es verstehen konnten. Weil es wurde in lisp geschrieben es war so gut wie kein aufwand, das ganze neu zu schreiben, und der neuschreibvorgang wurde zwischen zwei prozessorzyklen abgeschlossen frühere Version von lisp. Es ist lisp, paul graham, lisp, paul graham, ganz unten. "
John Cartwright
5

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.

S.Lott
quelle
Ich würde diese Antwort erweitern, indem ich sage, warum es gut ist, die Zuordnung zwischen Ketstrokes und Aktionen auszudrücken
Anto
@Anto: Nach meiner Erfahrung ist es mit Lisp wirklich einfach, leistungsstarke Abstraktionen zu erstellen, die alle Aktionen, die Sie in einem Editor ausführen können, auf sehr konsistente Weise transparent darstellen . Auf diese Weise können Sie alles , was Sie im Editor tun können, einem Tastenanschlag zuordnen, wobei jede Bindung der anderen Bindung sehr ähnlich ist, sodass sie leichter zu schreiben und leichter zu warten ist.
Tikhon Jelvis
4

Sowohl Macsyma als auch Autocad basieren auf einem Lisp-Dialekt. Ich würde sie sowohl als "echte Welt" als auch als Emacs klassifizieren.

Joris Geer
quelle
Mathematica basiert nicht auf Lisp.
Rainer Joswig
2
AutoCAD bietet AutoLISP als API an, ist jedoch in C ++ und .NET verwaltetem Code geschrieben.
CAD Kerl
1
@RainerJoswig Macsyma war wohl statt Mathematica gemeint.
user40989
2

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.

Dave Kincaid
quelle
2

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.

SK-Logik
quelle
0

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.

philosodad
quelle
0

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-objectMethoden 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.lispund das war's.

Kaz
quelle
-1

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.

Edward Strange
quelle