Rubys Gründungshandel war immer derselbe: statische Garantien aufgeben, Metaprogrammierung gewinnen und akzeptieren, dass ein Interpreter der Preis ist. Yukihiro „Matz" Matsumoto hat nun einen Compiler veröffentlicht, der die andere Seite dieses Handels einnimmt — und die Zahlen sind nicht marginal.

Spinel, auf GitHub unter MIT-Lizenz, kompiliert Ruby-Quellcode zu einem eigenständigen nativen Programm. Es parst mit libprism, treibt die Typinferenz über das gesamte Programm bis zum Fixpunkt, gibt eine einzige C-Datei aus und übergibt sie dem System-`cc`. Das Ergebnis braucht libc und libm und sonst nichts: keine Ruby-Laufzeit, keine Gems beim Start. Der Compiler selbst ist ein einziges in sich geschlossenes C-Binary — kein Shell-Wrapper, keine verketteten Hilfsprozesse.

Laut Benchmark-Tabelle des Repositories, gemessen am 17. September 2026 auf einer 32-Kern-Linux-Maschine mit gcc 13.3, ist Spinel im geometrischen Mittel rund 8,5x schneller als CRuby 4.0.4 mit `--yjit` über 28 Benchmarks und etwa 15,2x schneller als der reine Interpreter. Mandelbrot landet bei 18 ms statt 938 ms, der Raytracer ao_render bei 70 ms statt 611 ms mit YJIT. Ein kompiliertes Binary startet in etwa 0,8 ms. Das Repository meldet 3.651 bestandene Tests und 62 Benchmarks.

Das Projekt ist ungewöhnlich ehrlich darüber, woher diese Zahlen kommen. Rekursives fib sieht 44,6x schneller aus, und das README sagt offen, warum: Der gesamte Aufrufbaum ist eine reine Funktion eines Literals, sodass der C-Compiler das meiste davon wegfalltet. Auch die schmalen Zellen werden benannt — io_wordcount mit 3,1x, begrenzt durch Zeilenlesen und Hash-Updates; csv_process und gcbench begrenzt durch Allokation.

Wo Spinel seine Geschwindigkeit findet, ist dort, wo es etwas wegnimmt. Typen werden über das ganze Programm hergeleitet, was kleine unveränderliche Klassen — bis zu acht Skalarfeldner — in stack-allokierte C-Structs überführt und den Collector komplett überspringt; das README nennt eine Million Allokationen einer Klasse mit fünf Feldern, die von 85 ms auf 2 ms fallen. Kurze Methoden werden inlined, schleifeninvariantes `arr.length` wird hochgezogen, Ketten wie `a + b + c + d` fallen zu einer einzigen Allokation zusammen. Threads sind echt: ein M:N-Scheduler über OS-Worker, kein GVL, Work Stealing, ein Preemption-Quantum von rund 10 ms — und, wie in JRuby, ist unsynchronisierte gemeinsame Mutation ein Datenrennen.

Die Rechnung kommt als Liste von Einschränkungen. Kein `eval`, kein `instance_eval`/`class_eval` mit Strings. Kein `method_missing`, kein `define_method` oder `send` mit zur Laufzeit berechnetem Namen, die literalen Formen funktionieren. Keine Kodierungen jenseits von UTF-8/ASCII. Ganzzahlen sind native Wörter fester Breite, und `--int-overflow` wählt zwischen Ausnahme, stillem Überlauf und Promotion zu Bignum.

Das Werkzeug ist über einen Compiler hinausgewachsen. `spin new` legt ein Projekt an, `spin add` löst Abhängigkeiten aus einem Paketindex, `spin test` fährt Snapshot-Tests mit CRuby als Orakel. Pakete sind Quellbäume, die ins Binary kompiliert werden — kein Laden zur Laufzeit, kein Extension-Build. `spinel diff` führt ein Programm unter CRuby und Spinel aus und etikettiert die Differenz — compile-error, crash, output-diff, nondeterministic. Genau das Instrument, das ein Compiler für eine dynamische Sprache braucht, bevor ihm jemand Produktionscode anvertraut.

Portabilität ist die ehrliche Grenze. Linux und macOS werden unterstützt, BSD wird erwartet, ist aber nicht in CI, Windows bedeutet WSL. Die Laufzeit lehnt sich an POSIX-Annahmen: pthreads, `<sys/mman.h>` für die Regexp-Engine, GCCs `__attribute__((cleanup))` für GC-Wurzeln, Inline-Assembly für den Fiber-Kontextwechsel.

Es gibt schon Zeichen, dass dies kein Spielzeug ist. Das Nachbarprojekt roundhouse transpiliert Rails-Anwendungen in reines Ruby; laut README besteht 37signals' Campfire unter Spinel die eigene Testsuite vollständig, und das aktuelle Lobsters aus dem Upstream kompiliert und linkt.

Spinel ist kein Drop-in-Ersatz für Ruby, und der Autor behauptet das auch nicht — das README verweist auf `docs/limitations.md` statt auf ein Versprechen. Aber es setzt eine Zahl hinter eine Frage, die Ruby-Nutzer seit drei Jahrzehnten stellen: Was würde diese Sprache kosten, wenn der Compiler die Typen kennte? Für Programme, die in die Teilmenge passen, lautet die Antwort: ein natives Binary, das in unter einer Millisekunde startet und ohne Interpreter im Loop läuft.

Die Commit-Trailer des Repositories nennen zudem einen KI-Co-Autor bei den KI-gestützten Commits des Maintainers — ein Detail, das neben den Benchmark-Tabellen seltsam wirkt und etwas darüber sagt, wie 2026 eine Sprachimplementierung entsteht.