Warum ich mich für Common Lisp entschieden habe
(blog.djhaskin.com)Goodbye, Clojure
- Ich habe etwa 7 Jahre lang Clojure verwendet, war aber wegen des Problems der „langsamen Startgeschwindigkeit“ bei CLI-Apps nicht mehr zufrieden.
- Es gab zwar Projekte wie babashka, aber selbst mit
native-imagevon GraalVM ließ sich die langsame Startzeit nur schwer lösen. - Eine „schnelle Startzeit für eigenständige ausführbare Dateien“ wurde zu einer unverzichtbaren Anforderung, und ich kam zu dem Schluss, dass Clojure diese nicht erfüllt.
Auf der Suche nach einem neuen Lisp
- Um eine neue Lisp-Sprache zu finden, habe ich verschiedene Sprachen untersucht. Ich suchte nach einer Sprache, die die Probleme lösen konnte, die ich in früheren Projekten erlebt hatte.
- Es gab zwar keine „expliziten Anforderungen“, aber am Ende habe ich die folgenden Kriterien festgehalten.
- Es muss möglich sein, mit einer vernünftigen Toolchain „eigenständig ausführbare Dateien mit schnellem Start“ zu erzeugen (um meinen Hauptkritikpunkt an Clojure zu lösen).
- Da ich Emacs nicht verwenden kann, muss die Sprache in Vim nutzbar sein.
- Unterstützung für Windows und Mac ist Pflicht; es reicht nicht, nur Linux/POSIX-Betriebssysteme zu unterstützen.
- Wünschenswert wäre die Möglichkeit zur Einbindung in andere große Community-Sprachen wie bei Clojure und Java.
- Die Laufzeitgeschwindigkeit sollte ausreichend hoch sein (mindestens auf dem Niveau von Clojure, idealerweise darüber).
- Die Unterstützung für Multithreading muss stark sein, und wenn möglich sollte es nichts wie den GIL (Global Interpreter Lock) geben.
- Eine starke Community ist unverzichtbar.
- Es sollte ein reichhaltiges Ökosystem vorhanden sein, und zumindest die folgenden Bibliotheken sollten verfügbar sein:
- JSON-Parsing und -Serialisierung
- Sqlite3-Unterstützung
- HTTP-Request-Bibliothek
- Unterstützung für funktionale Datenstrukturen wie in Clojure (dieser Punkt war allerdings weniger wichtig)
- Untersuchte Sprachen
- Scheme: Durch die Standardisierungsprobleme mit r6rs und r7rs war die Community gespalten, was mich nicht angesprochen hat, und das kleine Ökosystem erfüllte meine Anforderungen nicht.
- Racket: Ich hatte es in meiner Schulzeit benutzt, mochte es aber nicht besonders, weil sich die Laufzeit langsam und schwergewichtig anfühlte.
- Common Lisp: Entdeckt auf lisp-lang.org. Die Community und die verfügbaren Materialien waren beeindruckend, also beschloss ich, es auszuprobieren.
Magic Happens Here
- Die ganze Geschichte meiner Lernreise mit Common Lisp lasse ich aus, aber der Lernprozess war steinig.
- Der Einstieg verlief falsch. Zu Weihnachten bekam ich das Buch CLtLv2 geschenkt und begann damit zu lernen.
- Später entdeckte ich HyperSpec, begann darin zu lesen und kam damit auf einen besseren Lernweg.
- Common Lisp hatte einige einzigartige Eigenschaften.
- Es ist eine standardisierte Sprache, eher vergleichbar mit C als mit Java.
- Mehrere Compiler, Interpreter und Laufzeitumgebungen implementieren den Standard.
- Es gibt Werkzeuge wie Roswell, mit denen sich verschiedene Implementierungen installieren und verwalten lassen.
- In der Community gilt SBCL als die populärste Implementierung.
- Was wäre gewesen, wenn ich Janet zu Beginn meiner Suche gekannt hätte?
- Janet hat die folgenden Eigenschaften und hätte mich möglicherweise schon vor dem Lernen von Common Lisp zufriedengestellt.
- Kompakte Syntax, schnelle und kleine ausführbare Dateien, Unterstützung für C FFI
- Es gibt eine unterhaltsame Einführung
- Es erfüllt alle Anforderungen, die mir persönlich wichtig waren.
- Warum ich mich trotzdem für Common Lisp entschieden habe
- Ich hätte fortgeschrittene Funktionen wie CLOS und das Condition System verpasst, von denen ich erst später erfuhr.
- Common Lisp ist die mächtigere Sprache.
Anforderungen erfüllt
Nachdem ich festgestellt hatte, dass Common Lisp meine Anforderungen erfüllt, habe ich es als meine nächste Lisp-Sprache gewählt und nutze es bis heute. Die wichtigsten Erkenntnisse sind die folgenden:
- Eigenständige ausführbare Dateien:
- Es gibt verschiedene Möglichkeiten, in Common Lisp eigenständige ausführbare Dateien zu erstellen.
- Je nachdem, ob die ausführbare Datei komprimiert ist oder nicht, reicht die Startzeit von einem Bruchteil einer Sekunde bis zu nahezu sofortigem Start.
- Diese Funktion ist keine zusätzliche Option, sondern wurde als primäre Methode zur Bereitstellung von Lisp-Programmen konzipiert.
- Vim-Workflow:
- Es gibt mehrere hervorragende Optionen, aber ich habe mir meinen Vim-Workflow persönlich selbst eingerichtet.
- Außerdem habe ich festgestellt, dass sich auch VS Code als IDE für Common Lisp durchaus gut eignet.
- Windows/Mac/Linux-Unterstützung:
- SBCL unterstützt die wichtigsten Betriebssysteme gut.
- Integration mit großen imperativen Ökosystemen:
- Die meisten Implementierungen unterstützen die Integration mit C gut und lassen sich über CFFI nutzen.
- Laufzeitgeschwindigkeit:
- SBCL ist in der Laufzeit sehr schnell.
- Multithreading:
- Der Common-Lisp-Standard enthält keine explizite Unterstützung für Multithreading, aber die wichtigsten Implementierungen unterstützen es.
- Eine Bibliothek namens Bordeaux-Threads reduziert die Unterschiede zwischen verschiedenen Implementierungen.
- Mit Bibliotheken wie
lparallel,cl-asyncundblackbirdsind Multithreading und asynchrone Programmierung möglich.
- Starke Community:
- Ich habe die Aktivitäten der Community entdeckt und mich daran beteiligt.
- Die Ergebnisse der Community-Umfrage 2024 und das European Lisp Symposium zeigen, wie aktiv die Common-Lisp-Community ist.
- Auch im Blog-Netzwerk und auf Reddit ist die Unterstützung durch die Community stark.
- Ökosystem:
- Die meisten verwenden Quicklisp, ich selbst verwalte Pakete jedoch mit OCICL.
- Über das Common Lisp Cookbook, CLiki und Awesome CL lassen sich Bibliotheken und technische Informationen erkunden.
- Unterstützung für konkrete Bibliotheken:
- JSON: jzon
- Sqlite3: cl-sqlite
- HTTP-Anfragen: dexador
- Funktionale Datenstrukturen: FSet, cl-hamt
Hinweise für Neueinsteiger
- Da im Common Lisp Discord die Zahl der Anfänger zunimmt, habe ich diesen Text geschrieben, um meinen Weg bei der Auswahl und Eingewöhnung in Common Lisp zu teilen.
- Ich hoffe, dieser Beitrag hilft allen, die sich für Common Lisp interessieren.
2 Kommentare
Hacker-News-Kommentare
Die Erfahrung, mit SBCL ein Problem sogar ohne Quellcode gelöst zu haben, war beeindruckend. Mit anderen Technologie-Stacks hätte sich das ohne Quellcode wahrscheinlich nicht so schnell beheben lassen
Es wird die Erfahrung geteilt, von Common Lisp zu Clojure gewechselt zu sein, wobei die Concurrency-Funktionen von Clojure attraktiv waren
Mit vim-slime haben sich Produktivität und Entwicklerzufriedenheit deutlich verbessert
Der Wert von Lisp wurde zwar nicht verstanden, aber ein dazugehöriges Lied ist in Erinnerung geblieben
Es wird behauptet, dass Emacs/slime eine bessere Lisp-IDE als vim-slime ist
Common Lisp wird als Hobby genutzt, und es besteht der Wunsch, C#-Code in der SBCL-REPL auszuführen
Es wird die Erfahrung geteilt, CLI-Anwendungen mit Clojure und babashka entwickelt zu haben
Bei der Verwendung von native-image gab es Probleme, und Clojure wird für eine nahezu perfekte Sprache gehalten
Es wird Interesse an der Sprache Janet geäußert, und die GitHub-README sowie die FAQ des Projekts werden als nützlich erwähnt
Es wird eine Erfahrung geteilt, die den Wunsch geweckt hat, Lisp zu lernen, wobei besonders der Autor als vim-Fan attraktiv wirkte
Ich habe den Wert von Lisp nicht verstanden, aber ich erinnere mich an ein dazugehöriges Lied ... Es gibt viele Lisp-Lieder, und auf YouTube gibt es ein Lied namens
Land of Lisp;-)