Julia (Programmiersprache)
Julia ist eine höhere Programmiersprache, die vor allem für numerisches und wissenschaftliches Rechnen entwickelt wurde und auch als General Purpose Language verwendet werden kann, bei gleichzeitiger Wahrung einer hohen Ausführungsgeschwindigkeit.[6][7][8][9][10] Die Syntax erinnert stark an MATLAB, wie auch an andere technische Programmiersprachen. Der Compiler wurde in C, C++ und Scheme geschrieben; die Standardbibliothek ist in Julia selbst geschrieben. Die Programmiersprache, deren Entwicklung 2009 begann, wurde im Februar 2012 als Open Source veröffentlicht.
Julia | |
---|---|
Basisdaten | |
Paradigmen: | Multiparadigma (prozedural, funktional, objektorientiert, Metaprogrammierung) |
Erscheinungsjahr: | 2012 |
Designer: | Jeff Bezanson, Stefan Karpinski, Viral B. Shah, Alan Edelman |
Entwickler: | Jeff Bezanson, Stefan Karpinski, Viral B. Shah u. a.[1][2] |
Aktuelle Version: | 1.7.1[3] (22. Dezember 2021) |
Typisierung: | dynamisch mit Typinferenz |
Wichtige Implementierungen: | Julia JIT Compiler |
Beeinflusst von: | MATLAB, Scheme, Lisp, ML, Cecil, Dylan, PyPy, Perl, R, Ruby, Lua[4], Fortran[5] |
Betriebssystem: | Linux, macOS, FreeBSD, Windows |
Lizenz: | MIT-Lizenz, GPL, LGPL, BSD |
The Julia Language |
Die Ausführungsgeschwindigkeit liegt im Bereich von C und Fortran, wodurch sich Julia gegenüber anderen wissenschaftlichen Sprachen wie MATLAB, GNU Octave oder R deutlich absetzt. Charakterisiert wird das Design der Sprache durch ein Typsystem, das parametrisierte Typen erlaubt, eine dynamische Programmierumgebung und Multimethoden als zentrales Paradigma. Julia erlaubt paralleles und verteiltes Ausführen von Programmen und den direkten Aufruf von C- und Fortran-Bibliotheken. Julia enthält standardmäßig einen Garbage Collector[11] und effiziente Implementierungen für Operationen mit Gleitkommazahlen und zur linearen Algebra, zur Generierung von Zufallszahlen und zur Verarbeitung regulärer Ausdrücke.
Die Entwicklung erfolgte am MIT; Stefan Karpinski, Viral Shah und Jeff Bezanson erhielten dafür den J. H. Wilkinson Prize for Numerical Software für 2019. Ein weiterer Entwickler war Alan Edelman.
Eigenschaften
Die offizielle Website stellt folgende Eigenschaften als wichtig heraus:
- Multimethoden können das Verhalten von Funktionen durch Kombination der Argumenttypen bestimmen
- Typen können mit Hilfe des dynamischen Typsystems zur Laufzeit erzeugt werden
- Gute Performance, die im Bereich von statisch typisierten Sprachen wie C liegt
- Integrierte Paketverwaltung
- Lisp-ähnliche Makros und weitere Bestandteile der Metaprogrammierung
- Aufruf von Python-Funktionen durch die Verwendung des Pakets PyCall[12][13]
- Direkter Aufruf von C-Funktionen, ohne Wrapper oder spezielle Programmierschnittstellen zu benötigen
- Mächtige Shell-ähnliche Möglichkeiten, um andere Prozesse zu verwalten
- Entwickelt für parallele Programmierung und verteiltes Rechnen
- Koroutinen erlauben leichtgewichtiges grünes Multithreading
- Benutzerdefinierte Typen sind so schnell wie eingebaute Typen
- Automatische Generierung von effizientem, spezialisiertem Code für unterschiedliche Argumententypen
- Elegante und erweiterbare Konvertierung und Typumwandlung für numerische und andere Typen
- Unicode wird effizient unterstützt, unter anderem UTF-8
Julia wurde stark von Lisp-Dialekten, in erster Linie Scheme und Common Lisp, beeinflusst und hat Gemeinsamkeiten mit Sprachen, die ebenfalls Multimethoden unterstützen. Dazu zählen Dylan, mit einer ALGOL-ähnlichen Syntax statt der Lisp-ähnlichen polnischen Notation, und Fortress, mit umfangreichem parametrischem Typ-System. CLOS erweitert Common Lisp um Multimethoden mit der Einschränkung, dass nur Funktionen, die zuvor als generisch deklariert wurden, mit Multimethoden erweitert werden können.
In Julia, Dylan und Fortress ist die Multimethode der Standard und die eingebauten Funktionen sind gänzlich generisch und erweiterbar. In Dylan werden Multimethoden genauso grundlegend behandelt wie in Julia: Sämtliche benutzerdefinierte Funktionen und eingebaute mathematische Operatoren wie die Addition mit +
sind generisch. Dylans Typsystem unterstützt jedoch nicht vollständig parametrische Typen, was sich eher in von ML abstammenden Sprachen findet. Standardmäßig unterstützt CLOS keine parametrischen Typen für Multimethoden; dies muss durch das Metaobject Protocol hinzugefügt werden. Fortress erlaubt wie Julia parametrische Typen für Multimethoden, jedoch ist Fortress im Gegensatz zu Julia statisch typisiert, sodass Kompilierung und Ausführung in getrennten Phasen stattfinden. Die Tabelle fasst diese Eigenschaften zusammen:
Sprache | Typ-System | Multimethoden | Parametrische Typen |
---|---|---|---|
Julia | dynamisch | Standard | ja |
Common Lisp | dynamisch | als Erweiterung | partiell (nicht für Multimethoden) |
Dylan | dynamisch | Standard | partiell (nicht für Multimethoden) |
Fortress | statisch | Standard | ja |
Version 0.4[14] ermöglicht es, eigenständig lauffähige ausführbare Dateien mit build_executable.jl[15] zu erstellen, während Julia standardmäßig, ähnlich wie Python, vorinstalliert sein muss.
Benutzerinteraktion
Julia enthält standardmäßig ein interaktives Kommandozeilenprogramm REPL (Read–eval–print loop), das zum Experimentieren und schnellen Testen von Code verwendet werden kann.[16] Ein Beispielausschnitt aus dem REPL ist:[17]
julia> p(x) = 2x^2 + 1; f(x, y) = 1 + 2p(x)y
julia> println("Hello world!", " I’m on cloud ", f(0, 4), " as Julia supports recognizable syntax!")
Hello world! I’m on cloud 9 as Julia supports recognizable syntax!
Das REPL gibt dem Benutzer Zugriff auf die System-Shell und stellt einen Hilfemodus zur Verfügung, indem ;
oder ?
, dem Kommando vorangestellt, nach der Eingabeaufforderung eingegeben werden. REPL speichert die Chronik aus eingegebenen Kommandos und solchen zwischen Sitzungen.[18] Außerdem liefert es Codebeispiele, die direkt in REPL eingegeben oder in einer separaten Datei mit einer .jl
-Endung gespeichert und anschließend durch $ julia <filename>
in der System-Shell aufgerufen werden können.[19]
Paketmanager
In Julias Paketmanager ist jedes Paket (Programmbibliothek) ein Git-Repository, das an einem beliebigen öffentlich erreichbaren Ort gespeichert werden kann. Die Abhängigkeiten von Paketen werden in METADATA.jl[20] verwaltet, wodurch eine Installation von Paketen über Julia mit Pkg.add("PaketName")
ermöglicht wird.
Üblicherweise werden Pakete in Julia geschrieben; sie können auch Quellcode für C, Fortran, Python oder andere Sprachen (durch BinDeps[21]) enthalten, solange ein entsprechender Compiler installiert ist, der den Quellcode beim Installieren des Pakets kompiliert. Alternativ ist es möglich, Maschinencode durch WinRPM[22] einzuschließen.
Verwendung mit anderen Sprachen
Viele Pakete[23] sind verfügbar, um andere Sprachen innerhalb von Julia aufzurufen. Beispielsweise ist das Paket JavaCall[24] verfügbar, um Java von Julia aus aufzurufen, Mathematica[25], um Mathematica aufzurufen,[26] das Aufrufen von Rust ist möglich,[27][28] und node-julia erlaubt JavaScript/node.js die Verwendung für asynchrone (Web-)Server. Für PHP, Perl und andere Sprachen, erlaubt Polyglot[29] einen transparenten Fernaufruf und rekursive Auswertung von Funktionen in anderen Sprachen, so als wären sie reguläre Julia-Funktionen. Es ermöglicht anderen Sprachen, Julia-Funktionen so zu verwenden, als wären sie in der anderen Sprache geschrieben. Mit Polyglot.jl hat Julia ebenfalls native und Wrapper-Pakete für symbolische Mathematik.
Standardmäßig unterstützt Julia UTF-8, UTF-16 und UTF-32, jedoch können die optionalen Pakete ICU[30], ein Wrapper für International Components for Unicode und UnicodeExtras[31] für eine erweiterte Unicodeunterstützung verwendet werden. Außerdem ist für die Erstellung und das Arbeiten mit Browserfenstern das Paket Blink[32] verfügbar.
Für Julia gibt es Wrapper-Bibliotheken, um mit grafischen Benutzeroberflächen zu arbeiten, wie beispielsweise das (zumindest für Linux, Windows und macOS) plattformunabhängige GTK+, Qt (verwendet PySide), Tk oder JGUI[33], der die Unterschiede der vorherigen verbirgt und das verwendet, was verfügbar ist.
Es gibt zahlreiche einzelne SQL- oder NoSQL-Datenbankenschnittstellen und das generische ODBC[34] für datenbankübergreifenden Zugriff.
Während Julia standardmäßig Eager Evaluation (frühe Auswertung) verwendet, liefert das Lazy[35] -Paket Grundlagen für funktionales Programmieren – Lazily-evaluated-Listen und eine große Bibliothek von Funktionen, um mit diesen zu arbeiten.
Verwendung für Statistik- und Datenanalyse
Julia wurde mit dem Ziel erschaffen, so einfach für Statistik zu sein wie R es ist.[10]
Für den Fall, dass Julia Statistikfunktionen fehlen, die in R verfügbar sind, stehen die Pakete RCall[36] und Rif[37] zur Verfügung, und für den umgekehrten Fall RJulia,[38] um Julia von R aufzurufen.
Gadfly[39] ermöglicht es, in Julia statistische Grafiken zu erstellen. Um mit Verteilungen zu arbeiten, gibt es das Paket Distributions.[40]
Ohne eine gemeinsame Verwendung mit R existiert Rmath in Julia. Rmath ist eine Bibliothek von R, die einfache statistische Funktionen enthält. Julia verwendet eine gepatchte Version von Rmath, die dSFMT (double precision SIMD-oriented Fast Mersenne-Twister) als zu Grunde liegenden Zufallszahlengenerator für schnellere normalverteilte Zufallszahlen nutzt.[41][42]
Praktisch gesehen stellen Multimethoden die objektorientierte Programmierung auf den Kopf: Anstelle der Kapselung von Funktionen oder Methoden in Datenstrukturen oder Objekten werden Funktionen effektiv für verschiedene Datenstrukturen überladen.
Anzeige von Assemblercode
Die kompilierte Assemblersprache lässt sich für jede gerade erst eingegebene Funktion anzeigen. Selbst für eingebaute Funktionen wie den Additionsoperator +
ist dies möglich. Bei Operatoren wie +
handelt es sich in Julia ebenso lediglich um Funktionen, was durch syntaktischen Zucker ermöglicht wird:
julia> code_native(+, (Float64, Float64))
.text
Filename: float.jl
Source line: 120
push RBP
mov RBP, RSP
Source line: 120
addsd XMM0, XMM1
pop RBP
ret
Implementierung
Der Kern von Julia wurde in C und C++ implementiert, der Parser in Scheme (femtolisp[43]), außerdem wurde das LLVM-Compilerframework dazu verwendet, optimierten 64-Bit- oder 32-Bit-Maschinencode Just-in-time (JIT) zu generieren. Abgesehen von wenigen Ausnahmen (wie libuv) wurde die Standardbibliothek in Julia selbst geschrieben. Die Ausführungsgeschwindigkeit von Julia ist besonders hoch im Vergleich zu Sprachen, die ähnliche Zwecke erfüllen. Optimierter C-Code ist meist höchstens doppelt so schnell wie Julia-Code, sodass Julia-Code eine Größenordnung schneller ausgeführt wird als Python- oder R-Code.[44] Die Entwicklung von Julia begann 2009, eine Open-Source-Version wurde im Februar 2012 veröffentlicht.[45]
Julia verwendet einen Mark-and-Sweep-Garbage-Collector zur Speicherbereinigung. Für hochperformante Zahlenverarbeitung stellt diese Wahl kein Problem dar. Bei Berechnungen in Echtzeit, wie etwa bei Audioverarbeitung, kann eine inkrementelle Implementierung des Garbage Collectors deutlich bessere Ausführungsgeschwindigkeit liefern.[46] In der Version 0.4-dev wurde ein neuer Garbage Collector implementiert, der bis zu doppelt so schnell sein kann wie der in den stabilen Versionen 0.3.x.[47]
Der Versionszweig 0.3 hatte einen Zeitplan von einem Release pro Monat, in dem Fehler behoben und einige neue Funktionen von 0.4 übertragen wurden.
Im November 2015 wurde bekannt, dass die Gordon-und-Betty-Moore-Stiftung 600.000 US-Dollar für die Entwicklung der Sprache gespendet hatte, um so Version 1.0 zu erreichen.[48]
Am 8. August 2018 wurde die Version 1.0.0 veröffentlicht.[49]
Aktuelle und geplante Plattformen
Auch wenn Julia-JIT die LLVM verwendet[50] (MCJIT[51] der LLVM), wird nativer Maschinencode generiert, sobald eine Funktion erstmals ausgeführt wird. Im Gegensatz zu Java oder Dalvik wird in Julia kein in einer virtuellen Maschine laufender Bytecode generiert.
Aktuell gut unterstützt (Tier 1) werden neuere x86- und ältere i386-Prozessorarchitekturen, zusätzlich in Linux die 64-Bit ARMv8 und die 64-Bit Nvidia PTX.
Von einigen Tests ist bekannt, dass sie fehlschlagen, und Stacktraces sind nicht verfügbar[52] mit Alpha-Unterstützung für den Raspberry Pi 1 und Pi 2[53][54] jedoch startet Julia [auf ARMv7] Samsung Chromebook […] ohne Probleme[55], an PowerPC wird noch gearbeitet.[56][57]
Einbindung in andere Sprachen
Die Julia-C-API erlaubt es, Julias gesamte Laufzeitumgebung inklusive Bibliotheken innerhalb von C-Programmen auszuführen, ohne Daten kopieren zu müssen. Sprachen, die C aufrufen können, werden unterstützt (solange die CPU von allen drei Umgebungen unterstützt wird), wie beispielsweise C++, möglicherweise C# (für C# unter Windows 8.1 ist Version 0.4 nötig).[58] Außerdem wird Python unterstützt,[59] wobei Aufrufe, auch rekursive, in beide Richtungen möglich sind.[60] Für Sprachen, die Ausnahmen unterstützen, können Ausnahmen in Julia abgefangen und in der Zielsprache erneut geworfen werden (in C, das keine Ausnahmen unterstützt, müssen diese in Julia abgefangen und behandelt werden).
Es gibt eine Bibliothek, die C++ direkt aufruft, ohne C zu verwenden, und so Name-Mangling vermeidet. So können auch Methoden zum Einsatz kommen, die auf sogenannte Staged Functions angewiesen sind; dies ist jedoch erst ab Version 0.4.0-dev möglich.
Ein Compiler nach JavaScript, der die Ausführung im Browser erlaubt, befindet sich in Entwicklung.[61]
Transcompiler Julia2C
Der Transcompiler Julia2C,[62] ein von Intel Labs erstellter Fork von Julia, übersetzt Funktionen oder ganze Programme mit der Syntax von Julia in C-Code statt nativen Maschinencode, um so Kompatibilität mit anderen CPUs zu gewährleisten. Der Compiler soll es ermöglichen, Code auf einer höheren Ebene als C zu analysieren.[63]
Alternativen
Die älteste Alternative zu Julia und gleichzeitig eines der Vorbilder ist MATLAB, eine Sprache und Desktop-Umgebung, die seit 1984 kommerziell von MathWorks entwickelt und vertrieben wird.
Da die Routinen für lineare Algebra in Julia auf den quelloffenen Fortran-Bibliotheken LAPACK und BLAS basieren, existieren mehrere Alternativen zu diesen Aufgabenbereichen mit gleicher numerischer Qualität. Vom französischen INRIA (Institut National de Recherche en Informatique et en Automatique) stammt Scilab/Xcos. Im Rahmen des GNU-Projektes ist GNU Octave entstanden. Ein weiteres Beispiel ist das Softwarepaket FreeMat.
NumPy und Matplotlib sind Python-Bibliotheken, die Python um wissenschaftliches Rechnen und Analysefunktionen erweitern. NumPy basiert ebenfalls auf LAPACK und BLAS.
Zwei weitere Alternativen sind die JVM-basierte Programmiersprache Scala (mit der Programmbibliothek ND4S) und ILNumerics, das auf .NET aufsetzt.
Die größeren Computeralgebrasysteme wie Maple und Mathematica sind vor allem für symbolische Berechnungen gedacht und enthalten numerische Algorithmen.
Siehe auch
Weblinks
Einzelnachweise
- LICENSE.md. GitHub.
- Contributors to JuliaLang/julia. GitHub.
- github.com
- Julia Documentation. Abgerufen am 14. Januar 2022 (englisch).
- Chambers, John M.,: Extending R. Boca Raton, FL 2016, ISBN 978-1-4987-7572-4.
- The Julia Language.
- Avi Bryant: Matlab, R, and Julia: Languages for data analysis. O’Reilly Strata. 15. Oktober 2012.
- Paul Krill: New Julia language seeks to be the C for scientists. InfoWorld. 18. April 2012.
- Klint Finley: Out in the Open: Man Creates One Programming Language to Rule Them All. Wired. 3. Februar 2014.
- dotnetpro.de: Julia schlägt Python, Matlab, Octave und R. Neue Mediengesellschaft Ulm mbH, 3. April 2012, abgerufen am 20. März 2017.
- Suspending Garbage Collection for Performance... good idea or bad idea?.
- groups.google.com
- github.com
- groups.google.com
- build_executable.jl
- Interacting With Julia
- Siehe auch: docs.julialang.org für String Interpolation
- Julia Documentation (englisch) In: julialang.org. Abgerufen am 16. Januar 2022.
- Learn Julia in Y Minutes
- METADATA.jl (zentrales Paketverzeichnis für Julia)
- BinDeps.jl
- WinRPM.jl
- Julia Package Library. In: Julialang.org. Abgerufen am 18. November 2014.
- JavaCall.jl
- Mathematica.jl
- Julia aus Mathematica aufrufen. Abgerufen am 9. April 2015.
- Verwendung von Rust in Perl und Julia. Archiviert vom Original am 16. Februar 2020. Abgerufen am 15. Mai 2015: „Julia is even easier to use [than Perl, in the given example]“
- Stefan Karpinski: Julia and the Rust Language. 5. September 2013. Abgerufen am 15. Mai 2015: „Since Rust uses the C ABI, we can already call Rust libraries just as well as C. I have no idea what Erlang’s ABI is like, but if it can expose a C ABI, then we can call it. Beyond that would take some work but is certainly possible.“
- Polyglot.jl
- ICU.jl
- UnicodeExtras.jl
- Blink.jl
- JGUI.jl
- ODBC.jl
- Lazy.jl
- RCall.jl
- Rif.jl
- RJulia.jl
- Gadfly.jl
- distributionsjl.readthedocs.org
- dmbates.blogspot.com
- github.com
- femtolisp
- Julia: A Fast Dynamic Language for Technical Computing (PDF) 2012.
- Mark Gibbs: Pure and Julia are cool languages worth checking out. In: Network World. 9. Januar 2013. Abgerufen am 21. März 2017.
- github.com WIP: Incremental GC
- github.com Generational behavior for the garbage collector
- Rainald Menge-Sonnentag: Programmiersprachen: Finanzspritze soll Julia auf Release-Kurs bringen. In: heise Developer. Heise Medien GmbH & Co. KG, 16. November 2015, abgerufen am 18. November 2015.
- The Julia Blog Julia 1.0
- Support MCJIT. Abgerufen am 26. Mai 2015.
- Using MCJIT with the Kaleidoscope Tutorial. 22. Juli 2013. Abgerufen am 26. Mai 2015.
- README.arm.md auf GitHub. Abgerufen am 16. Januar 2022.
- Cross-compiling for ARMv6. Abgerufen am 16. Mai 2015: „I believe #10917 should fix this. The CPU used there arm1176jzf-s.“
- ARM build failing during bootstrap on Raspberry Pi 2. Abgerufen am 16. Mai 2015: „I can confirm (FINALLY) that it works on the Raspberry Pi 2 [..] I guess we can announce alpha support for arm in 0.4 as well.“
- github.com
- Make.powerpc auf GitHub
- Porting Julia to PowerPC. Abgerufen am 9. Mai 2015: „Wow, the latest git allows me to build to completion.“
- Unable to use 'libjulia.dll' in a C# application on Windows 8.1.
- github.com
- Embedding Julia
- Support compiling to JavaScript with Emscripten. Abgerufen am 28. Januar 2015.
- github.com
- Julia2C initial release.: „By translating Julia to C, we leverage the high-level abstractions (matrix, vector, ..), which are easier to analyze, and can potentially add the rich extensions of C (like openmp, tbb, …). The tool may also extend Julia to new architectures where the only available tool chain is for C […]. Translation from C to Julia might be harder.“