Julia, bu noktada (Mayıs 2019, Julia v1.1 v1.2 ile birlikte ortaya çıkacak) bilimsel hesaplama için oldukça olgun. V1.0 sürümü , yıllık kod kırılmasına bir son verdi . Bununla birlikte, birçok bilimsel bilgi işlem kütüphanesi, bozulmadan büyümek için zaman buldu. Julia paketlerine genel bir bakış pkg.julialang.org adresinde bulunabilir .
Çekirdek bilimsel hesaplama için DifferentialEquations.jl diferansiyel denklemler (ADDlerin, SDEs, Daes, TDYU, Gillespie simülasyonları, vb), kütüphane Flux.jl sinir ağları ve atlamayı matematiksel programlama (optimizasyon için kütüphane: doğrusal, kuadratik, karışık tamsayı, vb programlama) bilimsel bilgi işlem ekosisteminin temel taşlarından biridir. Özellikle diferansiyel denklem kütüphanesi çok daha gelişmiş aşağıdaki gibi özelliklerin uygulanması büyük geliştirme ekibi ile, diğer dillerde görecekleriniz daha EPIRK entegratörleri , Runge-Kutta-Nystrom , Stiff / Diferansiyel-Cebirsel gecikme diferansiyel denklem veadaptif zaman sert stokastik diferansiyel denklem entegratörleri, bitişik duyarlılık analizi , kimyasal reaksiyon DSL'leri , matrissiz Newton-Krylov ve tam (veri aktarımı gerektirmeyen) GPU uyumluluğu gibi bir dizi diğer özelliğin yanı sıra sinirsel diferansiyel denklemlerin eğitimi ile harika kıyaslama sonuçları (feragatname: Ben öncü geliştiriciyim).
Olgunlaşmış Julia ekosistemi hakkında biraz akıl almaz olan şey, onun birliğidir. Temel olarak, birisi DifferentialEquations.jl'deki gibi genel bir kütüphane işlevi oluşturduğunda, anında yeni kod üretmek için herhangi bir AbstractArray / Number türünü kullanabilirsiniz. Örneğin, hata yayılımı için bir kütüphane var ( Measurements.jl ) ve onu ODE çözücüsüne yapıştırdığınızda, parametre örneklemesi olmadan hata yayılımı yapan yeni bir ODE çözücüsü sürümünü otomatik olarak derler . Bu nedenle, özelliklerin kodu kendisini ürettiği için belgelenen bazı özellikleri bulamayabilirsiniz ve bu nedenle kütüphane kompozisyonu hakkında daha fazla düşünmeniz gerekir.
Kompozisyonun en faydalı olduğu yollardan biri doğrusal cebirdir. Örneğin ODE çözücüler jac_prototype
, dahili olarak kullanılacak Jacobian için tip belirtmenize izin vererek belirlemenizi sağlar . Tabii şeyler var LineraAlgebra standart kütüphanesinde gibi Symmetric
ve Tridiagonal
siz tip jenerik algoritmalarda composibility faydası, insanlar çoktan gitmiştir ve tüm dizi tipi kitaplıklar inşa verilen buraya kullanabilirsiniz ancak. BandedMatrices.jl ve BlockBandedMatrices.jl , hızlı lu
aşırı yüke sahip (Block) bantlı matris türlerini tanımlayan , kısmi diferansiyel denklem sistemlerinin sert MOL ayrıklaştırmaları çözümünü hızlandırmak için iyi bir yol yapan kitaplıklardır . PDMats.jlpozitif-kesin matrislerin tanımlanmasına izin verir. Elemental.jl , dağıtılmış bir seyrek Jacobian tanımlamanızı sağlar. CuArrays.jl , GPU'daki dizileri tanımlar. Vb.
O zaman tüm numara türlerin var. Unitful.jl derleme zamanında birim kontrolünü yapar, bu nedenle genel gidersiz birimler kütüphanesidir. DoubleFloats.jl , Quadmath.jl ve ArbFloats.jl ile birlikte hızlı ve daha yüksek hassasiyetli bir kütüphanedir . ForwardDiff.jl , Dual sayı aritmetiği kullanan ileri mod otomatik farklılaştırma için bir kütüphanedir. Bunları listelemeye devam edebilirim. Ve evet, bu sayı türleri için özel olarak optimize edilmiş bir sürümü derlemek için bunları yeterince genel Julia kütüphanelerine atabilirsiniz. ApproxFun.jl gibi bir şey bilecebirsel nesneler (Chebfun gibi) olarak işlev gören bu jenerik sistemle çalışır ve PDE'lerin bir fonksiyon uzayındaki skalerlerde ODE'ler olarak tanımlanmasına izin verir.
Kompostibilitenin avantajları ve türlerin jenerik Julia fonksiyonları üzerinde yeni ve verimli kodlar üretmek için kullanılabileceği düşünüldüğünde, çekirdek bilimsel hesaplama işlevselliğinin saf Julia'ya uygulanmasını sağlamak için birçok çalışma yapılmıştır. Optim.jl doğrusal olmayan optimizasyon için, NLsolve.jl doğrusal olmayan sistemlerin çözümü için, IterativeSolvers.jl lineer sistem ve eigensystems yinelenen açarlarını, BlackBoxOptim.jl kara kutu optimizasyonu, vb Hatta sinir ağı kütüphanesi için Flux.jl sadece CuArrays kullanır. jl'nin GPU yetenekleri için GPU'ya otomatik kod derlemesi. Bu beste, DiffEqFlux.jl'deki nöral diferansiyel denklemler gibi şeylerin yaratılmasının özü oldu.. Turing.jl gibi olasılıksal programlama dilleri de şimdi oldukça olgunlaşmış ve aynı temel kalıptan faydalanıyor.
Julia'nın kütüphaneleri temelde kod üretme araçlarına dayandığından, kod üretme konusunda çok fazla alet bulunmasına şaşırmamak gerekir. Julia'nın yayın sistemi , yukarıda belirtilen özelliklerin çoğunu vermek için dizi tipleri tarafından aşırı yüklenmiş , sinek üzerinde kaynaşık çekirdekler üretir . CUDAnative.jl , Julia kodunu GPU çekirdeklerine derlemeye izin verir. ModelingToolkit.jl matematiksel kodu dönüştürmek için AST'leri otomatik olarak sembolik bir sisteme dönüştürür. Cassette.jlDerleme zamanından önce işlevlerini değiştirmek için kuralları kullanarak (örneğin: tüm dizi tahsislerini statik dizi tahsislerine değiştir ve işlemleri GPU'ya taşı) kuralları kullanarak bir başkasının mevcut fonksiyonunu "geçersiz kılmanıza" izin verir. Bu daha gelişmiş bir takımlamadır (herkesin bilimsel hesaplama yapmasını beklediğini derleyiciyi doğrudan kontrol altına almasını beklemiyorum), fakat bu, gelecek nesil takımların çoğunun nasıl yapıldığını (ya da daha doğrusu özelliklerin kendilerinin nasıl yazdığını).
Paralelliğe gelince, GPU'lardan bahsetmiştim ve Julia yerleşik çoklu okuma ve dağıtma bilgisayarları kullandı . Julia'nın çok iş parçacığı çok yakında yuvalanmış çok iş parçacığın otomatik olarak programlanmasına olanak sağlayan paralel görevli bir çalışma zamanı (PARTR) mimarisini kullanır . MPI kullanmak istiyorsanız, sadece MPI.jl kullanabilirsiniz . Ve tabii ki, hepsini kullanmanın en kolay yolu, paralelliği işlemlerinde kullanmak için yalnızca AbstractArray tipi bir kurulum kullanmaktır.
Julia ayrıca, bilimsel uygulamalar için kullanılan genel amaçlı bir dilden bekleyeceğiniz temel bir ekosisteme sahiptir. Kesme noktaları olan dahili bir hata ayıklayıcısına sahip Juno IDE'ye sahiptir, her türlü araziyi yapmak için Plots.jl vardır . Bir çok özel araç da güzel, Revise.jl gibi bir dosya kaydedildiğinde işlevlerinizi / kütüphanenizi otomatik olarak günceller. DataFrames.jl , istatistik kitaplıkları vb . Var . En güzel kitaplıklardan biri aslında dağıtım için genel algoritmalar yazmanıza izin veren , aslında Distributions.jl'dir (örneğin:rand(dist)
hangi dağılıma ne olursa olsun rastgele bir sayı alır) ve tek değişkenli ve çok değişkenli dağılımların tam bir yükü vardır (ve elbette gönderme derleme zamanında gerçekleşir, bu da hepsini dağıtıma özgü bir fonksiyon kodlaması kadar hızlı yapar). Bir sürü veri işleme aracı , web sunucusu vb. Var . Bu noktada, temel bir bilimsel şey varsa ve bunun olmasını beklediğiniz takdirde, sadece Google’ın .jl veya Julia ile birlikte ortaya çıkması ve ortaya çıkması yeterince olgunlaşır.
O zaman ufukta akılda tutulması gereken birkaç şey var. PackageCompiler , Julia kütüphanelerinden ikili dosyalar oluşturmak istiyor ve zaten bazı başarılara sahip fakat daha fazla gelişmeye ihtiyacı var. Makie.jl GPU hızlandırmalı etkileşimli bir çizim için bütün bir kütüphanedir ve hala biraz daha çalışmaya ihtiyacı var ama gerçekten Julia'daki ana komplo kütüphanesi olmak istiyor. Zygote.jl , izleme tabanlı bir AD'nin (Flux's Tracker, PyTorch, Jax) performans sorunlarına sahip olmayan ve tüm saf Julia kodları üzerinde çalışmak isteyen, kaynaktan kaynaktan otomatik bir farklılaşma kütüphanesidir. Vb.
Sonuç olarak, birçok yerde çok fazla hareket bulabilirsiniz, ancak çoğu alanda zaten sağlam bir olgunlaşmış kütüphane bulunmaktadır. Artık “kabul edilecek mi?” Diye sorduğunuz bir yerde değil: Julia, etrafta iyi kalmak için ivme kazanması için yeterince insan (milyonlarca indirme) tarafından benimsendi. Gerçekten hoş bir topluluğu var, bu yüzden esintiyi çekmek ve paralel hesaplama veya sayısal diferansiyel denklemler hakkında konuşmak istiyorsanız, bunun için en iyi sohbet odalarından bazıları Julialang Slack'de . Öğrenmeniz gereken bir dil olup olmadığı kişisel bir sorudur ve projeniz için doğru dil olup olmadığı teknik bir sorudur ve bunlar farklıdır. Fakat bu, büyük bir tutarlı geliştirici grubunun desteğini alan ve olgunlaşan bir dil midir? Bu olumlu bir evet gibi görünüyor.