Julia w tym momencie (maj 2019, Julia v1.1 z v1.2 wkrótce wyjdzie) jest dość dojrzała do naukowego przetwarzania. Wersja 1.0 oznaczała koniec corocznego łamania kodu . Dzięki temu wiele naukowych bibliotek komputerowych miało czas na rozwój bez zakłóceń. Szeroki przegląd pakietów Julii można znaleźć na pkg.julialang.org .
W przypadku podstawowych obliczeń naukowych biblioteka DifferentialEquations.jl do równań różniczkowych (ODE, SDE, DAE, DDE, symulacje Gillespie itp.), Flux.jl dla sieci neuronowych oraz biblioteka JuMP do programowania matematycznego (optymalizacja: liniowa, kwadratowa, mieszane liczby całkowite itp.) są trzema podstawami naukowego ekosystemu komputerowego. W szczególności biblioteka równań różniczkowych jest znacznie bardziej rozwinięta niż w innych językach, a duży zespół programistów implementuje funkcje takie jak integratory EPIRK , Runge-Kutta-Nystrom , równanie różniczkowe sztywne / różniczkowo-algebraiczne orazCzas adaptacyjny równanie różniczkowe sztywny stochastyczny integratorów, wraz z wieloma innymi dodatkami, jak analizy wrażliwości sprzężone , DSL reakcji chemicznej , macierz wolna Newton Kryłowa i zgodności GPU pełna (wolny transfer danych) po treningu nerwowych równań różniczkowych , wszystkie z fantastyczne wyniki testów (zastrzeżenie: jestem głównym programistą).
Rzeczą nieco zadziwiającą w dojrzałym ekosystemie Julii jest jego kompozycyjność. Zasadniczo, gdy ktoś buduje ogólną funkcję biblioteki, taką jak w DifferentialEquations.jl, możesz użyć dowolnego typu AbstractArray / Number do wygenerowania nowego kodu w locie. Na przykład istnieje biblioteka do propagacji błędów ( Measurements.jl ), a po umieszczeniu jej w solverie ODE automatycznie kompiluje nową wersję solvera ODE, która wykonuje propagację błędów bez próbkowania parametrów . Z tego powodu niektóre funkcje nie mogą być udokumentowane, ponieważ kod funkcji generuje się sam, dlatego należy pomyśleć o składzie biblioteki.
Jednym ze sposobów najbardziej przydatnego składu jest algebra liniowa. Na przykład solwery ODE pozwalają ci określić jac_prototype
, pozwalając ci podać typ jakobianu, który będzie używany wewnętrznie. Oczywiście nie ma rzeczy w LineraAlgebra biblioteki standardowej jak Symmetric
i Tridiagonal
można użyć tutaj, ale biorąc pod uwagę użyteczność composibility w typie algorytmów generycznych, ludzie już poszedł i zbudowany całych bibliotek typu array. BandedMatrices.jl i BlockBandedMatrices.jl to biblioteki, które definiują (blokowe) pasmowe typy macierzy, które mają szybkie lu
przeciążenia, co czyni je dobrym sposobem na przyspieszenie rozwiązania sztywnych dyskretyzacji MOL układów równań różniczkowych cząstkowych. PDMats.jlpozwala na specyfikację dodatnio określonych macierzy. Elemental.jl pozwala zdefiniować rozproszony rzadki jakobian. CuArrays.jl definiuje tablice na GPU. Itp.
Następnie masz wszystkie swoje typy liczb. Unitful.jl wykonuje sprawdzanie jednostek w czasie kompilacji, więc jest to biblioteka jednostek bez narzutów. DoubleFloats.jl to szybka biblioteka o wyższej precyzji, wraz z Quadmath.jl i ArbFloats.jl . ForwardDiff.jl to biblioteka do automatycznego różnicowania w trybie do przodu, która wykorzystuje arytmetykę liczb podwójnych. I mogę nadal wymieniać je. I tak, możesz wrzucić je do wystarczająco ogólnych bibliotek Julii, takich jak DifferentialEquations.jl, aby skompilować wersję specjalnie zoptymalizowaną dla tych typów liczb. Nawet coś takiego jak ApproxFun.jlktóry działa jako obiekty algebraiczne (jak Chebfun), współpracuje z tym ogólnym systemem, umożliwiając określenie PDE jako ODE na skalarach w przestrzeni funkcji.
Biorąc pod uwagę zalety kompozycyjności i sposób, w jaki typy mogą być używane do generowania nowego i wydajnego kodu na ogólnych funkcjach Julii, wiele pracy poświęcono wdrożeniu podstawowych funkcji obliczeń naukowych w czystej Julii. Optim.jl do optymalizacji nieliniowej, NLsolve.jl do rozwiązywania systemów nieliniowych, IterativeSolvers.jl do iteracyjnych solverów systemów liniowych i systemów eigensystem, BlackBoxOptim.jl do optymalizacji czarnych skrzynek itp. Nawet biblioteka sieci neuronowej Flux.jl używa po prostu CuArrays. jl automatyczna kompilacja kodu do GPU dla jego możliwości GPU. Ta kompozycyjność była rdzeniem tego, co stworzyło neuronowe równania różniczkowe w DiffEqFlux.jl. Probabilistyczne języki programowania, takie jak Turing.jl, są teraz dość dojrzałe i korzystają z tego samego podstawowego narzędzia.
Ponieważ biblioteki Julii są tak zasadniczo oparte na narzędziach do generowania kodu, nie powinno dziwić, że wokół generowania kodu jest wiele narzędzi. System rozgłoszeniowy Julii w locie generuje połączone jądra, które są przeciążone przez typy macierzy, zapewniając wiele wyżej wymienionych funkcji. CUDAnative.jl pozwala na kompilację kodu Julii do jądra GPU. ModelingToolkit.jl automatycznie usuwa cukier z AST w symboliczny system do przekształcania kodu matematycznego. Cassette.jlpozwala „dogonić” istniejącą funkcję innej osoby, używając reguł, aby zmienić jej funkcję przed czasem kompilacji (na przykład: zmień wszystkie ich alokacje tablic na statyczne alokacje tablic i przenieś operacje do GPU). Jest to bardziej zaawansowane narzędzie (nie oczekuję, że wszyscy zajmujący się obliczeniami naukowymi przejmą bezpośrednią kontrolę nad kompilatorem), ale w ten sposób powstaje wiele narzędzi nowej generacji (a raczej, jak same funkcje piszą).
Jeśli chodzi o paralelizm, wspomniałem o GPU, a Julia ma wbudowaną wielowątkowość i przetwarzanie rozproszone . Wielowątkowość Julii wkrótce będzie wykorzystywać architekturę środowiska uruchomieniowego zadań równoległych (PARTR), która umożliwia automatyczne planowanie zagnieżdżonej wielowątkowości . Jeśli chcesz korzystać z MPI, można po prostu użyć MPI.jl . A potem, oczywiście, najłatwiejszym sposobem na wykorzystanie tego wszystkiego jest po prostu użycie konfiguracji typu AbstractArray w celu użycia równoległości w swoich operacjach.
Julia ma również podstawowy ekosystem, którego można oczekiwać od języka ogólnego przeznaczenia używanego w zastosowaniach naukowych. Ma Juno IDE z wbudowanym debuggerem z punktami przerwania , ma Plots.jl do tworzenia wszelkiego rodzaju wykresów. Przydatne jest również wiele konkretnych narzędzi, takich jak Revise.jl automatycznie aktualizuje funkcje / bibliotekę po zapisaniu pliku. Masz swoją DataFrames.jl , biblioteki statystyk itp. Jedną z najpiękniejszych bibliotek jest w rzeczywistości Distribution.jl, która pozwala pisać ogólne algorytmy dla dystrybucji (na przykład:rand(dist)
pobiera losową liczbę wszystkich przekazanych dystrybucji), i istnieje cały ładunek dystrybucji jednowymiarowych i wielowymiarowych (i oczywiście wysyłanie odbywa się w czasie kompilacji, dzięki czemu wszystko to jest tak szybkie, jak zakodowanie na stałe funkcji specyficznej dla dystrybucji). Istnieje wiele narzędzi do obsługi danych , serwerów WWW itp., Które nazywacie. W tym momencie jest na tyle dojrzały, że jeśli istnieje podstawowa rzecz naukowa i można się spodziewać, że będzie istnieć, wystarczy, że przeszukujesz ją za pomocą .jl lub Julii i pojawi się.
Na horyzoncie jest kilka rzeczy, o których należy pamiętać. PackageCompiler chce budować pliki binarne z bibliotek Julii i ma już pewne sukcesy, ale wymaga dalszego rozwoju. Makie.jl to cała biblioteka do drukowania z akceleracją GPU z interaktywnością, i wciąż wymaga trochę pracy, ale naprawdę chce stać się główną biblioteką plotowania w Julii. Zygote.jl to biblioteka automatycznego różnicowania między źródłami, która nie ma problemów z wydajnością AD opartego na śledzeniu (Flux's Tracker, PyTorch, Jax), i który chce działać na wszystkich czystych kodach Julii. Itp.
Podsumowując, można znaleźć dużo ruchu w wielu miejscach, ale w większości obszarów jest już solidna, dojrzała biblioteka. Nie jest już w miejscu, w którym pytasz „czy zostanie adoptowany?”: Julia została adoptowana przez wystarczającą liczbę osób (miliony pobrań), aby mieć siłę, by pozostać na zawsze. Ma naprawdę fajną społeczność, więc jeśli chcesz po prostu strzelać do wiatru i rozmawiać o obliczeniach równoległych lub równaniach różniczkowych numerycznych, niektóre z najlepszych pokojów rozmów na ten temat znajdują się w Julialang Slack . Czy to jest język, którego powinieneś się nauczyć, jest osobistym pytaniem, i czy jest to właściwy język dla twojego projektu, jest pytaniem technicznym, a te są różne. Ale czy jest to język, który dojrzał i ma poparcie dużej, spójnej grupy programistów? To wydaje się być twierdzącym tak.