Programlama dili Julia 1.9 mevcut

Yüksek performans, dinamik yazma desteği ve paralel programlama için yerleşik araçlar gibi nitelikleri birleştiren Julia 1.9 programlama dilinin sürümü yayınlandı. Julia'nın sözdizimi MATLAB'a yakındır ve Ruby ve Lisp'ten bazı öğeler ödünç almıştır. Dize işleme yöntemi Perl'ü anımsatıyor. Proje kodu MIT lisansı altında dağıtılmaktadır.

Dilin temel özellikleri:

  • Yüksek performans: Projenin temel hedeflerinden biri C programlarına yakın performans elde etmektir. Julia derleyicisi, LLVM projesinin çalışmasını temel alır ve birçok hedef platform için verimli yerel makine kodu üretir;
  • Nesne yönelimli ve işlevsel programlamanın öğeleri de dahil olmak üzere çeşitli programlama paradigmalarını destekler. Standart kitaplık, diğer şeylerin yanı sıra, eşzamansız G/Ç, süreç kontrolü, günlük kaydı, profil oluşturma ve paket yönetimi için işlevler sağlar;
  • Dinamik yazma: dil, komut dosyası programlama dillerine benzer şekilde değişkenler için türlerin açık bir şekilde tanımlanmasını gerektirmez. Etkileşimli mod desteklenir;
  • Türleri açıkça belirtmeye yönelik isteğe bağlı yetenek;
  • Sayısal hesaplama, bilimsel hesaplama, makine öğrenimi ve veri görselleştirme için ideal bir sözdizimi. Hesaplamaların paralelleştirilmesi için birçok sayısal veri türü ve araç desteği.
  • Ek katmanlara gerek kalmadan C kitaplıklarından işlevleri doğrudan çağırma yeteneği.

Julia 1.9'daki büyük değişiklikler:

  • Yeni dil özellikleri
    • "setproperty!(::Module, ::Symbol, x)" kullanılarak başka bir modülde atama yapılmasına izin verin.
    • Son konumda olmayan birden fazla atamaya izin verilir. Örneğin “a, b…, c = 1, 2, 3, 4” dizisi “a = 1; b…, = 2, 3; c = 4". Bu Base.split_rest aracılığıyla gerçekleştirilir.
    • Tek karakterli değişmez değerler artık dize değişmezleriyle aynı sözdizimini destekliyor; onlar. Sözdizimi, Char türünün izin verdiği şekilde geçersiz UTF-8 dizilerini temsil edebilir.
    • Unicode 15 spesifikasyonu için destek eklendi.
    • Tür parametreleri olarak artık iç içe geçmiş demetler ve adlandırılmış karakter demetleri kombinasyonları kullanılabilir.
    • Yalnızca global değişkenleri okumak ve yazmak için yeni yerleşik işlevler "getglobal(::Module, ::Symbol[, order])" ve "setglobal!(::Module, ::Symbol, x[, order])". Artık global değişkenlere erişim için getfield yöntemi yerine getglobal yöntemi tercih edilmelidir.
  • Dildeki değişiklikler
    • Sürüm 1.7'de tanıtılan "@invoke" makrosu artık dışa aktarıldı ve kullanıma hazır. Ayrıca, "x" bağımsız değişkeni için tür açıklamasının atlanması durumunda artık "Herhangi biri" yerine "Core.Typeof(x)" yöntemini kullanıyor. Bu, bağımsız değişken olarak iletilen türlerin doğru şekilde işlenmesini sağlamak için gereklidir.
    • 1.7 sürümünde tanıtılan "invokelatest" işlevinin ve "@invokelatest" makrosunun dışa aktarımı etkinleştirildi.
  • Derleyici/çalışma zamanı iyileştirmeleri
    • İlk yürütmeye kadar geçen süre önemli ölçüde azaldı (TTFX - İlk yürütmeye kadar geçen süre). Bir paketin önceden derlenmesi artık yerel kodu "pkgimage" içinde saklıyor; bu, ön derleme işlemi tarafından oluşturulan kodun paket yüklendikten sonra yeniden derlenmesine gerek olmayacağı anlamına geliyor. Pkgimages modunun kullanımı "--pkgimages=no" seçeneği kullanılarak devre dışı bırakılabilir.
    • Tür çıkarımının bilinen ikinci dereceden karmaşıklık sorunu düzeltildi ve çıkarım genel olarak daha az bellek kullanıyor. Otomatik olarak oluşturulan uzun işlevlere sahip bazı uç durumlar (kısmi diferansiyel denklemler ve büyük nedensel modeller içeren ModelingToolkit.jl gibi) çok daha hızlı derlenir.
    • Somut türleri olmayan bağımsız değişkenler içeren çağrılar, gönderim için birden fazla farklı türde aday olsa bile artık enjeksiyon veya statik çözünürlük için Birlik bölme optimizasyonuna tabi tutulabilir. Bu, "@nospecialize-d" çağrı sitelerini statik olarak çözümleyerek ve yeniden derlemeyi önleyerek, nesne türlerinin tamamen statik olarak çözümlenmediği belirli durumlarda performansı artırabilir.
    • Base modülündeki @pure makrosunun tüm kullanımları Base.@assume_fects ile değiştirildi.
    • Genellikle f(args...) için kullanılandan daha az spesifik türe sahip invoke(f, invokesig, args...) çağrıları artık paketin yeniden derlenmesine neden olmuyor.
  • Komut Satırı Seçeneklerindeki Değişiklikler
    • Linux ve Windows'ta, "--threads=auto" seçeneği artık, genellikle HPC ve bulut ortamlarında belirlenen bir maske olan CPU benzeşimine dayalı olarak kullanılabilir işlemci sayısını belirlemeye çalışıyor.
    • “--math-mode=fast” parametresi devre dışı bırakılır, bunun yerine anlambilimi açıkça tanımlanmış “@fastmath” makrosunun kullanılması önerilir.
    • "--threads" seçeneği artık "auto | N[,auto|M]"; burada M, oluşturulacak etkileşimli iş parçacıklarının sayısını belirtir (şu anda otomatik, 1 anlamına gelir).
    • “—heap-size-hint=” seçeneği eklendi ", aktif çöp toplamanın başlayacağı eşiği belirler. Boyut bayt, kilobayt (1000 KB), megabayt (300 MB) veya gigabayt (1,5 GB) cinsinden belirtilebilir.
  • Çoklu iş parçacığında değişiklikler
    • "Threads.@spawn" artık ":default" veya ":interactive" değerinde isteğe bağlı bir ilk bağımsız değişkene sahip. Etkileşimli bir görev, düşük yanıt gecikmesi gerektirir ve kısa olacak veya sık gerçekleştirilecek şekilde tasarlanmıştır. Etkileşimli görevler, Julia'yı başlatırken belirtilirse etkileşimli iş parçacıklarında çalıştırılır.
    • Julia çalışma zamanı dışında çalışan iş parçacıkları (C veya Java gibi) artık "jl_adopt_thread" kullanarak Julia kodunu çağırabilir. Bu, Julia kodunu "cfunction" veya "@ccallable" giriş noktası aracılığıyla girdiğinizde otomatik olarak gerçekleşir. Sonuç olarak, iş parçacığı sayısı artık yürütme sırasında değişebilir.
  • Yeni kütüphane fonksiyonları
    • Yeni işlev "Iterators.flatmap".
    • Belirli bir modülü yükleyen paketin sürümünü almak için yeni "pkgversion(m::Module)" işlevi, "pkgdir(m::Module)" işlevine benzer.
    • "reduce(hcat, x::Vector{<:Vector})" ifadesini herhangi bir boyuta genelleştiren ve yineleyicilerin herhangi bir yineleyicisine izin veren yeni "stack(x)" işlevi. "stack(f, x)" yöntemi "mapreduce(f, hcat, x)" yöntemini genelleştirir ve daha verimlidir.
    • Tahsis edilen hafızayı analiz etmek için yeni makro "@allocations", "@allocated"a benzer, tek farkı tahsis edilen hafızanın toplam boyutundan ziyade hafıza tahsislerinin sayısını döndürmesidir.
  • Yeni kitaplık özellikleri
    • "RoundFromZero" artık "BigFloat" dışındaki türler için çalışıyor.
    • "Dict" artık "sizehint!" kullanılarak manuel olarak küçültülebilir.
    • "@time" artık geçersiz yöntemleri yeniden derlemek için harcanan zamanın yüzdesini ayrı ayrı belirtiyor.
  • Standart kitaplıkta yapılan değişiklikler
    • Dict ve anahtarlar(::Dict), değerler(::Dict) ve Set gibi diğer türetilmiş nesneler için yineleme yöntemlerindeki eşzamanlılık sorunu düzeltildi. Bu yineleme yöntemleri, sözlüğü veya kümeyi değiştiren hiçbir eylem olmadığı sürece artık sınırsız sayıda iş parçacığı için bir Dict veya Set üzerinde paralel olarak çağrılabilir.
    • Yüklem işlevi "!f"nin olumsuzlanması artık anonim bir işlev yerine "(!) ∘ f" bileşik işlevini döndürüyor.
    • Boyut dilimi işlevleri artık birden fazla boyutta çalışıyor: "eachslice", "eachrow" ve "eachcol", gönderimin daha verimli yöntemler sağlamasına olanak tanıyan bir "Slices" nesnesi döndürüyor.
    • Genel API'ye "@kwdef" makrosu eklendi.
    • "fld1"deki işlem sırası ile ilgili sorun düzeltildi.
    • Sıralama artık her zaman zaman açısından kararlıdır (Hızlı Sıralama yeniden tasarlandı).
    • "Base.splat" artık dışa aktarıldı. Dönüş değeri, anonim bir işlev yerine "Base.Splat" türüdür ve çıktısının güzel bir şekilde alınmasına olanak tanır.
  • Paketleme yöneticisi
    • "Paket Uzantıları": Julia oturumunda yüklenen diğer paketlerden kod pasajı yükleme desteği. Uygulama “Requires.jl” paketine benzer ancak ön derleme ve ayar uyumluluğu desteklenmektedir.
  • Lineer Cebir Kütüphanesi
    • Eleman bazında bölmeyle ilgili karışıklık riski nedeniyle, "a * pinv(b)"ye eşdeğer olan skaler "a" ve vektör "b" içeren "a/b" ve "b\a" yöntemleri kaldırıldı.
    • BLAS ve LAPACK çağrılırken artık "libblastrampoline (LBT)" kullanılıyor. OpenBLAS varsayılan olarak sağlanır, ancak sistem görüntüsünün diğer BLAS/LAPACK kitaplıklarıyla oluşturulması desteklenmez. Bunun yerine, BLAS/LAPACK'i mevcut başka bir kitaplık seti ile değiştirmek için LBT mekanizmasının kullanılması önerilir.
    • "lu", yeni aritmetik türleriyle ve eğitim amacıyla kullanılmak üzere sıfır olmayan ilk döndürme öğesini seçen yeni bir matris döndürme stratejisi olan "RowNonZero()"yu destekler.
    • "normalize(x, p=2)" artık skalerler de dahil olmak üzere herhangi bir normalleştirilmiş "x" vektör uzayını desteklemektedir.
    • Varsayılan BLAS iş parçacığı sayısı artık ARM mimarilerindeki CPU iş parçacığı sayısına ve diğer mimarilerdeki CPU iş parçacığı sayısının yarısına eşittir.
  • Printf: Daha iyi okunabilirlik için yanlış biçimlendirilmiş dizelere ilişkin hata mesajları yeniden düzenlendi.
  • Profil: Chrome'da desteklenen JSON tabanlı ".heapsnapshot" biçiminde bir dosya yazan yeni "Profile.take_heap_snapshot(file)" işlevi.
  • Rastgele: randn ve randexp artık rand'ı tanımlayan herhangi bir AbstractFloat türü için çalışıyor.
  • TEKRAR
    • Artık "Alt-e" tuş kombinasyonuna basmak düzenleyicideki geçerli girişi açar. İçerik (eğer değiştirilmişse) editörden çıktığınızda yürütülecektir.
    • REPL'de aktif olan geçerli modül içeriği, "REPL.activate(::Module)" işlevi kullanılarak veya REPL'de modüle girilip "Alt-m" tuş kombinasyonuna basılarak değiştirilebilir (varsayılan olarak Main).
    • Her giriş ve çıkış için sayıları yazdıran ve puanlanan sonuçları Out'ta saklayan "numaralandırılmış istem" modu, "REPL.numbered_prompt!()" kullanılarak etkinleştirilebilir.
    • Sekme tamamlama, mevcut anahtar kelime bağımsız değişkenlerini görüntüler.
  • SuiteSparse: "SuiteSparse" çözümleyicisinin kodu "SparseArrays.jl" dosyasına taşındı. Çözücüler artık "SuiteSparse.jl" tarafından yeniden dışa aktarılıyor.
  • Seyrek Diziler
    • "SuiteSparse" çözücüleri artık "SparseArrays" alt modülleri olarak mevcuttur.
    • UMFPACK ve CHOLMOD iş parçacığı koruma modları, genel değişkenler ortadan kaldırılarak ve kilitler kullanılarak geliştirildi. Çok iş parçacıklı "ldiv!" UMFPACK nesneleri artık güvenli bir şekilde yürütülebilir.
    • "SparseArrays.allowscalar(::Bool)" deneysel işlevi, seyrek dizilerin skaler indekslenmesini devre dışı bırakmanıza veya etkinleştirmenize olanak tanır. Bu işlev, performans sorunlarının yaygın bir kaynağı olan "SparseMatrixCSC" nesnelerinin rastgele skaler indekslenmesini algılamak için tasarlanmıştır.
  • Bir arıza veya hata durumunda test çalıştırmasını erken sonlandıran test paketleri için yeni arıza güvenliği modu. “@testset kwarg failfast=true” veya “export JULIA_TEST_FAILFAST=true” yoluyla ayarlayın. Bu bazen CI çalıştırmalarında hata mesajlarını erken almak için gerekli olabilir.
  • Tarihler: Boş dizeler artık hatalı bir şekilde geçerli "DateTime", "Dates" veya "Times" değerleri olarak ayrıştırılmıyor ve bunun yerine yapıcılarda ve ayrıştırmada bir "ArgumentError" atılmıyor, "tryparse" ise hiçbir şey döndürmüyor.
  • Paket Dağıtıldı
    • Paket yapılandırması (etkin proje, "LOAD_PATH", "DEPOT_PATH") artık yerel çalışan işlemleri eklenirken (örneğin, "addprocs(N::Int)" kullanılarak veya "--procs=N" komut satırı işareti kullanılarak) yayılır.
    • «addprocs» для локальных рабочих процессов теперь принимает аргумент с именем «env» для передачи переменных окружения рабочим процессам.
  • Unicode: «graphemes(s, m:n)» возвращает подстроку от m-й до n-й графемы в «s».
  • DelimitedFiles paketi sistem kitaplıklarından kaldırıldı ve artık kullanılması için açıkça kurulması gereken ayrı bir paket olarak dağıtılıyor.
  • Dış bağımlılıklar
    • Linux'ta libstdc++ sistem kütüphanesinin sürümü otomatik olarak algılanır ve daha yeniyse yüklenir. Sistem sürümünden bağımsız olarak eski libstdc++ yerleşik yükleme davranışı, "JULIA_PROBE_LIBSTDCXX=0" ortam değişkeni ayarlanarak geri yüklenebilir.
    • Linux'ta "RUNPATH" değişkenini tanımlayamayan kitaplıkları bozabilecek "RPATH", julia ikili dosyasından kaldırıldı.
    • Araç iyileştirmeleri: "MethodError" ve yöntemlerin çıktısı (örneğin "methods(my_func)") artık bir yığın izlemede yöntemlerin çıktısı ilkesine uygun olarak biçimlendiriliyor ve renklendiriliyor.

    Kaynak: opennet.ru

Yorum ekle