let-go – In Go geschriebene Clojure-artige Sprache mit 7 ms Startzeit
(github.com/nooga)- let-go ist ein in Go geschriebener Clojure-Dialekt, der über einen Bytecode-Compiler und eine Stack-VM verfügt und ohne JVM als einzelnes, etwa 10 MB großes Binary läuft
- Der Kaltstart liegt bei etwa 7 ms; die Clojure-Kompatibilität wird anhand der jank-lang Clojure test suite mit 4696 / 4921 bestandenen Assertions (95,4 %) angegeben
- Der Autor nutzt es für CLI, Skripte und Webserver, hat darauf auch eine daemonless container runtime aufgebaut, und es kann zu eigenständigen ausführbaren Dateien oder selbstenthaltenden WASM-Webseiten kompiliert werden
- Ziel ist die Umsetzung vieler Clojure-Funktionen wie persistent data structures, Lazy Seqs, Transducers, Protocols, Records, Multimethods, core.async, BigInts sowie bidirektionaler Interop mit Go-Funktionen, -Structs und -Channels
- Es ist kein drop-in replacement für JVM-Clojure, lädt keine JARs, und echte Projekte mit Bibliotheksabhängigkeiten müssen angepasst werden
- In Benchmarks auf einem Apple M1 Pro werden 10 MB Binary-Größe, 6,7 ms Startzeit und 13,5 MB Leerlaufspeicher genannt; damit wird bei kleineren Ausführungseinheiten ein Vorteil gegenüber Babashka, Joker, go-joker, gloat und Clojure auf der JVM dargestellt
- Bei größeren numerischen Rechenaufgaben liegen der WASM-JIT von go-joker oder eine aufgewärmte JVM mit HotSpot vorn; let-go wird in den meisten Algorithmus-Benchmarks als ähnlich schnell wie Babashka und mehr als 10-mal schneller als das Upstream-Joker zusammengefasst
- Die Standard-Namespaces umfassen
clojure.core,clojure.string,clojure.set,clojure.edn,clojure.test,clojure.core.async,io,http,json,transit,os,System,syscall,podsund weitere - Es kann Babashka pods laden, sodass sich das Pod-Ökosystem für SQLite, AWS, Docker, Dateiwatching usw. nutzen lässt;
~/.babashka/pods/wird mitbbgeteilt - Zu den bekannten Einschränkungen zählen nicht implementierte Refs / STM, Agents, Hierarchies, Reader Tagged Literals,
deftype,reify,clojure.spec,alter-var-root,subseq/rsubseqsowie das Fehlen einer automatischen Erkennung vonint64-Überläufen - Zu den Verhaltensunterschieden gehört, dass ein
go-Block keine IOC-State-Machine, sondern eine echte goroutine ist, dass Regex statt Java-Regex auf Go-re2basiert und dass das Zahlensystem ausint64+float64+BigIntbesteht - Die Installation ist über Homebrew für macOS/Linux, über Releases für Linux, macOS und Windows auf amd64/arm64 oder unter Go 1.22+ mit
go install github.com/nooga/let-go@latestmöglich lgunterstützt REPL, Auswertung von Ausdrücken und das Ausführen von Dateien sowie die Bytecode-Kompilierung nach.lgb, das Bündeln zu eigenständigen Executables und die Erstellung von WASM-Web-Apps- Die WASM-Ausgabe besteht aus einem selbstenthaltenden
index.htmlvon etwa 6 MB gzipped mit inlined WASM und Service Worker; bei Nutzung desterm-Namespaces wird eine auf xterm.js basierende Terminal-Emulation bereitgestellt - Der integrierte nREPL-Server funktioniert mit CIDER, Calva und Conjure; in Go-Programmen kann let-go über
pkg/apials Skripting-Schicht eingebettet werden, um Go-Werte, -Funktionen, -Structs und -Channels an die VM zu übergeben
1 Kommentare
Hacker-News-Kommentare
Gefällt mir! Ich habe kürzlich mit einem Experiment gespielt, Go-Semantik mit Lisp-Syntax zu überlagern: https://codeberg.org/veqq/Joe
Unter den Clojure-ähnlichen Sprachen ohne JVM ist auch Janet wirklich großartig, und ich nutze es seit einiger Zeit in Produktion: https://janet-lang.org/
Wenn man eine Lua-VM und Bibliotheken will, gibt es auch Fennel
Dieses Wasm-Browser-REPL ist ebenfalls einen Blick wert: https://gloathub.org/repl/
Gloat ist ein Automatisierungstool für Glojure AOT
Letzten Sommer habe ich zusammen mit James Hamlin Glojure AOT möglich gemacht und seitdem kontinuierlich weiterentwickelt. Ich arbeite auch mit marcingas(nooga) daran, dass Gloat/Glojure/let-go gut zusammenarbeiten
Überraschend, dass es auf Plan 9 läuft
Es wäre cool, wenn Go auf 9front eine Sprache erster Klasse, also eine standardmäßig enthaltene Sprache, würde
Ich bastle an einem sozialen Netzwerk für Plan 9: https://youtube.com/watch?v=q6qVnlCjcAI&si=MBCeM0QdA0WsKAe7
Alles ist in rc und awk geschrieben, aber es gab zwischendurch Stellen, an denen Go oder Clojure schön gewesen wären
amd64 wurde auf 9front getestet, und es scheint alles gut zu funktionieren. Die CLI ist nicht besonders Plan-9-mäßig, aber ich wäre bereit, den Port irgendwann nativer zu machen
Inzwischen gibt es ein paar Go-Dialekte von Clojure, daher interessiert mich vor allem, welcher davon vollständig auf Go gehostet ist und Interoperabilität auf dem Niveau bietet, das JVM-Clojure mit Java hat
Es wäre schön, wenn ich in Go Geschriebenes nutzen und aus Clojure heraus auch Go verwenden könnte, bis hin zu gemischten Projekten. Außerdem wäre es hilfreich, wenn abgesehen von der Interoperabilität detailliert aufgeschlüsselt wäre, was gleich ist, was nicht und wie genau die Unterschiede aussehen
let-go hingegen kann beliebige Go-Werte, einschließlich Structs, Funktionen und Channels, in beide Richtungen durchreichen, aber es kann nicht ohne Wrapper direkt beliebige Go-Bibliotheken einbinden. Solche Bibliotheken müssen zur Laufzeit eingebaut sein
Kleine Anmerkung, aber im README steht Cold Start 7 ms, ein paar Zeilen weiter unten dann 6 ms. Vielleicht wird es schneller, je länger man das README liest
Das ist genau die Art von Clojure-Port, nach der ich immer gesucht habe
Ich fand die Core-Bibliothek und die Channel-Abstraktion von Go immer einfacher und als grundlegende API besser, und ich dachte, das würde auch gut zu einer core.async-artigen API passen. Außerdem erfüllt es den Wunsch nach einem großen einzelnen Binary
Danke für die Arbeit, und sobald meine neue Begeisterung für C++26 etwas abgeklungen ist, werde ich es mir definitiv noch einmal ansehen
Außerdem weiß ich nicht, warum Glojure bisher nicht auf meinem Radar war; auch das sieht nach einem großartigen Projekt aus
Mit altem PHP meine ich, dass PHP ursprünglich eher wie eine Web-zentrierte DSL war; heute ist das nicht mehr so. Eine leicht zu schreibende Backend-Sprache im PHP-Stil mit der Power von Go im Hintergrund wäre interessant, und Clojure wäre dafür eine hervorragende Wahl
Als Alternative gibt es auch Joker: https://joker-lang.org
Wirklich großartig, aber ich halte es für stark unterschätzt
Ich möchte let-go allerdings nicht zu sehr mit zusätzlichen Dingen aufladen. Mir gefällt, dass es unter 10 MB bleibt
Ich wünschte, der Sprachname wäre besser als einfach nur „lets-go“. Wie wäre es mit „clogo“?
(let [...] (go ...))Es lässt einen in Go ein let machen!
Clogo ist für mich ein no-go. Wenn jemand andere gute Ideen hat, schaue ich sie mir gern an
Ein PR für https://github.com/chr15m/awesome-clojure-likes wäre sehr willkommen