K dispozícii je programovací jazyk Julia 1.9

Bolo zverejnené vydanie programovacieho jazyka Julia 1.9, ktorý kombinuje také kvality, ako je vysoký výkon, podpora dynamického písania a vstavané nástroje pre paralelné programovanie. Juliina syntax je blízka MATLABu, pričom niektoré prvky preberá z Ruby a Lisp. Metóda manipulácie so strunami pripomína Perl. Kód projektu je distribuovaný pod licenciou MIT.

Kľúčové vlastnosti jazyka:

  • Vysoký výkon: jedným z kľúčových cieľov projektu je dosiahnuť výkon blízky programom C. Kompilátor Julia je založený na práci projektu LLVM a generuje efektívny natívny strojový kód pre mnohé cieľové platformy;
  • Podporuje rôzne programovacie paradigmy, vrátane prvkov objektovo orientovaného a funkčného programovania. Štandardná knižnica poskytuje okrem iného funkcie pre asynchrónne I/O, riadenie procesov, protokolovanie, profilovanie a správu balíkov;
  • Dynamické písanie: jazyk nevyžaduje explicitnú definíciu typov premenných, podobne ako skriptovacie programovacie jazyky. Podporovaný interaktívny režim;
  • Voliteľná možnosť explicitne špecifikovať typy;
  • Syntax ideálna pre numerické výpočty, vedecké výpočty, strojové učenie a vizualizáciu údajov. Podpora mnohých numerických dátových typov a nástrojov na paralelizáciu výpočtov.
  • Schopnosť priamo volať funkcie z knižníc C bez ďalších vrstiev.

Hlavné zmeny v Julii 1.9:

  • Nové jazykové funkcie
    • Povoliť priradenia v inom module pomocou "setproperty!(::Module, ::Symbol, x)".
    • Viacnásobné úlohy, ktoré nie sú na konečnej pozícii, sú povolené. Napríklad reťazec „a, b…, c = 1, 2, 3, 4“ bude spracovaný ako „a = 1; b..., = 2, 3; c = 4". Toto je riešené cez Base.split_rest.
    • Jednoznakové literály teraz podporujú rovnakú syntax ako reťazcové literály; tie. Syntax môže predstavovať neplatné sekvencie UTF-8, ako to umožňuje typ Char.
    • Pridaná podpora pre špecifikáciu Unicode 15.
    • Vnorené kombinácie n-tic a pomenovaných n-tic možno teraz použiť ako parametre typu.
    • Nové vstavané funkcie „getglobal(::Module, ::Symbol[, order])“ a „setglobal!(::Module, ::Symbol, x[, order])“ na čítanie a zápis výlučne do globálnych premenných. Metóda getglobal by teraz mala byť uprednostňovaná pred metódou getfield pre prístup ku globálnym premenným.
  • Zmeny v jazyku
    • Makro „@invoke“ zavedené vo verzii 1.7 je teraz exportované a dostupné na použitie. Okrem toho teraz používa metódu "Core.Typeof(x)" namiesto "Any" v prípade, že je pre argument "x" vynechaná anotácia typu. Je to potrebné na zabezpečenie správneho spracovania typov odovzdaných ako argumenty.
    • Povolený export funkcie „invokelatest“ a makra „@invokelatest“, zavedené vo verzii 1.7.
  • Vylepšenia kompilátora/runtime
    • Výrazne skrátený čas do prvého vykonania (TTFX - Time to first trigger). Predkompilácia balíka teraz ukladá natívny kód do „pkgimage“, čo znamená, že kód vygenerovaný procesom predkompilácie nebude potrebné po načítaní balíka prekompilovať. Použitie režimu pkgimages možno zakázať pomocou voľby "--pkgimages=no".
    • Známy problém s kvadratickou zložitosťou typovej inferencie bol opravený a inferencia celkovo využíva menej pamäte. Niektoré okrajové prípady s automaticky generovanými dlhými funkciami (napríklad ModelingToolkit.jl s parciálnymi diferenciálnymi rovnicami a veľkými kauzálnymi modelmi) sa kompilujú oveľa rýchlejšie.
    • Hovory s argumentmi bez konkrétnych typov môžu byť teraz optimalizované Union-splitting pre vstrekovanie alebo statické rozlíšenie, aj keď existuje viacero rôznych typov kandidátov na odoslanie. To môže zlepšiť výkon v určitých situáciách, keď typy objektov nie sú úplne staticky rozlíšené, statickým riešením volacích stránok "@nospecialize-d" a zabránením rekompilácii.
    • Všetky použitia makra @pure v module Base boli nahradené pomocou Base.@assume_effects.
    • Volania invoke(f, invokesig, args...) s menej špecifickými typmi ako sa zvyčajne používajú pre f(args...) už nespôsobujú prekompilovanie balíka.
  • Zmeny v možnostiach príkazového riadka
    • V systémoch Linux a Windows sa možnosť „--threads=auto“ teraz pokúša určiť dostupný počet procesorov na základe afinity CPU, čo je maska ​​zvyčajne nastavená v prostrediach HPC a cloud.
    • Parameter „--math-mode=fast“ je vypnutý, namiesto neho sa odporúča použiť makro „@fastmath“, ktoré má jasne definovanú sémantiku.
    • Možnosť "--threads" je teraz vo formáte "auto | N[,auto|M]", kde M označuje počet interaktívnych vlákien, ktoré sa majú vytvoriť (momentálne auto znamená 1).
    • Pridaná možnosť „—heap-size-hint=“ “, ktorý nastavuje prah, po ktorom sa začne aktívne zbieranie odpadu. Veľkosť je možné zadať v bajtoch, kilobajtoch (1000 300 KB), megabajtoch (1,5 MB) alebo gigabajtoch (XNUMX GB).
  • Zmeny v multithreadingu
    • "Threads.@spawn" má teraz voliteľný prvý argument s hodnotou ":default" alebo ":interactive". Interaktívna úloha vyžaduje nízku latenciu odozvy a je navrhnutá tak, aby bola krátka alebo vykonávaná často. Interaktívne úlohy sa spustia na interaktívnych vláknach, ak sú špecifikované pri spustení Julie.
    • Vlákna bežiace mimo modul Julia runtime (napríklad z C alebo Java) môžu teraz volať kód Julia pomocou "jl_adopt_thread". Stane sa to automaticky pri zadávaní kódu Julia cez „cfunction“ alebo „@callable“ vstupný bod. V dôsledku toho sa teraz počet vlákien môže počas vykonávania meniť.
  • Nové funkcie knižnice
    • Nová funkcia "Iterators.flatmap".
    • Nová funkcia "pkgversion(m::Module)" na získanie verzie balíka, ktorý načítal daný modul, podobne ako "pkgdir(m::Module)".
    • Nová funkcia "stack(x)", ktorá zovšeobecňuje "reduce(hcat, x::Vector{<:Vector})" na ľubovoľnú dimenziu a umožňuje ľubovoľný iterátor iterátorov. Metóda „stack(f, x)“ zovšeobecňuje „mapreduce(f, hcat, x)“ a je efektívnejšia.
    • Nové makro na analýzu pridelenej pamäte "@allocations", podobné "@allocated", s tým rozdielom, že vracia počet alokácií pamäte, a nie celkovú veľkosť pridelenej pamäte.
  • Nové funkcie knižnice
    • "RoundFromZero" teraz funguje pre iné typy ako "BigFloat".
    • "Dict" je teraz možné manuálne zmenšiť pomocou "sizehint!"
    • "@time" teraz samostatne určuje percento času stráveného prekompilovaním neplatných metód.
  • Zmeny v štandardnej knižnici
    • Opravený problém so súbežnosťou v iteračných metódach pre Dict a iné odvodené objekty, ako sú kľúče(::Dict), hodnoty(::Dict) a Set. Tieto iteračné metódy je teraz možné volať na Dict alebo Set paralelne pre neobmedzený počet vlákien, pokiaľ neexistujú žiadne akcie, ktoré by modifikovali slovník alebo sadu.
    • Negácia predikátovej funkcie "!f" teraz namiesto anonymnej funkcie vráti zloženú funkciu "(!) ∘ f".
    • Funkcie rezov dimenzií teraz fungujú vo viacerých dimenziách: „eachslice“, „eachrow“ a „eachcol“ vracajú objekt „Slices“, ktorý umožňuje odosielanie poskytovať efektívnejšie metódy.
    • Do verejného rozhrania API bolo pridané makro „@kwdef“.
    • Opravený problém s poradím operácií v "fld1".
    • Triedenie je teraz vždy časovo stabilné (QuickSort bol prepracovaný).
    • "Base.splat" je teraz exportovaný. Návratová hodnota je typ "Base.Splat" a nie anonymná funkcia, čo umožňuje jej pekný výstup.
  • Správca balíkov
    • "Rozšírenia balíkov": Podpora načítania útržku kódu z iných balíkov načítaných v relácii Julia. Aplikácia je podobná balíku „Requires.jl“, ale podporuje sa predkompilácia a kompatibilita nastavení.
  • Knižnica lineárnej algebry
    • Kvôli riziku zámeny s delením podľa prvkov boli odstránené metódy „a/b“ a „b\a“ so skalárnym „a“ a vektorom „b“, ktoré boli ekvivalentné „a * pinv(b)“.
    • Volanie BLAS a LAPACK teraz používa "libblastrampoline (LBT)". OpenBLAS je poskytovaný štandardne, ale vytváranie obrazu systému pomocou iných knižníc BLAS/LAPACK nie je podporované. Namiesto toho sa odporúča použiť mechanizmus LBT na nahradenie BLAS/LAPACK inou existujúcou sadou knižníc.
    • „lu“ podporuje novú stratégiu rotácie matice „RowNonZero()“, ktorá vyberá prvý prvok nenulovej rotácie na použitie s novými typmi aritmetiky a na tréningové účely.
    • "normalize(x, p=2)" teraz podporuje akýkoľvek normalizovaný vektorový priestor "x" vrátane skalárov.
    • Predvolený počet vlákien BLAS sa teraz rovná počtu vlákien CPU na architektúrach ARM a polovici počtu vlákien CPU na iných architektúrach.
  • Printf: Prepracované chybové hlásenia pre nesprávne naformátované reťazce pre lepšiu čitateľnosť.
  • Profil: Nová funkcia „Profile.take_heap_snapshot(file)“, ktorá zapisuje súbor vo formáte „.heapsnapshot“ založenom na JSON podporovanom v prehliadači Chrome.
  • Náhodné: randn a randexp teraz fungujú pre akýkoľvek typ AbstractFloat, ktorý definuje rand.
  • ODPOVEĎ
    • Stlačením kombinácie kláves "Alt-e" sa teraz otvorí aktuálny vstup v editore. Obsah (ak je upravený) sa spustí, keď opustíte editor.
    • Aktuálny kontext modulu aktívny v REPL je možné zmeniť (predvolene Main) pomocou funkcie "REPL.activate(::Module)" alebo zadaním modulu do REPL a stlačením kombinácie kláves "Alt-m".
    • Režim "číslovanej výzvy", ktorý tlačí čísla pre každý vstup a výstup a ukladá skórované výsledky do Out, možno aktivovať pomocou "REPL.numbered_prompt!()".
    • Dokončením karty sa zobrazia dostupné argumenty kľúčových slov.
  • SuiteSparse: Presunutý kód pre riešiteľ "SuiteSparse" do "SparseArrays.jl". Riešiče teraz reexportuje "SuiteSparse.jl".
  • SparseArrays
    • Riešiče "SuiteSparse" sú teraz k dispozícii ako podmoduly "SparseArrays".
    • Režimy ochrany vlákien UMFPACK a CHOLMOD boli vylepšené odstránením globálnych premenných a použitím zámkov. Viacvláknové "ldiv!" Objekty UMFPACK je teraz možné bezpečne spustiť.
    • Experimentálna funkcia "SparseArrays.allowscalar(::Bool)" vám umožňuje zakázať alebo povoliť skalárne indexovanie riedkych polí. Táto funkcia je navrhnutá na detekciu náhodného skalárneho indexovania objektov "SparseMatrixCSC", čo je bežný zdroj problémov s výkonom.
  • Nový bezpečnostný režim pre testovacie súpravy, ktorý v prípade zlyhania alebo chyby predčasne ukončí skúšobnú prevádzku. Nastavte buď cez „@testset kwarg failfast=true“ alebo „export JULIA_TEST_FAILFAST=true“. Toto je niekedy potrebné pri spustení CI na včasné prijímanie chybových hlásení.
  • Dátumy: Prázdne reťazce už nie sú nesprávne analyzované ako platné hodnoty „DateTime“, „Dates“ alebo „Times“ a namiesto toho vyvolávajú v konštruktoroch a analýze „ArgumentError“, zatiaľ čo „tryparse“ nevracia nič.
  • Balík distribuovaný
    • Konfigurácia balíka (aktívny projekt, "LOAD_PATH", "DEPOT_PATH") sa teraz šíri pri pridávaní lokálnych pracovných procesov (napr. pomocou "addprocs(N::Int)" alebo pomocou príznaku príkazového riadka "--procs=N").
    • "addprocs" pre miestne pracovné procesy teraz akceptuje argument s názvom "env" na odovzdanie premenných prostredia pracovným procesom.
  • Unicode: "graphemes(s, m:n)" vráti podreťazec m-tej až n-tej grafémy v "s".
  • Balík DelimitedFiles bol odstránený zo systémových knižníc a teraz je distribuovaný ako samostatný balík, ktorý musí byť explicitne nainštalovaný, aby mohol byť použitý.
  • Vonkajšie závislosti
    • V Linuxe sa automaticky zistí verzia systémovej knižnice libstdc++ a ak je novšia, načíta sa. Staré správanie vstavaného načítania libstdc++, bez ohľadu na verziu systému, možno obnoviť nastavením premennej prostredia "JULIA_PROBE_LIBSTDCXX=0".
    • Odstránené "RPATH" z binárky julia, čo môže narušiť knižnice v Linuxe, ktoré nedokážu definovať premennú "RUNPATH".
    • Vylepšenia nástroja: Výstup "MethodError" a metód (napríklad z "methods(my_func)") je teraz naformátovaný a zafarbený v súlade s princípom výstupu metód v zásobníku.

    Zdroj: opennet.ru

Pridať komentár