Wie ausgereift ist das wissenschaftliche Computersprachenprojekt „Julia“?

55

Ich denke darüber nach, eine neue Sprache zu lernen, um sie für numerische / Simulationsmodellierungsprojekte zu verwenden, als (teilweisen) Ersatz für das C ++ und Python, das ich derzeit verwende. Ich bin auf Julia gestoßen , was irgendwie perfekt klingt. Wenn es alles tut, was es behauptet, könnte ich es verwenden, um sowohl C ++ als auch Python in all meinen Projekten zu ersetzen , da es auf hochrangigen wissenschaftlichen Computing-Bibliothekscode (einschließlich PyPlot) zugreifen und Schleifen mit einer ähnlichen Geschwindigkeit wie C ausführen kann. Ich würde auch von Dingen wie richtigen Koroutinen profitieren, die es in keiner der anderen Sprachen gibt.

Es ist jedoch ein relativ neues Projekt, derzeit in Version 0.x, und ich habe verschiedene Warnungen (die zu verschiedenen Zeitpunkten in der Vergangenheit veröffentlicht wurden) erhalten, dass es nicht ganz für den täglichen Gebrauch geeignet ist. Aus diesem Grund hätte ich gerne Informationen zum aktuellen Projektstatus (Februar 2014 oder wann immer eine Antwort veröffentlicht wird), damit ich beurteilen kann, ob ich persönlich in Betracht ziehen sollte, die Zeit zum Erlernen dieser Sprache zu diesem Zeitpunkt zu investieren.

Ich würde mich über Antworten freuen, die sich auf spezifische relevante Fakten über das Julia-Projekt konzentrieren . Meinungen, die auf Erfahrungen mit anderen Projekten beruhen, interessieren mich weniger.

Insbesondere deutet ein Kommentar von Geoff Oxberry darauf hin, dass sich die Julia-API noch im Fluss befindet und dass der Code aktualisiert werden muss, wenn er geändert wird. Ich möchte eine Vorstellung davon bekommen, inwieweit dies der Fall ist: Welche Bereiche der API sind stabil und welche werden sich voraussichtlich ändern?

Typischerweise würde ich meistens lineare Algebra (zB Lösen von Eigenproblemen), numerische Integration von ODEs mit vielen Variablen und Zeichnen mit PyPlot und / oder OpenGL sowie Zahlenverarbeitung im C-Stil (zB für Monte-Carlo-Simulationen) durchführen ). Ist Julias Bibliothekssystem in diesen Bereichen vollständig entwickelt? Ist die API insbesondere für diese Art von Aktivitäten mehr oder weniger stabil, oder stelle ich fest, dass mein alter Code nach dem Upgrade auf eine neue Version von Julia zum Absturz neigt?

Gibt es noch andere Punkte, die es wert wären, in Betracht gezogen zu werden, um zu entscheiden, ob Julia zum gegenwärtigen Zeitpunkt für ernsthafte Arbeit eingesetzt werden soll?

Nathaniel
quelle
2
Diese Frage passt möglicherweise nicht zum Stack Exchange-Format, da sie subjektiv ist. Ich kenne einige Leute, die sich in Julia aktiv entwickeln, es lieben und denken, dass es zur Hauptsendezeit bereit ist (solange Sie bereit sind, Ihre Codebasis als Reaktion auf Änderungen in der Julia-API zu aktualisieren). Es gibt andere Leute, die nicht das Bedürfnis haben, Julia zu benutzen (wie ich).
Geoff Oxberry
1
Subjektiv zu sein, macht eine Frage für sich genommen nicht für das Stack Exchange-Format ungeeignet - siehe blog.stackoverflow.com/2010/09/good-subjective-bad-subjective . Wenn Sie eine Website-Richtlinie gegen subjektive Fragen haben, entschuldige ich mich. Ich denke jedoch, dass es nur ein bisschen subjektiv ist: Schon Ihr Kommentar gibt mir eine bessere Vorstellung von der Situation, als ich es vor dem Stellen der Frage hatte. Für einen Außenstehenden kann es sehr schwierig sein, eine ungefähre Vorstellung davon zu bekommen, wie ausgereift ein Projekt ist.
Nathaniel
Ihr Punkt zu API-Änderungen scheint mir ziemlich wichtig zu sein, daher habe ich der Frage einen Absatz hinzugefügt, in dem speziell nach Einzelheiten gefragt wird. Wenn das Aktualisieren von Julia dazu neigt, meinen alten Code zu beschädigen, könnte dies zu diesem Zeitpunkt für mich ein ziemlicher Deal-Breaker sein.
Nathaniel
Sie haben absolut Recht mit "gut subjektiv versus schlecht subjektiv" (einem meiner bevorzugten Stack Exchange-Blogposts). Ich habe den Kommentar gepostet, weil ich auf die Antwort warte. Mit diesen "was denkst du über _____?" Fragen, Antworten können sich auf ein paar sehr gut durchdachte Beiträge beschränken, oder sie können sich ausbreiten, sich überall wiederholen, "ich auch!" Beiträge. Ersteres ist großartig; Letzteres ist nicht der Fall, daher gebe ich Ihnen mit freundlicher Genehmigung die Möglichkeit zu sagen: Mal sehen, wie sich dieses Spiel entwickelt.
Geoff Oxberry
3
Vielen Dank für die Buchung eines Kopfgeldes, @AntonMenshov. Ich stelle fest, dass Julia jetzt die Version 1.0 bestanden hat (die es 2014 noch nicht gab, als ich dies gepostet habe), also wäre es in der Tat sehr gut, eine aktuelle Antwort zu haben.
Nathaniel

Antworten:

43

Julia, zu diesem Zeitpunkt (Mai 2019, Julia v1.1 mit v1.2 kurz vor dem Erscheinen) ist für das wissenschaftliche Rechnen ziemlich ausgereift. Die Version 1.0 bedeutete ein Ende des jährlichen Codefehlers . Damit hatten viele wissenschaftliche Computer-Bibliotheken die Zeit, einfach ohne Unterbrechung zu wachsen. Eine breite Übersicht über Julia-Pakete finden Sie unter pkg.julialang.org .

Für das wissenschaftliche Kernrechnen die Bibliothek DifferentialEquations.jl für Differentialgleichungen (ODEs, SDEs, DAEs, DDEs, Gillespie-Simulationen usw.), Flux.jl für neuronale Netze und die JuMP- Bibliothek für mathematische Programmierung (Optimierung: linear, quadratisch, Mixed Integer, etc. Programming) sind drei der Eckpfeiler des Scientific Computing-Ökosystems. Insbesondere die Differentialgleichungsbibliothek ist weitaus weiter entwickelt als in anderen Sprachen. Ein großes Entwicklerteam implementiert Funktionen wie EPIRK-Integratoren , Runge-Kutta-Nystrom , Differentialgleichung für steife / Differential-Algebraische Verzögerung undadaptive Zeit steife stochastische Differentialgleichung Integratoren, zusammen mit einer Reihe von anderen Leckereien , wie adjungierten Sensitivitätsanalyse , chemische Reaktion DSLs , matrixfreien Newton-Krylov und voll (Datenübertragung frei) GPU - Kompatibilität, mit der Ausbildung von neuronalen Differentialgleichungen , die alle mit Fantastische Benchmark-Ergebnisse (Haftungsausschluss: Ich bin der Hauptentwickler).

Was das gereifte Julia-Ökosystem ein wenig irritiert, ist seine Komposition. Wenn jemand eine generische Bibliotheksfunktion wie die in DifferentialEquations.jl erstellt, können Sie im Wesentlichen einen beliebigen AbstractArray / Number-Typ verwenden, um neuen Code im laufenden Betrieb zu generieren. So gibt es beispielsweise eine Bibliothek für die Fehlerweitergabe ( Measurements.jl ). Wenn Sie diese in den ODE-Solver einfügen, wird automatisch eine neue Version des ODE-Solvers kompiliert, die die Fehlerweitergabe ohne Parameterabtastung ausführt . Aus diesem Grund werden einige Funktionen möglicherweise nicht dokumentiert, da sich der Code für die Funktionen von selbst generiert, und Sie müssen daher mehr über die Bibliothekszusammensetzung nachdenken.

Eine der Möglichkeiten, wie Komposition am nützlichsten ist, ist die lineare Algebra. Mit den ODE-Solvern können Sie beispielsweise jac_prototypeden Typ für den Jacobian angeben , der intern verwendet wird. Natürlich gibt es Dinge in der LineraAlgebra Standardbibliothek wie Symmetricund TridiagonalSie können hier verwenden, aber die Nützlichkeit von composibility in Art generischen Algorithmen gegeben haben mittlerweile Menschen gegangen und gesamte Array - Typ - Bibliotheken gebaut. BandedMatrices.jl und BlockBandedMatrices.jl sind Bibliotheken, die (Block-) Banded-Matrix-Typen mit schnellen luÜberladungen definieren und so die Lösung von steifen MOL-Diskretisierungen von Systemen partieller Differentialgleichungen beschleunigen. PDMats.jlErmöglicht die Angabe von positiv-definitiven Matrizen. Mit Elemental.jl können Sie einen verteilten, spärlichen Jacobian definieren. CuArrays.jl definiert Arrays auf der GPU. Usw.

Dann haben Sie alle Ihre Nummerntypen. Unitful.jl prüft die Units zur Kompilierungszeit, sodass es sich um eine überlastungsfreie Units-Bibliothek handelt. DoubleFloats.jl ist eine schnelle Bibliothek mit höherer Genauigkeit, zusammen mit Quadmath.jl und ArbFloats.jl . ForwardDiff.jl ist eine Bibliothek für die automatische Differenzierung im Vorwärtsmodus, die die Arithmetik mit zwei Zahlen verwendet. Und ich kann diese weiterhin auflisten. Und ja, Sie können sie in ausreichend generische Julia-Bibliotheken wie DifferentialEquations.jl werfen, um eine speziell für diese Zahlentypen optimierte Version zu kompilieren. Sogar so etwas wie ApproxFun.jlDas heißt, Funktionen als algebraische Objekte (wie Chebfun) funktionieren mit diesem generischen System und ermöglichen die Angabe von PDEs als ODEs auf Skalaren in einem Funktionsraum.

Angesichts der Vorteile der Kompatibilität und der Art und Weise, wie Typen verwendet werden können, um neuen und effizienten Code für generische Julia-Funktionen zu generieren, wurde viel Arbeit geleistet, um die Implementierung der grundlegenden Funktionen für wissenschaftliches Rechnen in pure Julia zu ermöglichen. Optim.jl für die nichtlineare Optimierung, NLsolve.jl für die Lösung nichtlinearer Systeme, IterativeSolvers.jl für die iterative Lösung linearer Systeme und Eigensysteme, BlackBoxOptim.jl für die Black-Box-Optimierung usw. Selbst die neuronale Netzwerkbibliothek Flux.jl verwendet nur CuArrays. jls automatische Kompilierung von Code zur GPU für deren GPU-Fähigkeiten. Diese Kompatibilität war der Kern dessen, was Dinge wie neuronale Differentialgleichungen in DiffEqFlux.jl erzeugt hat. Probabilistische Programmiersprachen wie Turing.jl sind inzwischen ebenfalls ausgereift und verwenden die gleichen zugrunde liegenden Tools.

Da Julias Bibliotheken so grundlegend auf Code-Generierungs-Tools basieren, sollte es nicht verwundern, dass die Code-Generierung eine Menge Tools enthält. Julias Broadcast-System generiert im laufenden Betrieb fusionierte Kernel, die von Array-Typen überlastet werden , um viele der oben genannten Funktionen bereitzustellen. CUDAnative.jl ermöglicht das Kompilieren von Julia-Code in GPU-Kernel. ModelingToolkit.jl entzieht ASTs automatisch einem symbolischen System zur Transformation von mathematischem Code. Cassette.jlMit dieser Option können Sie die vorhandene Funktion eines anderen Benutzers "überspielen" und deren Funktion vor dem Kompilieren mithilfe von Regeln ändern (z. B. alle Arrayzuordnungen in statische Arrayzuordnungen ändern und Vorgänge in die GPU verschieben). Dies ist ein fortgeschritteneres Tool (ich erwarte nicht, dass jeder, der wissenschaftliches Rechnen durchführt, die direkte Kontrolle über den Compiler übernimmt), aber so wird ein Großteil der Tools der nächsten Generation erstellt (oder vielmehr, wie die Features selbst geschrieben werden).

Als Parallelität habe ich GPUs erwähnt und Julia hat Multithreading und verteiltes Computing eingebaut . Das Multithreading von Julia wird in Kürze eine PARTR-Architektur (Parallel-Tasks Runtime) verwenden, mit der verschachteltes Multithreading automatisch geplant werden kann . Wenn Sie MPI verwenden möchten, können Sie einfach MPI.jl verwenden . Und dann ist die einfachste Möglichkeit, alles zu nutzen, die Verwendung eines AbstractArray-Typ-Setups, um die Parallelität in seinen Operationen zu verwenden.

Julia hat auch das grundlegende zugrunde liegende Ökosystem, das Sie von einer Allzwecksprache erwarten würden, die für wissenschaftliche Anwendungen verwendet wird. Es hat die Juno IDE mit einem eingebauten Debugger mit Haltepunkten , es hat Plots.jl für alle Arten von Plots. Eine Reihe spezifischer Tools sind ebenfalls hilfreich , beispielsweise aktualisiert Revise.jl Ihre Funktionen / Bibliothek automatisch, wenn eine Datei gespeichert wird. Sie haben Ihre DataFrames.jl , Statistikbibliotheken usw. Eine der schönsten Bibliotheken ist Distributions.jl, mit der Sie generische Algorithmen für die Distribution schreiben können (zum Beispiel:rand(dist)nimmt eine zufällige Anzahl der Distributionen, die übergeben wurden, und es gibt eine ganze Menge univariater und multivariater Distributionen (und natürlich erfolgt der Versand zur Kompilierungszeit, was alles so schnell wie das Hardcodieren einer für die Distribution spezifischen Funktion macht). Es gibt eine Reihe von Tools für die Datenverarbeitung , Webserver usw., die Sie benennen. An diesem Punkt ist es ausgereift genug, dass wenn es eine grundlegende wissenschaftliche Sache gibt und Sie erwarten würden, dass sie existiert, Sie sie einfach mit .jl oder Julia googeln und sie wird auftauchen.

Dann sind ein paar Dinge am Horizont zu beachten. PackageCompiler möchte Binärdateien aus Julia-Bibliotheken erstellen und hat bereits einige Erfolge erzielt, muss jedoch weiterentwickelt werden. Makie.jl ist eine komplette Bibliothek für GPU-beschleunigtes Plotten mit Interaktivität. Sie muss noch weiterentwickelt werden, möchte jedoch die wichtigste Plotbibliothek in Julia werden. Zygote.jl ist eine automatische Differenzierungsbibliothek von Quelle zu Quelle, die nicht die Leistungsprobleme eines Tracing-basierten AD (Flux's Tracker, PyTorch, Jax) aufweist und auf alle reinen Julia-Codes angewendet werden soll. Usw.

Zusammenfassend lässt sich sagen, dass es an vielen Orten viel Bewegung gibt, aber in den meisten Gebieten gibt es bereits eine solide, ausgereifte Bibliothek. Es ist nicht mehr an einem Ort, an dem Sie fragen: "Wird es adoptiert?": Julia wurde von genug Leuten adoptiert (Millionen von Downloads), dass es den Schwung hat, für immer da zu bleiben. Es hat eine wirklich nette Community. Wenn Sie also einmal in aller Ruhe über paralleles Rechnen oder numerische Differentialgleichungen sprechen möchten, sind einige der besten Chaträume dafür in Julialang Slack zu finden . Ob es sich um eine Sprache handelt, die Sie lernen sollten, ist eine persönliche Frage, und ob es sich um die richtige Sprache für Ihr Projekt handelt, ist eine technische Frage, die sich unterscheidet. Aber ist es eine Sprache, die ausgereift ist und die von einer großen, konsistenten Gruppe von Entwicklern unterstützt wird? Das scheint ja zu bejahen.

Chris Rackauckas
quelle
2
Gute Antwort. Eine Frage: Ermöglicht Julia eine anmutige Entwicklung vom Forschungscode zu einem Produktionssystem? Oder ist es eher ein Matlab, in dem es keine Hoffnung gibt?
user14717
6
Viele Pakete, wie z. B. DifferentialEquations.jl, wurden als Code für ein Forschungsprojekt gestartet . Mit Julias Paketsystem ist es ganz einfach, Arbeitscode für zukünftige Wartungsarbeiten in ein Paket mit CI und Komponententests zu konvertieren. Und die Tatsache, dass der meiste Code reine Julia ist, erleichtert die Bereitstellung erheblich, da Sie nicht viele Build-Systeme / Binärdateien warten müssen. Also würde ich definitiv Ja sagen. Wir haben einige proprietäre Codes, die in Kürze veröffentlicht werden. Was noch fehlt, ist die Erstellung von Binärdateien (PackageCompiler).
Chris Rackauckas
29

Wenn nicht, ist es möglich, eine ungefähre Schätzung der Größenordnung anzugeben, wie lange ich warten soll, bevor ich erneut darüber nachdenke?

Meine grobe Schätzung in der Größenordnung, wie lange es dauert, Computer-Wissenschaftssprachen zu entwickeln, liegt bei etwa einem Jahrzehnt.

Beispiel 1: SciPy wurde im Jahr 2001 oder so gestartet. Im Jahr 2009 wurde Scipy 0.7.0 veröffentlicht, und der ODE-Integrator verfügte über eine Schnittstelle zu VODE (was ode15sungefähr gleichwertig ode15sist mit NDF-basiert, VODE ist abhängig von BDF / Adams-Bashforth). Mit SciPy 0.10.0, einer Schnittstelle zu dopri5MATLAB ode45, einer Runge-Kutta-Methode 4. Ordnung, wird sie in der Regel als erste praktische numerische Integrationsmethode für Studenten eingeführt. SciPy 0.10.0 wurde im Dezember 2011 veröffentlicht, und es dauerte ungefähr 10 Jahre, bis sie eine Funktion von MATLAB enthielten, die jedem mir bekannten Ingenieurstudenten vorgestellt wurde.

Beispiel 2: Mathworks wurde 1984 gegründet. In ihrer ersten Version verwendeten sie einen LAPACK-Port für C namens JACKPAC (nach Jack Little, einem MathWorks-Ingenieur, der es geschrieben hat). Sie haben es erst 2000 durch LAPACK ersetzt.

Julia braucht vielleicht weniger Zeit, aber ich würde davon ausgehen, dass sie sich in etwa 10 Jahren zum Mainstream entwickelt. (Es ist schon ein Jahr oder so gewesen; vielleicht 9-10 Jahre dann?)

Ist Julias Bibliothekssystem in diesen Bereichen vollständig entwickelt? Ist die API insbesondere für diese Art von Aktivitäten mehr oder weniger stabil, oder stelle ich fest, dass mein alter Code nach dem Upgrade auf eine neue Version von Julia zum Absturz neigt?

Ich benutze Julia nicht, also nimm was ich sage mit einem Körnchen Salz, da ich nur Jeff Bezanson gesehen habe, der Präsentationen über Julia hält. Sie haben sich nach hinten gebeugt, um das Verknüpfen und Verwenden von Bibliotheken aus C, Python und Fortran zu vereinfachen. Wenn Sie keine Julia-Bibliothek finden, die das tut, was Sie wollen, schreiben Sie eine Julia-Beilage für eine Bibliothek in einer etablierteren Sprache. Daher denke ich nicht, dass ein Mangel an Bibliotheken ein Problem sein wird. Ich denke, ein Anliegen wird es sein, sicherzustellen, dass Änderungen an den wichtigsten Sprachfunktionen Sie nicht in den Arsch beißen. Wenn Sie sich die Meilensteine ​​im Julia Git-Repo ansehen, werden Sie feststellen, dass das Tag "breaking" häufig verwendet wird (12-mal in der Version 0.2, 5-mal in der Version 0.3). Für mich deutet das darauf hin, dass sich die Kernsprache noch weiterentwickelt, weshalb ich zögere, die Sprache jetzt zu verwenden.

EDIT: Aurelius bringt einen guten Punkt:

Was lässt Sie vermuten, dass Julia jemals zum Mainstream wird und nicht wie so viele andere Sprachen im Dunkeln stirbt? SciPy / numpy hatte / hat die Unterstützung einer ständig wachsenden Python-Community, die Julia nicht hat.

In der ursprünglichen Antwort habe ich beschlossen, die Frage zu vermeiden: "Wird es Julia gelingen, Mainstream zu werden?" so viel wie möglich. Scheitern ist einfach; Erfolg ist schwierig. Ich denke, der beste Vergleich von Julia ist mit technischen Computersprachen wie MATLAB, R und Octave. HPC-Sprachen (Chapel, Fortress, UPC usw.) haben eine engere Zielgruppe als technische Computersprachen, und Mehrzwecksprachen (C, Python, C ++ usw.) haben eine breitere Zielgruppe als technische Computersprachen.

Etwas, von dem ich denke, dass es Julia hilft, Design für Leistung zu entwickeln, ohne die Ausdruckskraft zu beeinträchtigen. Julia ist mit kompilierten Sprachen wie C viel konkurrenzfähiger als MATLAB, R oder sogar Python. Dieses Entwurfsziel ist auch eine Funktion, die Personen aus vorhandenen Sprachen ansprechen kann, z.

  • Menschen, die viel Wert auf Leistung legen und aus Sprachen wie C und Fortran stammen, aber bereit sind, ein kleines Stück Leistung (möglicherweise den Faktor 2) zu opfern, um von kompilierter Sprache zu weniger Zeilen interpretierter Sprache zu wechseln (zusammen mit einer REPL für schnelleres Entwickeln und Testen).
  • Menschen, die Wert auf hohe Produktivität legen und aus Sprachen wie Python, R und MATLAB stammen, aber mehr Leistung wünschen. Bei der Ausführung sind pure Python, pure MATLAB und pure R langsam. Entwickler in diesen Sprachen haben sich sehr bemüht, Bibliotheken in kompilierte Sprachen zu packen, aber Sie können nicht alles packen, und irgendwann wird die Kernsprache Sie verlangsamen. Core Julia ist schneller, wodurch Sie mehr Wissenschaft schneller machen können.
  • Menschen, die sich für freie Software interessieren. Julia ist interpretiert und frei (so wie Python, Octave usw.); MATLAB ist nicht.

Julia versucht auch, Parallelität zu erleichtern; Ich fühle mich nicht besonders qualifiziert, auf diesen Punkt einzugehen, und ich denke nicht, dass dies die Hauptattraktion der Sprache ist, aber ich denke, es ist ein Verkaufsargument, an dem sie arbeiten, und ich hoffe, andere können Licht ins Dunkel bringen.

Doch auch mit technischen Verdiensten müssen die Sprachschöpfer die nötigen Anstrengungen unternehmen, um die Sprache zu fördern und zu evangelisieren. Jeff Bezanson, Alan Edelman, Stephen Karpinski und Viral Shah arbeiten sehr hart daran, die Sprache zum Erfolg zu führen. Alan Edelman ist eng mit der Computerwissenschaft verbunden und hat bereits an Projekten auf Sprachniveau gearbeitet (insbesondere an der Star-P-Erweiterung für MATLAB). Jeff Bezanson hat die Konferenzschaltung durchgeführt, um Julia für eine Weile zu Computerwissenschaftlern und Ingenieuren zu befördern. Am MIT haben sie gute Arbeit geleistet, um Studenten und Mitarbeiter (insbesondere Steven G. Johnson) zu rekrutieren und Julia Bibliotheken hinzuzufügen. Sie haben einen Artikel in Wired und es ist ihnen gelungen, nach nur einem Jahr einen Wikipedia-Artikel für sich zu bekommen. Ihr Git-Repo hat Tausende von Sternen, Hunderte von Gabeln, und Hunderte von Uhren, so dass ihr Projekt für Open-Source-Standards ein Erfolg war. Ich denke, sie haben bis jetzt alles richtig gemacht, es geht also darum, diese Anstrengungen aufrechtzuerhalten und eine Gemeinschaft aufzubauen. Sie könnten immer noch scheitern, aber so weit zu kommen lässt mich vermuten, dass sie eine vernünftige Chance auf Erfolg haben.

Geoff Oxberry
quelle
Was lässt Sie vermuten, dass Julia jemals zum Mainstream wird und nicht wie so viele andere Sprachen im Dunkeln stirbt? SciPy / numpy hatte / hat die Unterstützung einer ständig wachsenden Python-Community, die Julia nicht hat. Versteh mich nicht falsch, ich hätte gerne ein besseres Tool als C ++ / Python / Fortran / Matlab (und ich weiß nichts über Julia), aber es gab viele Versuche mit neuen HPC-Sprachen, die fehlgeschlagen sind.
Aurelius
3
In Bezug auf wichtige Änderungen hat es nur sehr wenige Bruch tatsächlich gewesen Sprache ändert (dh Syntax, Semantik) vor einem Jahr seit der Zeit vor 0,1, über - in der Tat, ich nicht von jedem denken kann - die Kernsprache recht stabil ist. Als "Breaking" gekennzeichnete Probleme sind Änderungen an Standard-Bibliotheks-APIs. Diese Probleme lassen sich relativ einfach lösen, indem Sie die Verfallsmethoden so belassen, dass der alte Code weiterhin funktioniert, aber eine Warnung ausgegeben wird. Pakete sind in einem viel stärkeren Wandel begriffen, sodass ich vermute, dass das Aktualisieren Ihrer Pakete den Code beschädigen kann, auch wenn die Sprache selbst keine Probleme verursacht.
Stefan Karpinski
Vielen Dank für die Bearbeitung Geoff, gute Eingabe. Ich hoffe, dass etwas Besseres gelingt. Es ist etwas pervers zu denken, dass ich Matlab wöchentlich für das Rapid Prototyping von Algen, Python für die Automatisierung / Skripterstellung und C ++ und / oder Fortran für "ernsthafte" Arbeiten verwende, aber in dieser Welt leben wir. ' Ich bin leider pessimistisch. Der 5-10-jährige Trend bei HPC ist heterogenes Programmieren und massive Parallelität, und es ist von Natur aus schwierig, eine einfache Sprache dafür zu entwickeln. Ihr Kampf bergauf ist aus vielen Gründen ein sehr steiles Gefälle.
Aurelius
Großartige Analyse. Ich wollte damit sagen, dass alles, was Sie für HPC tun, immer leicht kaputt ist. Es ist ein Innovationsraum, in dem Bilden / Brechen selbstverständlich ist. Julia hat eine Menge guter Dinge zu bieten, aber ich denke, viele der Tricks rühren von der LLVM-Integration her, wieder ein hochaktuelles Ziel. Ich würde ein bisschen davon lernen, aber es sollte ein paar Jahre dauern, bis Sie damit rechnen, es täglich zu verwenden.
Meawoppl
21

Ich glaube, Julia ist es wert, gelernt zu werden. Ich habe es benutzt, um ein paar Forschungs-Finite-Elemente-Codes zu erstellen und sie sehr schnell zu erstellen. Ich war insgesamt sehr zufrieden mit meiner Erfahrung.

Julia hat mir einen Workflow ermöglicht, den ich mit anderen Sprachen nur schwer erreichen kann. Sie können es als Prototyping-Sprache wie MATLAB verwenden, aber im Gegensatz zu MATLAB, wenn Sie über einen funktionierenden Code verfügen und zur Beschleunigung Profil-Iterationen durchführen, ist das Ersetzen von Hotspots durch C-Code schmerzlos. Sie haben die Schnittstelle zu C (und Python) zu einer Priorität im Design gemacht.

So hat es mir die Sprache ermöglicht, sehr schnell von meinen mathematischen Formulierungen zu funktionalem Code und dann von funktionalem Code zu hochleistungsfähigem Code überzugehen. Ich denke, dieses Feature von Julia ist unterverkauft, aber es bietet einen enormen Mehrwert.

In vielen Fällen habe ich innerhalb weniger Stunden nach der Erstellung eines funktionalen Finite-Elemente-Codes eine C-Leistung erzielt (verglichen mit meinem eigenen C-Code). Wenn ich bisher nur Julia-Features verwende, komme ich normalerweise auf ~ 3X langsamer als C. Danach ersetze ich Hotspots durch C-Funktionen (Julia wird mit einem Stack-Sampling-Profiler geliefert, um diese zu identifizieren). Dies erfordert oft nur das Ersetzen der anstößigen Hotspot-Codezeilen durch ein "ccall", wobei Julia das Marshalling übernimmt.

Ich denke, die wichtigsten Dinge, die Julia im Moment fehlt, was mich zögern lässt, es für größere Projekte in Betracht zu ziehen, ist das Fehlen eines vollständig unterstützten Debuggers und die schlechte Unterstützung für das Plotten (im Moment ist Ihre beste Wahl beim Plotten eigentlich nur eine Schnittstelle zu matplotlib dass ich öfter Pause hatte als nicht). Sofortiges Feedback zu Code ist sehr wichtig. Ich weiß auch nicht, wie ich ohne interaktives Debuggen überleben soll, und in dieser Hinsicht bin ich von MATLAB und GDB sehr verwöhnt.

Reid. Atcheson
quelle
Danke, das ist eine sehr nützliche Antwort. Ich habe einige Anschlussfragen. Verwenden Sie zunächst eine veröffentlichte Version oder halten Sie sich mit der Quelle auf dem Laufenden? Wenn letzteres der Fall ist, haben Sie aufgrund von Aktualisierungen viele Probleme mit Ihrem Code? Zweitens, wie "kaputt" die Schnittstelle zur Matplotlib genau? Eigentlich war ich sehr aufgeregt zu hören, dass das Plotten über matplotlib erfolgt, da es LaTeX in Achsenbeschriftungen rendern kann (tatsächliches LaTeX unter Verwendung einer TeX-Installation), und für mich ist das eine Killerfunktion. Aber wenn die Schnittstelle schuppig ist, dann ist das nicht so toll ...
Nathaniel
Ich halte mich mit der Quelle auf dem Laufenden, weil ich auch versuche, zu dem Projekt beizutragen. Bisher hatte ich keine Pausen, aber ich hatte nur eine große Zeitspanne des Schreibens und der Theorie und komme jetzt zu meinem Code zurück und wir werden sehen, wie das geht. Numpy-Arrays haben standardmäßig einen Index von 0 und einen Zeilenschwerpunkt. und Julia ist standardmäßig 1-indiziert und spaltenmajor. Normalerweise macht dies keine Probleme, aber bei der Darstellung unstrukturierter Daten müssen Index-Arrays herumgereicht werden, so dass ich seltsame Dinge wie die Übergabe von p'-1 an unstrukturiertes Dreiecksnetz ausführen musste Routinen, wobei p eine Indexabbildung ist.
Reid.Atcheson
9

Aus meiner Erfahrung ist Julia noch nicht alltagstauglich (ich spreche von der stabilisierten Version 0.4 vom März 2016). Die Sprache selbst ist nett, reich an Funktionen und konsistent. Ein erfrischender Schritt vorwärts von Matlab und Python. Es gibt sicherlich Fälle, in denen Julia bereits in diesem frühen Stadium eine gute Wahl ist. Aber wenn Sie zuverlässige und ausgereifte wissenschaftliche Bibliotheken benötigen, kann ich den Umzug jetzt nicht empfehlen. Die Hauptprobleme, auf die ich gestoßen bin, sind:

  • Die Pakete außerhalb von Julias Kern sind nicht zuverlässig. Sie brechen mit Updates ab, ändern sich, werden ersetzt, sind manchmal unvollständig oder einfach kaputt.
  • Julias Parallelitätsmerkmale (imo die vielversprechendsten potenziellen Matlab-Killer-Merkmale) sind unausgereift. Sie werden auf Segmentierungsfehler, Speicherverluste, Abstürze und enttäuschende Leistung stoßen. Manchmal spielen sie nicht gut mit anderen Teilen von Julia, zum Beispiel mit einigen der Löser für lineare Systeme oder Pakete außerhalb des Kerns. Obwohl diese Funktionen vielversprechend klingen, sind sie für mich oft genug gescheitert. Es hat fast nie gereicht, einfach @parallelvor die for-Schleife zu schreiben , wo es theoretisch sein sollte.
  • Viele kleine Dinge, kleine Bugs und Probleme, mit denen man leben könnte: nicht so nette und manchmal fehlerhafte Call-Stack-Traces, ein wenig fehlerhafter Interpreter-Verlauf, langsames Laden von Paketen, schlechte Leistung des einen oder anderen Pakets / der anderen Funktion usw. Was mich ärgerte Das meiste ist das PyPlot-Paket, ein Wrapper für matplotlib, zu dem es derzeit keine Alternative gibt. Es ist wirklich toll, dass es da ist und es meistens funktioniert. Wenn Sie jedoch Daten plotten müssen, müssen Sie auf sehr langsame Leistung und Probleme vorbereitet sein.

Das wird alles besser. Ich bin zuversichtlich, dass Julia eines Tages Matlab und Python in fast jeder Hinsicht überlegen sein wird. Die Chancen stehen gut, dass dafür innovative Pakete entwickelt werden. Es scheint, dass es bereits eine große Community gibt. Sogar jetzt gibt es eine Fülle von Paketen mit Anwendungsfällen, die von OpenCl bis zu Webservern reichen. Die Verwendung von Python- oder C-Bibliotheken ist sehr einfach, sodass Sie in Bezug auf die Bibliotheksverfügbarkeit wahrscheinlich nicht an eine Wand stoßen werden. Eine große Stärke von Julia wird die Leichtigkeit sein, mit der man leistungsstarke Funktionen aus verschiedenen Quellen in einer modernen und konsistenten Hochsprache zusammenfügen kann (siehe Antworten oben). Aber insgesamt fand ich es weder ausgereift noch stabil genug, um produktiv eingesetzt zu werden.

johannes_lalala
quelle