Julia (Programmiersprache)

Programmiersprache
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 9. Dezember 2016 um 16:40 Uhr durch 141.58.138.101 (Diskussion) (Alternativen). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Julia ist eine höhere High-Performance-Programmiersprache, welche vor allem für numerisches und wissenschaftliches Rechnen entwickelt wurde, während sie dennoch als eine General Purpose Language verwendet werden kann, bei gleichzeitiger Wahrung einer hohen Ausführungsgeschwindigkeit.[7][8][9][10][11] Die Syntax erinnert stark an Matlab, wie auch andere technische Programmiersprachen. Julia wurde in C, C++ und Scheme geschrieben, die Standardbibliothek ist aber in Julia selbst geschrieben. Die Entwicklung begann schon im Jahr 2009, die erste Open-Source-Version hingegen wurde erst im Februar 2012 veröffentlicht. Von der Geschwindigkeit her kann Julia in dem Bereich von C und auch Fortran eingeordnet werden, wohingegen andere wissenschaftliche Sprachen wie beispielsweise MATLAB, GNU Octave oder R signifikant langsamer sind. Charakterisiert wird das Design der Sprache durch ein Typsystem, das parametrisierte Typen erlaubt, eine komplett 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[12] und enthält effiziente Implementierungen zu Operationen mit Gleitkommazahlen und zur linearen Algebra, zur Generierung von Zufallszahlen und zur Verarbeitung regulärer Ausdrücke.

Julia
Official Julia logo
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: 0.5.0  (19. September 2016[3][4])
Aktuelle Vorabversion: 0.5.0-rc3  (23. August 2016[5])
Typisierung: dynamisch mit Typinferenz
Wichtige Implementierungen: Julia JIT (just-in-time) compiler
Beeinflusst von: Matlab, Scheme, Lisp, ML, Cecil, Dylan, PyPy, Perl, R, Ruby, Lua[6]
Betriebssystem: Linux, OS X, FreeBSD, Windows
Lizenz: MIT-Lizenz, GPL, LGPL, BSD
julialang.org

Eigenschaften

Die offizielle Website stellt folgende Eigenschaften als wichtig heraus:

Julia wurde stark von Lisp-Dialekten, in erster Linie Scheme und Common Lisp, beeinflusst und teilt auch Elemente von 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 benutzerdefinierte Funktionen, welche zuvor als generisch deklariert wurden, mit Multimethoden erweitert werden können.

Jedoch ist in Julia, Dylan und Fortress 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[15] macht es möglich eigenständig lauffähige ausführbare Dateien mit build_executable.jl[16] zu erstellen, während Julia standardmäßig, ähnlich wie Python, vorinstalliert sein muss.

Benutzerinteraktion

Julia enthält standardmäßig ein interaktives Kommandozeilenprogramm (Julias REPL), welches zum Experimentieren und schnellen Testen von Code verwendet werden kann.[17] Ein Ausschnitt aus dem REPL (Read–eval–print loop) könnte wie folgt aussehen:[18]

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. Siehe die Julia Dokumentation für weitere Beispiele,[19] welche Codebeispiele liefert, die direkt in REPL eingegeben oder in einer separaten Datei mit einer .jl-Endung gespeichert werden können, welche durch $ julia <filename> in der System-Shell aufgerufen wird.[20]

Paketmanager

In Julias Paketmanager ist jedes Paket (Programmbibliothek) ein Git-Repository, welches an einem beliebigen öffentlich erreichbaren Ort gespeichert werden kann. Die Abhängigkeiten zu Paketen wird in METADATA.jl[21] verwaltet, wodurch eine Installation von Paketen über Julia mit Pkg.add("PaketName") ermöglicht wird.

Üblicherweise werden Pakete in Julia geschrieben; sie können jedoch auch Quellcode für C, Fortran, Python oder andere Sprachen (durch BinDeps.jl) enthalten, solange ein entsprechender Compiler installiert ist, welcher den Quellcode beim Installieren des Pakets kompiliert. Alternativ ist es möglich Maschinencode durch WinRPM.jl einzuschließen. Um installierte Pakete in Julia zu laden, wird using PaketName verwendet. Eine Aktualisierung von Julias installierten Paketen ist mit Pkg.update() möglich.

Verwendung mit anderen Sprachen

Viele Pakete[22] sind verfügbar um andere Sprachen innerhalb von Julia aufzurufen. Beispielsweise ist das Paket JavaCall.jl verfügbar, um Java von Julia aus aufzurufen;[23] Mathematica.jl, um Mathematica aufzurufen,[24] das Aufrufen von Rust ist möglich, [25][26] und node-julia erlaubt (jedoch zurzeit nicht unter Windows). [27] JavaScript/node.js die Verwendung für asynchrone (Web-) Server. Für PHP, Perl und andere Sprachen, erlaubt Polyglot.jl einen transparenten Fernaufruf und rekursive Auswertung von Funktionen in anderen Sprachen, so als wären sie reguläre Julia-Funktionen. Es erlaubt auch anderen Sprachen Julia-Funktionen aufzurufen, so als wären sie nativ. [28] Julia hat 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.jl, ein Wrapper für International Components for Unicode und UnicodeExtras.jl für eine erweiterte Unicodeunterstützung verwendet werden. Außerdem ist für die Erstellung und das Arbeiten mit Browserfenstern das Paket Blink.jl 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 OS X) plattformunabhängige GTK+, Qt (verwendet PySide, welches in Python geschrieben wurde), Tk oder JGUI.jl, welches die Unterschiede der vorherigen verbirgt und das verwendet, was verfügbar ist.

Es gibt zahlreiche einzelne SQL- oder NoSQL-Datenbankenschnittstellen und das generische ODBC.jl für datenbankübergreifenden Zugriff.

Während Julia standardmäßig Eager Evaluation (frühe Auswertung) verwendet, liefert das Lazy.jl-Paket Grundlagen für funktionales Programmieren - Lazily-evaluated-Listen und eine große Bibliothek von Funktionen, um mit diesen zu arbeiten.[29]

Verwendung für Statistik- und Datenanalyse

Julia wurde mit dem Ziel erschaffen, so einfach für Statistik zu sein wie R es ist.[11]

Für den Fall, dass Julia Statistikfunktionen fehlen, die in R verfügbar sind, stehen die Pakete RCall.jl und Rif.jl zur Verfügung,[30] und für den umgekehrten Fall, RJulia.jl um Julia von R aufzurufen.

Gadfly.jl ist verfügbar um in Julia statistische Grafiken zu erstellen. Um mit Verteilungen zu arbeiten gibt es das Paket Distributions.jl.[31]

Ohne eine gemeinsame Verwendung mit R existiert Rmath in Julia. Rmath ist eine Bibliothek von R, welche einfache statistische Funktionen enthält. Julia verwendet eine gepatchte Version von Rmath, welche DSFMT als zu Grunde liegenden Zufallszahlengenerator für schnellere normalverteilte Zufallszahlen beinhaltet.[32][33]

Es gibt mittlerweile genug Pakete, welche zusammengenommen Julia in ihrem gesamten Potential aufleben lassen könnten und sie zur Sprache der nächsten Generation für Datenanalyse werden lassen könnte.[34] Für einen Überblick, siehe den STATISTICS-Abschnitt (und Operations Research, Economics and Valuation – Finance).

Praktisch gesehen stellen Multimethoden die objektorientierte Programmierung auf den Kopf, statt das Verkapseln von Funktionen oder Methoden in Datenstrukturen oder Objekten, werden die Funktionen effektiv für verschiedene Datenstrukturen überladen. Das objektorientierte Paradigma ist kein natürlicher Weg für Daten- und Algorithmenwissenschaftler zu arbeiten, einer der großartigen Dinge von R ist, dass es erlaubt, Programme einfach und schnell zu schreiben indem man eine angenehme und mächtige Programmierschittstelle zur Verfügung stellt. Julia bringt dies einen Schritt weiter und macht es explizit und klar, dass wir Funktionen für spezifische Datenstrukturen schreiben, jedoch mit der Option, „catch-all“ Funktionen zu schreiben, um mit beliebigen Datentypen umzugehen. Manchmal wird gefragt, ob R oder Python die am häufigsten verwendete „datenwissenschaftliche“ Programmiersprache sein wird, jetzt haben wir einen Außenseiter, einen Späteinsteiger im Rennen, einen Neuzugang, der sich eines Tages diese besondere Krone schnappen könnte.[35]

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, jedoch erst, nachdem sie mindestens ein Mal aufgerufen wurden. Bei Operatoren wie + handelt es sich in Julia ebenso lediglich um Funktionen, was durch syntaktischen Zucker ermöglicht wird:

julia> code_native(+, (Float64, Float64))
Warning: Unable to find function pointer
ERROR: no method found for the specified argument types
 in code_native at reflection.jl:159

julia> 1.0 + 2.0
3.0
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

Implementation

Der Kern von Julia wurde in C und C++ implementiert, der Parser in Scheme (femtolisp), 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 Python- oder R-Code.[36] Die Entwicklung von Julia begann 2009, eine Open-Source-Version wurde im Februar 2012 veröffentlicht.[37]

Julia verwendet einen Mark-and-Sweep-Garbage-Collector. Für typische hochperformante Zahlenverarbeitung stellt diese Wahl kein Problem dar. Bei Berechnungen in Echtzeit, wie etwa bei Audioverarbeitung, kann dies der Fall sein, dann liefert eine inkrementelle Implementierung des Garbage Collectors deutlich bessere Performance.[38] In der Version 0.4-dev wurde ein neuer Garbage Collector implementiert, welcher bis zu doppelt so schnell sein kann wie der in den stabilen Versionen 0.3.x.[39]

Der Versionszweig 0.3 hat einen Zeitplan von einem Release pro Monat in welchem Fehler behoben werden und einige neue Funktionen von 0.4 übertragen werden.

Im November 2015 wurde eine Spende der Gordon and Betty Moore Foundation in Höhe von 600.000 US-Dollar bekannt um die Entwicklung der Sprache voranzutreiben und Version 1.0 zu erreichen.[40]

Aktuelle und geplante Plattformen

Auch wenn Julia-JIT LLVM verwendet[41] (MCJIT[42] der LLVM), wird dennoch nativer Maschinencode generiert, sobald eine Funktion das erste Mal ausgeführt wird. Im Gegensatz zu Java oder Dalvik wird in Julia kein in einer virtuellen Maschine laufender Bytecode generiert.

Unterstützt werden neuere x86- und ältere i386-Prozessorarchitekturen, außerdem wird in der Version 0.4.0-dev die 32-Bit ARMv7 unterstützt (Experimental and early support[43] während die Ergebnisse noch unfertig sind, Von einigen Tests ist bekannt, dass sie fehlschlagen, und Backtraces sind nicht verfügbar[44] mit Alpha-Unterstützung für das Raspberry Pi 1/2[45][46] jedoch startet Julia [auf ARMv7] Samsung Chromebook […] ohne Probleme[47]), an PowerPC wird noch gearbeitet.[48][49]

Einbindung in andere Sprachen

Die Julia-C-API erlaubt es, dass Julia-Funktionen (das heißt die gesamte Laufzeitumgebung inklusive Bibliotheken) von C-Programmen ausgeführt werden können, ohne Daten kopieren zu müssen. Sprachen, die C aufrufen können, werden unterstützt (ausgenommen dem Fall, dass die CPU nicht 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).[50] Außerdem wird Python unterstützt,[51] wobei Aufrufe, auch rekursive, in beide Richtungen möglich sind.[52] Für Sprachen, die Ausnahmen unterstützen, können die Ausnahmen, die in Julia geworfen werden, abgefangen werden und in der Zielsprache erneut geworfen werden (in C, welches keine Ausnahmen unterstützt, sollten diese in Julia abgefangen und behandelt werden).

Es gibt eine Bibliothek um C++ aufzurufen (ohne dass C verwendet werden muss um Name-Mangling zu vermeiden), welche auf sogenannte Staged Functions angewiesen sind; dies ist jedoch erst ab Version 0.4.0-dev möglich.

Ein Compiler nach JavaScript um Ausführungen im Browser zu erlauben befindet sich in Entwicklung.[53]

Source-to-source-Compiler Julia2C

Der Source-to-source-Compiler Julia2C,[54] ein Fork von Julia, erstellt von Intel Labs, kann Funktionen oder ganze Programme mit der Syntax von Julia statt nativem Maschinencode als C-Code produzieren, um Kompatibilität mit anderen CPUs zu gewährleisten. Der Compiler soll es ermöglichen, Code auf einer höheren Ebene als C zu analysieren.[55]

Alternativen

Da Julia als Sprache auf den quelloffenen Bibliotheken LAPACK und BLAS basiert, existieren mehrere Alternativen zu Julia mit mindestens gleicher numerischer Qualität. Diese Alternativen fokussieren sich oft auf die Möglichkeiten als Programmiersprache. Vom französischen INRIA (Institut National de Recherche en Informatique et en Automatique) stammt die Alternative Scilab/Xcos. Im Bereich der freien Software gibt es mehrere quelloffene Projekte, welche jedoch meist die Funktionalität von Matlab nachbilden und einzelne Aspekte hervorheben. Im Rahmen des GNU-Projektes ist GNU Octave entstanden, das in weiten Teilen codekompatibel zu Matlab ist. Ein anderes ist das Softwarepaket FreeMat.

Matplotlib und NumPy sind Python-Bibliotheken, die Python um wissenschaftliches Rechnen und Analysefunktionen ausbauen. NumPy basiert ebenfalls auf LAPACK und BLAS. Die Syntax von Python/NumPy unterscheidet sich von Julia, möchte jedoch vergleichbar einfach sein.

Zwei weitere Alternativen sind Scala, eine JVM-basierte Programmiersprache, und ILNumerics, welches auf .NET aufsetzt.

Die größeren Computeralgebrasysteme wie Maple und Mathematica sind vor allem für symbolische Berechnungen gedacht und enthalten numerische Algorithmen.

Die älteste Alternative zu und gleichzeitig eines der Vorbilder von Julia ist MATLAB, eine Sprache und Desktopumgebung, die seit 1984 kommerziell von The MathWorks entwickelt und vertrieben wird.

Siehe auch

Commons: Julia – Sammlung von Bildern, Videos und Audiodateien

Einzelnachweise

  1. LICENSE.md. GitHub;
  2. Contributors to JuliaLang/julia. GitHub;
  3. github.com
  4. github.com
  5. github.com
  6. julia.readthedocs.org
  7. The Julia Language.
  8. Avi Bryant: Matlab, R, and Julia: Languages for data analysis. O’Reilly Strata, 15. Oktober 2012;.
  9. Paul Krill: New Julia language seeks to be the C for scientists. InfoWorld, 18. April 2012;.
  10. Klint Finley: Out in the Open: Man Creates One Programming Language to Rule Them All. Wired, 3. Februar 2014;.
  11. a b dotnetpro.de: Julia schlägt Python, Matlab, Octave und R. Neue Mediengesellschaft Ulm mbH, 3. April 2012, abgerufen am 28. Mai 2016.
  12. Suspending Garbage Collection for Performance... good idea or bad idea?
  13. groups.google.com
  14. github.com
  15. groups.google.com
  16. build_executable.jl
  17. Julia REPL documentation
  18. Siehe auch: julia.readthedocs.org für String Interpolation und string(greet, ", ", whom, ".\n") Beispiel als bevorzugten Weg, Strings zu verbinden. Auch wenn der + Operator nicht für die Verkettung von Strings verwendet wird, wäre es ein Leichtes dies zu tun.
  19. Julia Documentation. In: julialang.org. Abgerufen am 18. November 2014.
  20. Learn Julia in Y Minutes
  21. METADATA.jl (central package listing for Julia)
  22. Julia Package Library. In: Julialang.org. Abgerufen am 18. November 2014.
  23. aviks.github.io
  24. Julia aus Mathematica aufrufen. Abgerufen am 9. April 2015.
  25. Verwendung von Rust in Perl und Julia. Abgerufen am 15. Mai 2015: „Julia is even easier to use [than Perl, in the given example]“
  26. 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.“
  27. Limitations. In: node-julia. Abgerufen am 28. Mai 2016.
  28. github.com
  29. github.com
  30. github.com
  31. distributionsjl.readthedocs.org
  32. dmbates.blogspot.com
  33. github.com
  34. johnmyleswhite.com
  35. active-analytics.com
  36. Julia: A Fast Dynamic Language for Technical Computing. (PDF) 2012;.
  37. Mark Gibbs: Pure and Julia are cool languages worth checking out. In: Network World. 9. Januar 2013, abgerufen am 7. Februar 2013.
  38. github.com WIP: Incremental GC
  39. github.com Generational behavior for the garbage collector
  40. 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.
  41. Support MCJIT. Abgerufen am 26. Mai 2015.
  42. Using MCJIT with the Kaleidoscope Tutorial. 22. Juli 2013, abgerufen am 26. Mai 2015.
  43. github.com
  44. github.com
  45. Cross-compiling for ARMv6. Abgerufen am 16. Mai 2015: „I believe #10917 should fix this. The CPU used there arm1176jzf-s.“
  46. 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.“
  47. github.com
  48. github.com
  49. Porting Julia to PowerPC. Abgerufen am 9. Mai 2015: „Wow, the latest git allows me to build to completion.“
  50. Unable to use 'libjulia.dll' in a C# application on Windows 8.1.
  51. github.com
  52. julia.readthedocs.org
  53. Support compiling to JavaScript with Emscripten. Abgerufen am 28. Januar 2015.
  54. github.com
  55. 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.“