Das wissenschaftliche Rechnen hatte sich auf einen Zwei-Sprachen-Workflow eingependelt: Forscher prototypisierten und analysierten in einer dynamischen Sprache wie Python, MATLAB oder R und schrieben dann die langsamen Teile in C oder Fortran neu. Ein Ars-Technica-Beitrag von 2020 und die zugehörige Hacker-News-Diskussion führten die Kosten dieser Nahtstelle vor Augen: Die Skriptschicht kann hohe Leistung nicht ausdrücken, während die schnelle Schicht mühsam zu schreiben und schwer zu warten ist.

Julias Wette bestand darin, die Nahtstelle vollständig zu beseitigen. Sein Compiler nutzt Typinferenz und einen auf LLVM aufbauenden JIT, um jede Funktion für die konkreten Argumenttypen zu kompilieren, mit denen sie tatsächlich aufgerufen wird, sodass eine dynamische, mathematiknahe Sprache nahe an gut geschriebenem C laufen kann. Multiple Dispatch – die Auswahl einer Methode anhand aller Argumenttypen statt eines einzelnen Empfängers – ermöglicht es Paketen, die generischen Funktionen anderer zu erweitern, und so setzen sich unabhängige Bibliotheken zusammen, statt dass jede ihren eigenen C-Kern umhüllt.

Bis 2020 zeigte das Design Produktionsergebnisse, nicht nur Benchmarks. RelationalAI gab an, seine Cloud-Wissensgraph-Datenbank sei zu 100 % in Julia geschrieben; die Modellierungsplattform Pumas wurde an Pharmaunternehmen ausgeliefert und in FDA-Einreichungen verwendet; und Kommentatoren verwiesen auf ganze Ökosysteme, von Differentialgleichungen bis zur mathematischen Optimierung, in denen Julia-Bibliotheken zur Spitzenklasse geworden waren. Version 1.5 war aktuell, und die Kerentwickler argumentierten, es habe seit 1.0 keine echten Breaking Changes gegeben.

Auch die Kritiker kamen zu Wort: langsame erste Plots und Startlatenz, unreife Werkzeuge und weniger kampferprobte Bibliotheken als Python. Die Verteidiger entgegneten, dass iterative Entwicklung mit Revise.jl plus die Möglichkeit, einen einzelnen Hotspot mit einer einzigen neuen Methode zu patchen, bedeute, dass derselbe Code sowohl der Erkundung als auch der Produktion diene – was genau der Sinn des Designs gewesen sei.

Die dynamische Sprache selbst auf native Geschwindigkeit kompilieren

Typinferenz plus JIT-Spezialisierung macht generischen, ausdrucksstarken Code schnell, ohne dass der Programmierer für Hot Paths den Dialekt wechseln muss.

Multiple Dispatch lässt Pakete Methoden zu den Funktionen anderer Pakete hinzufügen, sodass Ökosysteme wie ODE-Löser und Optimierung sich zusammensetzen, statt die C-Kerne des jeweils anderen zu duplizieren.

Wissenschaftler behalten das mentale Modell ihres Problems bei, statt es zuerst umzuformen, damit es zu einem Leistungsparadigma passt, und vermeiden so eine ganze Klasse von Umschreibfehlern.

Eine Codebasis dient sowohl der Erkundung als auch der Produktion, sodass der Prototyp nicht von dem System abweichen kann, das tatsächlich läuft.

Um einen Umschreibschritt zu beseitigen, baue keine bessere Brücke zwischen zwei Sprachen; baue eine Sprache, deren ausdrucksstarke Schicht auch ihre Produktionsschicht ist.

Der Ars-Technica-Beitrag erschien im Oktober 2020, und sein Hacker-News-Thread erreichte 284 Punkte bei 212 Kommentaren, wobei sich auch Julias eigene Entwickler an der Debatte beteiligten. Die Designbegründung war von ihren Autoren bereits im Aufsatz „Julia: Dynamism and Performance Reconciled by Design“ von 2018 dargelegt worden, und der Thread von 2020 zeigte Einsätze bei RelationalAI und in der pharmazeutischen Modellierung statt nur Forschungsprototypen. Die im Thread genannten Kompromisse – Startlatenz, Reife der Werkzeuge und Bibliotheksabdeckung – blieben die ständige Agenda für das Ökosystem.

DEN BELEGEN FOLGEN

Die Quellen

  1. The unreasonable effectiveness of the Julia programming language Ars Technica · arstechnica.com
  2. The unreasonable effectiveness of the Julia programming language (Hacker News discussion) Hacker News · news.ycombinator.com ·