Kenos Antwort ist genau richtig, aber vielleicht kann ich ein bisschen mehr darüber erzählen, was vor sich geht und was wir vorhaben.
Derzeit gibt es nur einen LLVM JIT-Modus:
- Es gibt ein sehr triviales Interpreter für einige einfache Top-Level-Anweisungen.
- Der gesamte andere Code wird vor der Ausführung in den Maschinencode übertragen. Der Code wird unter Verwendung der Laufzeittypen der Werte, auf die der Code angewendet wird, aggressiv spezialisiert und über das Programm unter Verwendung der dynamischen Typinferenz verbreitet.
Dies ist, wie Julia auch gute Leistung erhält, wenn der Code ohne Typenannotationen geschrieben: Wenn Sie rufen f(1)
Sie Code erhalten spezialisiert für Int64
- die Art der 1
auf 64-Bit-Systemen; Wenn Sie f(1.0)
anrufen, erhalten Sie eine neue Version, die auf Float64
- den Typ 1.0
auf allen Systemen spezialisiert ist. Da jede kompilierte Version der Funktion weiß, welche Typen sie bekommen wird, kann sie mit C-ähnlicher Geschwindigkeit laufen. Sie können dies sabotieren, indem Sie "type-unstable" -Funktionen schreiben und verwenden, deren Rückgabetyp von Laufzeitdaten und nicht nur von Typen abhängt, aber wir haben große Sorgfalt darauf verwendet, die Kernsprache und die Standardbibliothek nicht zu entwerfen.
Die meisten von Julia ist in sich selbst geschrieben, dann geparsed, type-abgeleitete und jitted, so Bootstrapping das gesamte System von Grund auf dauert etwa 15-20 Sekunden. Um es schneller zu machen, haben wir ein gestaffeltes System, in dem wir eine serialisierte Version des typabgeleiteten AST in der Datei sys.ji
analysieren, typenableiten und dann zwischenspeichern. Diese Datei wird dann geladen und zum Ausführen des Systems verwendet, wenn Sie julia
ausführen. Kein LLVM-Code oder Maschinencode wird jedoch in sys.ji
zwischengespeichert, so dass das gesamte LLVM-Jitting immer noch ausgeführt werden muss, wenn julia
startet, was ungefähr 2 Sekunden dauert.
Diese Startverzögerung von 2 Sekunden ist ziemlich nervig und wir haben einen Plan, um es zu beheben. Der grundlegende Plan ist, in der Lage zu sein, ganze Julia-Programme zu Binärdateien zu kompilieren: entweder ausführbare Dateien, die ausgeführt werden können, oder gemeinsame Bibliotheken, die von anderen Programmen aufgerufen werden können, als wären sie einfach gemeinsam genutzte C-Bibliotheken. Die Startzeit für eine Binärdatei ist wie bei jedem anderen C-Programm, daher verschwindet die Startverzögerung von 2 Sekunden.
Addendum 1: Seit November 2013 hat die Entwicklungsversion von Julia keine Startverzögerung von 2 Sekunden mehr, da die Standardbibliothek als Binärcode vorkompiliert wird. Die Startzeit ist immer noch 10x langsamer als Python und Ruby, also gibt es Raum für Verbesserungen, aber es ist ziemlich schnell. Der nächste Schritt wird sein, Precompilation von Paketen und Skripten zu ermöglichen, damit diese genauso schnell starten können wie Julia selbst.
Addendum 2: Seit Juni 2015 kompiliert die Entwicklungsversion von Julia automatisch viele Pakete, so dass sie schnell geladen werden können. Der nächste Schritt ist die statische Kompilierung von ganzen Julia-Programmen.
Dies wurde in den Julia Nightlies implementiert und wird in der Version 0.3 enthalten sein. Die Startzeit wird erheblich verbessert. –