Proqramlaşdırma dili Julia 1.9 mövcuddur

Yüksək performans, dinamik yazma dəstəyi və paralel proqramlaşdırma üçün quraşdırılmış alətlər kimi keyfiyyətləri özündə birləşdirən Julia 1.9 proqramlaşdırma dilinin buraxılışı nəşr edilmişdir. Julia sintaksisi MATLAB-a yaxındır, bəzi elementləri Ruby və Lisp-dən götürülmüşdür. Simli manipulyasiya üsulu Perl-i xatırladır. Layihə kodu MIT lisenziyası altında paylanır.

Dilin əsas xüsusiyyətləri:

  • Yüksək performans: layihənin əsas məqsədlərindən biri C proqramlarına yaxın performansa nail olmaqdır. Julia kompilyatoru LLVM layihəsinə əsaslanır və bir çox hədəf platformalar üçün səmərəli yerli maşın kodu yaradır;
  • Obyekt yönümlü və funksional proqramlaşdırma elementləri daxil olmaqla müxtəlif proqramlaşdırma paradiqmalarına dəstək. Standart kitabxana digər şeylər arasında asinxron I/O, prosesin idarə edilməsi, giriş, profilləşdirmə və paketin idarə edilməsi funksiyalarını təmin edir;
  • Dinamik yazım: Dil skript proqramlaşdırma dilləri ilə analoji olaraq dəyişənlər üçün növlərin açıq tərifini tələb etmir. İnteraktiv rejimi dəstəkləyir;
  • Növləri açıq şəkildə təyin etmək imkanı;
  • Ədədi hesablamalar, elmi hesablamalar, maşın öyrənmə sistemləri və məlumatların vizuallaşdırılması üçün əla sintaksis. Hesablamaları paralelləşdirmək üçün bir çox rəqəmsal məlumat növləri və alətləri üçün dəstək.
  • Əlavə təbəqələr olmadan birbaşa C kitabxanalarından funksiyaları çağırmaq imkanı.

Julia 1.9-da əsas dəyişikliklər:

  • Yeni dil xüsusiyyətləri
    • "setproperty!(::Module, ::Symbol, x)" istifadə edərək başqa modulda tapşırıqların edilməsinə icazə verin.
    • Son mövqedə olmayan bir neçə tapşırığa icazə verilir. Məsələn, "a, b..., c = 1, 2, 3, 4" sətri "a = 1; b…, = 2, 3; c = 4". Bu Base.split_rest vasitəsilə idarə olunur.
    • Tək simvollu literallar indi sətir literalları ilə eyni sintaksisi dəstəkləyir; olanlar. sintaksis Char tipinin icazə verdiyi kimi etibarsız UTF-8 ardıcıllığını təmsil edə bilər.
    • Unicode 15 spesifikasiyası üçün əlavə dəstək.
    • İndi tip parametrləri kimi dəstlərin və simvolların adlandırılmış dəstələrinin iç-içə birləşmələri istifadə edilə bilər.
    • Yeni daxili funksiyalar "getglobal(::Module, ::Symbol[, order])" və "setglobal!(::Module, ::Symbol, x[, order])" müstəsna olaraq qlobal dəyişənlərə oxumaq və yazmaq üçün. Getglobal metodu indi qlobal dəyişənlərə daxil olmaq üçün getfield metoduna üstünlük verilməlidir.
  • Dil dəyişiklikləri
    • 1.7 versiyasında təqdim edilmiş "@invoke" makrosu artıq ixrac edilib və istifadə üçün əlçatandır. Həmçinin, indi "x" arqumenti üçün tip annotasiyası buraxıldıqda "Hər hansı" deyil, "Core.Typeof(x)" metodundan istifadə edir. Arqument kimi ötürülən növlərin düzgün işlənməsi üçün bu lazımdır.
    • 1.7 versiyasında təqdim edilmiş "invokelatest" funksiyasının və "@invokelatest" makrosunun ixracı aktivləşdirildi.
  • Kompilyator/Runtime Təkmilləşdirmələri
    • İlk icraya qədər əhəmiyyətli dərəcədə azaldılmış vaxt (TTFX - İlk icraya qədər vaxt). Paketin ilkin tərtibi indi doğma kodu "pkgimage"də saxlayır, bu o deməkdir ki, əvvəlcədən tərtib zamanı yaradılan kodun paket yükləndikdən sonra yenidən tərtib edilməsinə ehtiyac qalmayacaq. Pkgimages rejiminin istifadəsi "--pkgimages=no" seçimi ilə deaktiv edilə bilər.
    • Tipli nəticənin kvadratik mürəkkəbliyi ilə bağlı məlum problem həll edildi və ümumiyyətlə nəticə daha az yaddaş istifadə edir. Avtomatik yaradılan uzun funksiyaları olan bəzi kənar hallarda (məsələn, qismən diferensial tənlikləri olan ModelingToolkit.jl və böyük səbəb modelləri) daha sürətli tərtib edilir.
    • Qeyri-spesifik arqumentləri olan zənglər indi bir neçə müxtəlif növ göndərmə namizədləri olsa belə, enjeksiyon və ya statik həll üçün optimallaşdırıla bilər. Bu, "@nospecialize-d" çağırış saytlarını statik olaraq həll etməklə və təkrar kompilyasiyadan qaçmaqla, obyekt növlərinin tam statik olaraq həll edilmədiyi müəyyən vəziyyətlərdə performansı yaxşılaşdıra bilər.
    • Base modulunda @pure makronun bütün istifadələri Base.@assume_effects ilə əvəz edilmişdir.
    • Normal olaraq f(args...) üçün istifadə edilənlərdən daha az spesifik növlərlə çağırmaq (f, invokesig, args...) çağırışları artıq paketin yenidən tərtib edilməsinə səbəb olmur.
  • Komanda xətti parametrləri dəyişir
    • Linux və Windows-da "--threads=auto" seçimi indi adətən HPC və bulud mühitlərində quraşdırılmış maska ​​olan CPU yaxınlığına əsaslanaraq mövcud prosessorların sayını müəyyən etməyə çalışır.
    • "--math-mode=fast" seçimi qeyri-aktiv edilib, bunun əvəzinə dəqiq müəyyən edilmiş semantikaya malik "@fastmath" makrosundan istifadə etmək tövsiyə olunur.
    • "--threads" parametri indi "auto |." formatına malikdir N[,auto|M]", burada M yaradılacaq interaktiv mövzuların sayını təyin edir (hazırda avtomatik 1 deməkdir).
    • "--heap-size-hint=" seçimi əlavə edildi ”, aktiv zibil yığımına başladıqdan sonra həddi təyin edir. Ölçü bayt, kilobayt (1000 KB), meqabayt (300 MB) və ya gigabayt (1,5 GB) ilə müəyyən edilə bilər.
  • Çoxillik Dəyişikliklər
    • "Threads.@spawn" indi ":default" və ya ":interactive" isteğe bağlı birinci arqumentinə malikdir. İnteraktiv tapşırıq aşağı gecikmə cavabı tələb edir və qısa və ya tez-tez yerinə yetirilmək üçün nəzərdə tutulub. İnteraktiv tapşırıqlar Julia-nı işə salarkən müəyyən olunarsa, interaktiv mövzularda işləyəcək.
    • Julia işləmə müddətindən kənarda işə salınan mövzular (məsələn, C və ya Java-dan) indi "jl_adopt_thread" istifadə edərək Julia koduna zəng edə bilər. Bu, Julia kodunu "cfunction" və ya "@ccallable" giriş nöqtəsi vasitəsilə daxil etdiyiniz zaman avtomatik olaraq baş verir. Nəticə etibarı ilə, iş zamanı mövzuların sayı artıq dəyişə bilər.
  • Yeni kitabxana funksiyaları
    • Yeni "Iterators.flatmap" funksiyası.
    • Yeni "pkgversion(m::Module)" funksiyası "pkgdir(m::Module)" kimi verilmiş modulu yükləyən paketin versiyasını əldə etmək üçün.
    • "reduce(hcat, x::Vector{<:Vector})" funksiyasını istənilən ölçüyə ümumiləşdirən və iteratorların istənilən iteratoruna imkan verən yeni "stack(x)" funksiyası. "Stack(f, x)" metodu "mapreduce(f, hcat, x)" ümumiləşdirir və daha səmərəlidir.
    • Ayrılmış yaddaşın təhlili üçün yeni makro "@ayrılmış", "@ayrılmış" kimi, o, ayrılmış yaddaşın ümumi ölçüsünü deyil, yaddaş ayırmalarının sayını qaytarır.
  • Kitabxananın yeni xüsusiyyətləri
    • "RoundFromZero" indi "BigFloat"dan başqa növlər üçün işləyir.
    • "Dict" indi "sizehint!" ilə əl ilə kiçilə bilər.
    • İndi "@time" ayrı-ayrılıqda etibarsız metodların yenidən tərtib edilməsinə sərf olunan vaxtın faizini göstərir.
  • Standart kitabxanada dəyişikliklər
    • Dict və açarlar(::Dict), dəyərlər(::Dict) və Set kimi digər törəmə obyektlər üçün iterasiya üsullarında paralellik problemi həll edildi. Lüğəti və ya dəsti dəyişdirən heç bir hərəkət olmadıqda, bu iterasiya üsulları indi qeyri-məhdud sayda mövzularda paralel olaraq Dict və ya Set-də çağırıla bilər.
    • "!f" predikat funksiyasının inkar edilməsi indi anonim funksiya yerinə "(!) ∘ f" kompozit funksiyasını qaytarır.
    • Ölçü dilimləri funksiyaları indi bir neçə ölçüdə işləyir: "hər dilim", "hər bir qırış" və "hər bir kol" daha səmərəli üsullar təqdim etmək üçün göndərmə imkanını verən "Dilimlər" obyektini qaytarır.
    • İctimai API-yə "@kwdef" makrosu əlavə edildi.
    • "fld1"-də əməliyyatların ardıcıllığı ilə bağlı problem həll edildi.
    • Çeşidləmə indi həmişə vaxta uyğundur (yenidən işlənmiş QuickSort).
    • "Base.splat" indi ixrac olunur. Qaytarma dəyəri anonim funksiyadan daha çox "Base.Splat" növüdür və bu, onu gözəl nəticə çıxarmağa imkan verir.
  • Paket Meneceri
    • "Paket Genişləndirmələri": Julia sessiyasında yüklənmiş digər paketlərdən kod parçasını yükləmək üçün dəstək. Tətbiq "Requires.jl" paketinə bənzəyir, lakin əvvəlcədən tərtib və konfiqurasiya uyğunluğu dəstəklənir.
  • Xətti Cəbr Kitabxanası
    • Elementar bölgü ilə çaşqınlıq riskinə görə, "a * pinv(b)"-ə ekvivalent olan "a" və "b" vektoru olan "a / b" və "b \ a" üsulları çıxarıldı.
    • BLAS və LAPACK zəngləri indi "libblastrampoline (LBT)" istifadə edir. OpenBLAS defolt olaraq təmin edilir, lakin digər BLAS/LAPACK kitabxanaları ilə sistem təsvirinin qurulması dəstəklənmir. Bunun əvəzinə, BLAS/LAPACK-ı başqa bir mövcud kitabxana dəsti ilə əvəz etmək üçün LBT mexanizmindən istifadə etmək tövsiyə olunur.
    • "lu" yeni arifmetik tiplərlə və təhsil məqsədləri üçün istifadə üçün sıfırdan fərqli ilk fırlanma elementini seçən yeni "RowNonZero()" matrisinin fırlanma strategiyasını dəstəkləyir.
    • "normalize(x, p=2)" indi skalerlər daxil olmaqla istənilən normallaşdırılmış vektor fəzasını "x" dəstəkləyir.
    • BLAS iplərinin standart sayı indi ARM arxitekturasındakı CPU iplərinin sayına və digər arxitekturalardakı CPU iplərinin sayının yarısına bərabərdir.
  • Printf: Daha yaxşı oxunaqlılıq üçün səhv formalaşdırılmış sətirlər üçün yenidən işlənmiş xəta mesajları.
  • Profil: Chrome tərəfindən dəstəklənən JSON əsaslı ".heapsnapshot" formatında faylı tutan yeni "Profile.take_heap_snapshot(file)" funksiyası.
  • Təsadüfi: randn və randexp indi randı təyin edən istənilən AbstractFloat növü üçün işləyir.
  • ÇIXARIŞ
    • "Alt-e" düymələr kombinasiyasına basmaq indi redaktorda cari girişi açır. Məzmun (əgər dəyişdirilərsə) redaktor çıxdıqda yerinə yetiriləcək.
    • REPL-də aktiv olan cari modul kontekstini "REPL.activate(::Module)" funksiyasından istifadə etməklə və ya modulu REPL-ə daxil edərək "Alt-m" düymələr kombinasiyasını sıxmaqla (defolt olaraq Əsasdır) dəyişdirilə bilər.
    • Hər bir giriş və çıxış üçün nömrələri çap edən və qiymətləndirilmiş nəticələri Out-da saxlayan "nömrələnmiş sorğu" rejimi "REPL.numbered_prompt!()" ilə aktivləşdirilə bilər.
    • Cədvəlin tamamlanması mövcud açar söz arqumentlərini göstərir.
  • SuiteSparse: "SuiteSparse" həlledicisi üçün kod "SparseArrays.jl"-ə köçürüldü. Həlledicilər indi "SuiteSparse.jl" tərəfindən yenidən ixrac olunur.
  • SparseArrays
    • SuiteSparse həllediciləri indi SparseArrays alt modulları kimi mövcuddur.
    • UMFPACK və CHOLMOD axın mühafizəsi rejimləri qlobal dəyişənləri aradan qaldırmaq və kilidlərdən istifadə etməklə təkmilləşdirilmişdir. Çoxillikli "ldiv!" UMFPACK obyektləri indi təhlükəsiz şəkildə icra edilə bilər.
    • "SparseArrays.allowscalar(::Bool)" eksperimental funksiyası seyrək massivlərin skalyar indeksləşdirilməsini söndürməyə və ya aktivləşdirməyə imkan verir. Bu funksiya performans problemlərinin ümumi mənbəyi olan "SparseMatrixCSC" obyektlərinin təsadüfi skalyar indeksləşdirilməsini aşkar etmək üçün nəzərdə tutulmuşdur.
  • Uğursuzluq və ya xəta halında sınaq işini erkən dayandıran test dəstləri üçün yeni işləmə rejimi. "@testset kwarg failfast=true" və ya "eksport JULIA_TEST_FAILFAST=true" vasitəsilə təyin edin. Bu, erkən səhv mesajlarını almaq üçün CI işə salınmalarında lazım ola bilər.
  • Tarixlər: Boş sətirlər artıq etibarlı "Tarix Saatı", "Tarixlər" və ya "Saat" dəyərləri kimi səhv təhlil edilmir və bunun əvəzinə konstruktorlarda və təhlildə "ArgumentError" xətası verir, "tryparse" isə heç nə qaytarmır.
  • Paylanmış paket
    • Paket konfiqurasiyası (aktiv layihə, "LOAD_PATH", "DEPOT_PATH") indi yerli işçi prosesləri əlavə edildikdə (məsələn, "addprocs(N::Int)" və ya "-procs=N" əmr satırı bayrağı ilə) yayılır.
    • Yerli işçi prosesləri üçün "addprocs" indi mühit dəyişənlərini işçi proseslərinə ötürmək üçün "env" adlı arqument alır.
  • Unicode: "graphemes(s, m:n)" alt sətri "s"-də m-dən n-ci qrafemlərə qaytarır.
  • DelimitedFiles paketi sistem kitabxanalarından silinib və indi istifadə etmək üçün açıq şəkildə quraşdırılmalı olan ayrıca paket kimi paylanıb.
  • Xarici asılılıqlar
    • Linux libstdc++ sistem kitabxanasının versiyasını avtomatik aşkarlayır və daha yenidirsə, onu yükləyir. Sistem versiyasından asılı olmayaraq daxili libstdc++ yüklənməsinin köhnə davranışı "JULIA_PROBE_LIBSTDCXX=0" mühit dəyişənini təyin etməklə bərpa edilə bilər.
    • "RUNPATH" dəyişənini təyin edə bilməyən Linux-da kitabxanaları poza bilən julia binar sistemindən "RPATH" silindi.
    • Alət təkmilləşdirmələri: "MethodError" və metodların çıxışı (məsələn, "methods(my_func)"-dan) indi metodların yığın izlərində necə çıxarıldığına görə formatlanır və rənglənir.

    Mənbə: opennet.ru

Добавить комментарий