Programmiersprache: Julia 1.6 ist eine LTS-Version und präkompiliert parallel

Die neue Version der funktionsorientierten Programmiersprache soll Long-term-Support erhalten und gilt als besonders stabil.

In Pocket speichern vorlesen Druckansicht 33 Kommentare lesen

(Bild: Panuwatccn/Shutterstock.com)

Lesezeit: 4 Min.
Von
  • Silke Hahn
Inhaltsverzeichnis

Die Programmiersprache Julia ist in Version 1.6 erschienen. Das aktuelle Release soll langfristigen Support erhalten (LTS), und das Entwicklerteam hat es der Ankündigung zufolge dafür akribischen Tests unterzogen. Eine Reihe neuer Features ist an Bord, als Highlight gelten die parallele Präkompilierung, das Eliminieren unnötiger Rekompilierung und die Reduktion von Compilerlatenzen, speziell durch neue Tools für Compiler Introspection und Typeninferenz.

Da das Ausführen aller Anweisungen eines Moduls viel Code umfassen kann, erstellt Julia standardmäßig präkompilierte Caches der Module, um die Kompilierzeit zu reduzieren. Das Präkompilierungspaket im aktuelle Release soll diesen Vorgang durch Parallelisieren weiter beschleunigen. Den Herausgebern zufolge führe das insbesondere bei komplexen mathematischen Berechnungen zu signifikant rascheren Ladezeiten.

Julia ist bekannt für die Erweiterbarkeit um neue Methoden und vordefinierte Funktionen, was mitunter Rekompilierung erfordert: Veralteter Code wird als ungültig markiert, und der gesamte Programmcode ist dann erneut mit den erweiterten Einstellungen zu verarbeiten. Bei älteren Versionen der Programmiersprache hat das zu Verzögerungen geführt, da mitunter ein Zehntel des Codes im ersten Schritt als ungültig auszuzeichnen war. Version 1.6 verfügt laut Ankündigung über ein "wählerischeres" Schema zum Ungültigmachen von altem Code und soll den Vorgang schneller erledigen können.

Die Methoden beim Kompilieren sind bei Julia bislang nach ihrer Abfolge sortiert gewesen. Mit Julia 1.6 wird dieser Prozess "lazy", also bedarfsorientierter. Die Julia-Entwickler haben dafür den Algorithmus angepasst, um gezielt passende Methoden auszuwählen, statt sie in chronologischer Reihung abzutickern. Ebenfalls mit Blick auf Latenzen hat Julia 1.6 neue Werkzeuge zur Compilerintrospektion an Bord genommen, die besonders die Typeninferenz im Auge behalten sollen.

Entwicklerinnen und Entwickler können nun offenbar mit dem ab Version 2.2 mit Julia kompatiblen Tool SnoopCompile.jl Implementierungsoptionen prüfen und sich vorab anzeigen lassen, welche Auswirkung das Implementieren bestimmter Pakete auf die Kompilierzeit hätte. Mehr dazu lässt sich der SnoopCompile.jl-Dokumentation entnehmen.

Auch an den internen Datenstrukturen hat das Julia-Team gefeilt: Die Funktionsweise des Codes sollte sich dadurch nicht ändern, die Performance hingegen erhöhen. Beispielsweise soll invokelatest nun schneller sein als try und aufschließen zum Dynamic Dispatch. Außerdem sind einige komplexe Datenstrukturen, die vorher in Bäume aufgefächert waren, im aktuellen Release zu einfachen Hash-Tabellen geworden, was die Skalierbarkeit erleichtern und sie einfacher Thread-safe machen soll. Insbesondere Typenallokationen wie apply_type und tuple, das Nachschlagen von Methoden über MethodInstance und Dispatch mit jl_apply_generic ließen sich auf diese Weise entflechten.

Wer mit Julia entwickelt, nutzt in der Regel Libraries über die sogenannten JLL-Pakete, die sich mit dem Framework BinaryBuilder.jl durch Cross-Compiling erstellen lassen. Mit einer standardisierten API erhalten Julia-Pakete Zugriff auf die so bereitgestellten Binaries. Während diese Art der Bereitstellung als ausgesprochen zuverlässig und portierbar gilt, ist ihr Haken bisher die lange Ladezeit gewesen. Um Abhilfe zu schaffen, hat das Entwicklerteam im aktuellen Release eine neue Paketform eingeführt: JLLWrappers.jl enthält Makros, die die notwendigen Bindings für ein JLL-Paket automatisch erstellen und dabei möglichst wenig Funktionen und Datenstrukturen beanspruchen.

Die zentralisierten JLLWrappers.jl haben in der Testphase laut Herausgebern im Vergleich mit den alten Wrappern gut abgeschnitten und können offenbar eine deutliche (laut Messungen bis zu fünfzigfache) Beschleunigung bei den Ladezeiten großer Binaries bewirken.

Ladezeiten von JLL-Paketen: alte und neue Wrapper im Vergleich

(Bild: julialang.org)

Weitere Änderungen betreffen das Formatieren von Stacktrace, in dem sich jetzt unter anderem Argumentnamen anzeigen lassen, und das Team hat nach eigenen Angaben "technische Schulden abgebaut", um Julia 1.6 für Continous Integration (CI) zu trimmen. Hierzu waren eine Reihe kleinteiliger Problembehebungen fällig, die das Entwicklerteam teils schon länger auf der To-do-Liste hatte. Details hierzu lassen sich dem ausführlichen Blogeintrag der Julia-Entwickler entnehmen. Eine vollständige Liste der Neuerungen ist auf GitHub einsehbar.

(sih)