K dispozici je programovací jazyk Julia 1.9

Bylo zveřejněno vydání programovacího jazyka Julia 1.9, který kombinuje takové kvality, jako je vysoký výkon, podpora dynamického psaní a vestavěné nástroje pro paralelní programování. Juliina syntaxe je blízká MATLABu, některé prvky si vypůjčuje z Ruby a Lispu. Metoda manipulace se strunami připomíná Perl. Kód projektu je distribuován pod licencí MIT.

Klíčové vlastnosti jazyka:

  • Vysoký výkon: jedním z klíčových cílů projektu je dosáhnout výkonu blízkého programům C. Kompilátor Julia je založen na práci projektu LLVM a generuje efektivní nativní strojový kód pro mnoho cílových platforem;
  • Podporuje různá programovací paradigmata, včetně prvků objektově orientovaného a funkčního programování. Standardní knihovna poskytuje mimo jiné funkce pro asynchronní I/O, řízení procesů, protokolování, profilování a správu balíčků;
  • Dynamické typování: jazyk nevyžaduje explicitní definici typů proměnných, podobně jako skriptovací programovací jazyky. Podporován interaktivní režim;
  • Volitelná možnost explicitně specifikovat typy;
  • Syntaxe ideální pro numerické výpočty, vědecké výpočty, strojové učení a vizualizaci dat. Podpora mnoha numerických datových typů a nástrojů pro paralelizaci výpočtů.
  • Možnost přímého volání funkcí z C knihoven bez dalších vrstev.

Hlavní změny v Julia 1.9:

  • Nové jazykové funkce
    • Povolit přiřazení v jiném modulu pomocí "setproperty!(::Module, ::Symbol, x)".
    • Vícenásobná zadání, která nejsou na konečné pozici, jsou povolena. Například řetězec „a, b…, c = 1, 2, 3, 4“ bude zpracován jako „a = 1; b..., = 2, 3; c = 4". To je řešeno přes Base.split_rest.
    • Jednoznakové literály nyní podporují stejnou syntaxi jako řetězcové literály; těch. Syntaxe může představovat neplatné sekvence UTF-8, jak to umožňuje typ Char.
    • Přidána podpora specifikace Unicode 15.
    • Vnořené kombinace n-tic a pojmenovaných n-tic lze nyní použít jako parametry typu.
    • Nové vestavěné funkce "getglobal(::Module, ::Symbol[, order])" a "setglobal!(::Module, ::Symbol, x[, order])" pro čtení a zápis výhradně do globálních proměnných. Metoda getglobal by nyní měla být upřednostňována před metodou getfield pro přístup ke globálním proměnným.
  • Změny v jazyce
    • Makro "@invoke" představené ve verzi 1.7 je nyní exportováno a dostupné k použití. Navíc nyní používá metodu "Core.Typeof(x)" místo "Any" v případě, kdy je pro argument "x" vynechána anotace typu. To je nezbytné pro zajištění správného zpracování typů předávaných jako argumenty.
    • Povolen export funkce „invokelatest“ a makra „@invokelatest“, zavedených ve verzi 1.7.
  • Vylepšení kompilátoru/runtime
    • Výrazně zkrácený čas do prvního spuštění (TTFX - Time to first trigger). Předkompilace balíčku nyní ukládá nativní kód do „pkgimage“, což znamená, že kód generovaný procesem předkompilace nebude nutné po načtení balíčku znovu kompilovat. Použití režimu pkgimages lze zakázat pomocí volby "--pkgimages=no".
    • Známý problém kvadratické složitosti odvození typu byl opraven a odvození celkově využívá méně paměti. Některé okrajové případy s automaticky generovanými dlouhými funkcemi (jako je ModelingToolkit.jl s parciálními diferenciálními rovnicemi a velkými kauzálními modely) se kompilují mnohem rychleji.
    • Volání s argumenty bez konkrétních typů lze nyní Union-splitting optimalizovat pro injektáž nebo statické rozlišení, i když existuje více různých typů kandidátů pro odeslání. To může zlepšit výkon v určitých situacích, kdy typy objektů nejsou plně staticky vyřešeny, statickým vyřešením volacích webů "@nospecialize-d" a zabráněním rekompilaci.
    • Všechna použití makra @pure v modulu Base byla nahrazena Base.@assume_effects.
    • Volání invoke(f, invokesig, args...) s méně specifickými typy než obvykle používané pro f(args...) již nezpůsobují překompilování balíčku.
  • Změny v možnostech příkazového řádku
    • V systémech Linux a Windows se nyní možnost „--threads=auto“ pokouší určit dostupný počet procesorů na základě afinity CPU, což je maska ​​obvykle nastavená v prostředí HPC a cloudu.
    • Parametr „--math-mode=fast“ je vypnutý, místo něj se doporučuje použít makro „@fastmath“, které má jasně definovanou sémantiku.
    • Možnost "--threads" je nyní ve formátu "auto | N[,auto|M]", kde M označuje počet interaktivních vláken k vytvoření (aktuálně auto znamená 1).
    • Přidána možnost „—heap-size-hint=“ “, který nastavuje práh, po kterém začne aktivní sběr odpadu. Velikost lze zadat v bajtech, kilobajtech (1000 kB), megabajtech (300 MB) nebo gigabajtech (1,5 GB).
  • Změny v multithreadingu
    • "Threads.@spawn" má nyní volitelný první argument s hodnotou ":default" nebo ":interactive". Interaktivní úloha vyžaduje nízkou latenci odezvy a je navržena tak, aby byla krátká nebo prováděná často. Interaktivní úlohy poběží na interaktivních vláknech, pokud jsou zadány při spouštění Julia.
    • Vlákna běžící mimo běhové prostředí Julia (například z C nebo Java) mohou nyní volat kód Julia pomocí "jl_adopt_thread". K tomu dochází automaticky při zadávání kódu Julia prostřednictvím vstupního bodu „cfunction“ nebo „@callable“. V důsledku toho se nyní může počet vláken během provádění změnit.
  • Nové funkce knihovny
    • Nová funkce "Iterators.flatmap".
    • Nová funkce "pkgversion(m::Module)" pro získání verze balíčku, který nahrál daný modul, podobně jako "pkgdir(m::Module)".
    • Nová funkce "stack(x)", která zobecňuje "reduce(hcat, x::Vector{<:Vector})" na libovolnou dimenzi a umožňuje libovolný iterátor iterátorů. Metoda "stack(f, x)" zobecňuje "mapreduce(f, hcat, x)" a je efektivnější.
    • Nové makro pro analýzu alokované paměti "@allocations", podobné "@allocated", až na to, že vrací počet alokací paměti, nikoli celkovou velikost přidělené paměti.
  • Nové funkce knihovny
    • "RoundFromZero" nyní funguje pro jiné typy než "BigFloat".
    • "Dict" lze nyní ručně zmenšit pomocí "sizehint!"
    • "@time" nyní samostatně určuje procento času stráveného překompilováním neplatných metod.
  • Změny ve standardní knihovně
    • Opraven problém souběžnosti v iteračních metodách pro Dict a další odvozené objekty, jako jsou keys(::Dict), values(::Dict) a Set. Tyto iterační metody lze nyní volat na Dict nebo Set paralelně pro neomezený počet vláken, pokud neexistují žádné akce, které by modifikovaly slovník nebo sadu.
    • Negace predikátové funkce "!f" nyní namísto anonymní funkce vrací složenou funkci "(!) ∘ f".
    • Funkce řezů dimenzí nyní fungují ve více dimenzích: „eachslice“, „eachrow“ a „eachcol“ vracejí objekt „Slices“, který umožňuje odesílání poskytovat efektivnější metody.
    • Do veřejného rozhraní API bylo přidáno makro „@kwdef“.
    • Opraven problém s pořadím operací v "fld1".
    • Řazení je nyní vždy časově stabilní (QuickSort byl přepracován).
    • „Base.splat“ je nyní exportován. Návratová hodnota je typu "Base.Splat" spíše než anonymní funkce, což umožňuje její pěkný výstup.
  • Správce balíčků
    • "Rozšíření balíčku": Podpora pro načítání úryvku kódu z jiných balíčků načtených v relaci Julia. Aplikace je podobná balíčku "Requires.jl", ale je podporována předkompilace a kompatibilita nastavení.
  • Knihovna lineární algebry
    • Kvůli riziku záměny s dělením podle prvků byly odstraněny metody "a/b" a "b\a" se skalárním "a" a vektorem "b", které byly ekvivalentní "a * pinv(b)".
    • Volání BLAS a LAPACK nyní používá "libblastrampoline (LBT)". OpenBLAS je poskytován ve výchozím nastavení, ale vytváření obrazu systému pomocí jiných knihoven BLAS/LAPACK není podporováno. Místo toho se doporučuje použít mechanismus LBT k nahrazení BLAS/LAPACK jinou existující sadou knihoven.
    • "lu" podporuje novou strategii rotace matice, "RowNonZero()", která vybírá první nenulový prvek rotace pro použití s ​​novými aritmetickými typy a pro účely školení.
    • "normalize(x, p=2)" nyní podporuje jakýkoli normalizovaný vektorový prostor "x", včetně skalárů.
    • Výchozí počet vláken BLAS se nyní rovná počtu vláken CPU na architekturách ARM a polovině počtu vláken CPU na jiných architekturách.
  • Printf: Přepracované chybové zprávy pro nesprávně naformátované řetězce pro lepší čitelnost.
  • Profil: Nová funkce „Profile.take_heap_snapshot(file)“, která zapisuje soubor ve formátu „.heapsnapshot“ založeném na JSON podporovaném v Chrome.
  • Náhodné: randn a randexp nyní fungují pro jakýkoli typ AbstractFloat, který definuje rand.
  • ODPOVĚĎ
    • Stisknutím kombinace kláves "Alt-e" se nyní otevře aktuální zadání v editoru. Obsah (pokud je upraven) se spustí, když opustíte editor.
    • Aktuální kontext modulu aktivního v REPL lze změnit (standardně Main) pomocí funkce "REPL.activate(::Module)" nebo zadáním modulu do REPL a stisknutím kombinace kláves "Alt-m".
    • Režim "číslované výzvy", který tiskne čísla pro každý vstup a výstup a ukládá ohodnocené výsledky do Out, lze aktivovat pomocí "REPL.numbered_prompt!()".
    • Dokončení karty zobrazí dostupné argumenty klíčových slov.
  • SuiteSparse: Přesunut kód pro řešič "SuiteSparse" do "SparseArrays.jl". Řešitelé jsou nyní reexportováni pomocí "SuiteSparse.jl".
  • SparseArrays
    • Řešiče "SuiteSparse" jsou nyní k dispozici jako submoduly "SparseArrays".
    • Režimy ochrany vláken UMFPACK a CHOLMOD byly vylepšeny odstraněním globálních proměnných a použitím zámků. Vícevláknové "ldiv!" Objekty UMFPACK lze nyní bezpečně spouštět.
    • Experimentální funkce "SparseArrays.allowscalar(::Bool)" umožňuje zakázat nebo povolit skalární indexování řídkých polí. Tato funkce je navržena pro detekci náhodného skalárního indexování objektů "SparseMatrixCSC", což je běžný zdroj problémů s výkonem.
  • Nový režim zabezpečení proti selhání pro testovací sady, který v případě selhání nebo chyby předčasně ukončí testovací běh. Nastavte buď pomocí „@testset kwarg failfast=true“ nebo „export JULIA_TEST_FAILFAST=true“. To je někdy nutné při běhu CI, aby se chybové zprávy přijímaly včas.
  • Data: Prázdné řetězce již nejsou nesprávně analyzovány jako platné hodnoty „DateTime“, „Dates“ nebo „Times“ a místo toho v konstruktorech a analýze vyvolávají „ArgumentError“, zatímco „tryparse“ nevrací nic.
  • Balíček distribuován
    • Konfigurace balíčku (aktivní projekt, "LOAD_PATH", "DEPOT_PATH") se nyní šíří při přidávání místních pracovních procesů (např. pomocí "addprocs(N::Int)" nebo pomocí příznaku příkazového řádku "--procs=N").
    • "addprocs" pro místní pracovní procesy nyní přijímá argument s názvem "env" pro předávání proměnných prostředí pracovním procesům.
  • Unicode: "graphemes(s, m:n)" vrátí podřetězec z m-tého až n-tého grafemu v "s".
  • Balíček DelimitedFiles byl odstraněn ze systémových knihoven a je nyní distribuován jako samostatný balíček, který musí být explicitně nainstalován, aby mohl být použit.
  • Vnější závislosti
    • V Linuxu je automaticky detekována verze systémové knihovny libstdc++ a pokud je novější, je načtena. Staré chování vestavěného načítání libstdc++, bez ohledu na verzi systému, lze obnovit nastavením proměnné prostředí "JULIA_PROBE_LIBSTDCXX=0".
    • Odstraněno "RPATH" z binárky julia, což může narušit knihovny v Linuxu, které nedefinují proměnnou "RUNPATH".
    • Vylepšení nástroje: Výstup "MethodError" a metod (například z "methods(my_func)") je nyní formátován a obarven v souladu s principem výstupu metod v trasování zásobníku.

    Zdroj: opennet.ru

Přidat komentář