Vydání Julia Programming Language 1.8

K dispozici je vydání programovacího jazyka Julia 1.8, 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.8:

  • Nové jazykové funkce
    • Pole proměnlivé struktury lze nyní označit jako konstanty, aby se zabránilo jejich změně a umožnila optimalizace.
    • Ke globálním proměnným lze přidávat anotace typu.
    • Prázdná n-rozměrná pole lze vytvořit pomocí více středníků uvnitř hranatých závorek, například "[;;;]" vytvoří pole 0x0x0.
    • Bloky Try nyní mohou mít volitelně blok else, který se provede ihned po hlavním těle, pokud nebyly vyvolány žádné chyby.
    • @inline a @noinline lze umístit do těla funkce, což vám umožní anotovat anonymní funkci.
    • @inline a @noinline lze nyní použít na funkci v místě volání nebo bloku a vynutit tak zahrnutí (nebo nezahrnutí) odpovídajících volání funkcí.
    • ∀, ∃ a ∄ jsou povoleny jako identifikační znaky.
    • Přidána podpora specifikace Unicode 14.0.0.
    • Metodu Module(:name, false, false) lze použít k vytvoření modulu, který neobsahuje názvy, neimportuje Base ani Core a neobsahuje odkaz na sebe.
  • Změny v jazyce
    • Nově vytvořené objekty Task (@spawn, @async atd.) mají nyní po vytvoření world_age pro metody z nadřazené úlohy, což umožňuje optimalizované provádění. Předchozí možnost aktivace je dostupná pomocí metody Base.invokelatest.
    • Direktivy Unicode pro nevyvážené obousměrné formátování jsou nyní zakázány v řetězcích a komentářích, aby se zabránilo vkládání.
    • Base.ifelse je nyní definován jako generická funkce spíše než vestavěná, což umožňuje balíčkům rozšířit její definici.
    • Každé přiřazení ke globální proměnné nyní nejprve prochází voláním convert(Any, x) nebo convert(T, x), pokud byla globální proměnná deklarována jako typu T. Před použitím globálních proměnných se ujistěte, že invariantní convert(Any , x) === x je vždy pravdivé, jinak může vést k neočekávanému chování.
    • Vestavěné funkce jsou nyní podobné generickým funkcím a lze je programově vyčíslit pomocí metod.
  • Vylepšení kompilátoru/runtime
    • Doba spouštění se zkrátila přibližně o 25 %.
    • Kompilátor založený na LLVM byl oddělen od runtime knihovny do nové knihovny libjulia-codegen. Standardně se načítá, takže při běžném používání by nemělo docházet k žádným změnám. V nasazeních, která nepotřebují kompilátor (například systémové obrazy, ve kterých je předkompilován veškerý potřebný kód), lze tuto knihovnu (a její závislost na LLVM) jednoduše vynechat.
    • Podmíněné odvození typu je nyní možné předáním argumentu metodě. Například pro Base.ifelse(isa(x, Int), x, 0) vrátí ::Int, i když je typ x neznámý.
    • SROA (Scalar Replacement of Aggregates) bylo vylepšeno: eliminuje volání getfield s trvalými globálními poli, eliminuje proměnlivé struktury s neinicializovanými poli, zlepšuje výkon a zpracování vnořených volání getfield.
    • Odvozování typu sleduje různé efekty – vedlejší efekty a neklesání. Je bráno v úvahu konstantní šíření, což výrazně zlepšuje výkon v době kompilace. V některých případech budou například volání funkcí, které nelze vložit, ale neovlivňují výsledek, za běhu zahozena. Pravidla pro efekty lze ručně přepsat pomocí makra Base.@assume_effects.
    • Předkompilace (s explicitními direktivami předkompilace nebo specifikovanými pracovními zátěžemi) nyní šetří více typově definovaného kódu, což vede k rychlejšímu prvnímu spuštění. Jakékoli nové kombinace metod/typů potřebné pro váš balíček, bez ohledu na to, kde byly tyto metody definovány, lze nyní uložit do mezipaměti v souboru předkompilace, pokud jsou volány metodou patřící k vašemu balíčku.
  • Změny v možnostech příkazového řádku
    • Výchozí chování pro monitorování deklarací @inbounds je nyní volba auto v "--check-bounds=yes|no|auto".
    • Nová možnost „--strip-metadata“ pro odstranění řetězců dokumentů, informací o umístění zdroje a názvů místních proměnných při vytváření obrazu systému.
    • Nová volba "--strip-ir", která umožňuje kompilátoru odstranit přechodnou reprezentaci zdrojového kódu při vytváření obrazu systému. Výsledný obrázek bude fungovat pouze v případě, že je použito "--compile=all" nebo pokud je předkompilován veškerý požadovaný kód.
    • Pokud je místo názvu souboru zadán znak "-", pak se spustitelný kód načte ze standardního vstupního proudu.
  • Změny podpory multithreadingu
    • Threads.@threads ve výchozím nastavení používá novou možnost plánování :dynamic, která se liší od předchozího režimu v tom, že iterace budou plánovány dynamicky napříč dostupnými pracovními vlákny, spíše než aby byly přiřazeny každému vláknu. Tento režim umožňuje lepší distribuci vnořených smyček s @spawn a @threads.
  • Nové funkce knihovny
    • Eachsplit(str), chcete-li provést split(str) vícekrát.
    • allequal(itr) pro testování, zda jsou všechny prvky v iterátoru stejné.
    • hardlink(src, dst) lze použít k vytvoření pevných odkazů.
    • setcpuaffinity(cmd, cpus) pro nastavení afinity jádra procesoru ke spouštěným procesům.
    • diskstat(cesta=pwd()) pro získání statistiky disku.
    • Nové makro @showtime pro zobrazení vyhodnocovaného řádku i sestavy @time.
    • LazyString a lazy "str" ​​​​Makro byly přidány pro podporu líné konstrukce chybových zpráv v chybových cestách.
    • Opraven problém se souběžností v Dict a dalších odvozených objektech, jako jsou keys(::Dict), values(::Dict) a Set. Iterační metody lze nyní volat ve slovníku nebo množině, pokud neexistují žádná volání, která by modifikovala slovník nebo množinu.
    • @time a @timev nyní mají volitelný popis, který vám umožňuje například anotovat zdroj časových zpráv. @time "Hodnocení foo" foo().
    • rozsah má jako jediný argument klíčového slova buď stop nebo délku.
    • precision a setprecision nyní přijímají základ jako klíčové slovo
    • Objekty soketu TCP nyní poskytují metodu closewrite a podporují použití polootevřeného režimu.
    • extrema nyní přijímá argument init.
    • Iterators.countfrom nyní přijímá jakýkoli typ, který definuje metodu +.
    • @time nyní přiděluje % času stráveného překompilováním metod se změněnými typy.
  • Standardní změny knihovny
    • Klíče s hodnotou Nothing jsou nyní odstraněny z prostředí v addenv.
    • Iterators.reverse (a tedy poslední) podporuje každý řádek.
    • Funkce délky pro rozsahy určitých typů již nekontroluje přetečení celého čísla. K dispozici je nová funkce Check_length, která obsahuje logiku řízení přenosu bitů. V případě potřeby použijte k vytvoření typu rozsahu SaferIntegers.jl.
    • Iterátor Iterators.Reverse implementuje obrácení každého indexu, pokud je to možné.
  • Správce balíčků
    • Nové indikátory ⌃ a ⌅ vedle balíčků ve stavu „balíček>“, pro které jsou k dispozici nové verze. ⌅ znamená, že nové verze nelze nainstalovat.
    • Nový argument outdated::Bool pro Pkg.status (--outdated nebo -o v režimu REPL) pro zobrazení informací o balíčcích předchozích verzí.
    • Nový argument compat::Bool pro Pkg.status (--compat nebo -c v režimu REPL) pro zobrazení všech položek [compat] v Project.toml.
    • Nový režim "pkg>compat" (a Pkg.compat) pro nastavení položek kompatibility projektu. Poskytuje interaktivní editor přes "pkg>compat" nebo přímou kontrolu záznamu pomocí "pkg>Foo 0.4,0.5", který dokáže načíst aktuální záznamy pomocí doplňování karet. To znamená "pkg> compat Fo " se automaticky aktualizuje na "pkg>Foo 0.4,0.5, XNUMX", aby bylo možné upravit existující záznam.
    • Pkg se nyní pokouší stáhnout balíčky ze serveru balíčků pouze v případě, že server sleduje registr obsahující balíček.
    • Pkg.instantiate nyní vydá varování, když Project.toml není synchronizován s Manifest.toml. Dělá to na základě hash záznamů deps a compat projektu (ostatní pole jsou ignorována) v manifestu při jeho řešení, takže jakákoli změna v záznamech Project.toml deps nebo compat může být detekována bez opětovného řešení.
    • Pokud "pkg>add" nemůže najít balíček s daným názvem, nyní navrhne balíčky s podobnými názvy, které lze přidat.
    • Verze julia uložená v manifestu již neobsahuje číslo sestavení, což znamená, že master bude nyní zapsán jako 1.9.0-DEV.
    • Zrušení testu "pkg>" bude nyní detekováno konzistentněji a bude správně vráceno do REPL.
  • InteractiveUtils
    • Nové makro @time_imports pro hlášení času stráveného importem balíčků a jejich závislostí, zvýraznění doby kompilace a opětovné kompilace jako procento importů.
  • Lineární algebra
    • Submodul BLAS nyní podporuje funkce BLAS spr! úrovně 2.
    • Standardní knihovna LinearAlgebra.jl je nyní zcela nezávislá na SparseArrays.jl, a to jak z pohledu zdrojového kódu, tak z hlediska testování jednotek. V důsledku toho již nejsou řídká pole vrácena (implicitně) metodami z LinearAlgebra aplikovanými na objekty Base nebo LinearAlgebra. To vede zejména k následujícím zlomovým změnám:
      • Zřetězení pomocí speciálních „řídkých“ matic (např. diagonálních) nyní vracejí husté matice; V důsledku toho jsou pole D1 a D2 objektů SVD vytvořených voláním getproperty nyní hustými maticemi.
      • Metoda podobnou(::SpecialSparseMatrix, ::Type, ::Dims) vrací hustou matici null. V důsledku toho součiny dvou-, tří- a symetrických tridiagonálních matic mezi sebou vedou ke vzniku husté matice. Navíc konstrukce podobných matic se třemi argumenty ze speciálních "řídkých" matic z (nestatických) matic nyní selhává kvůli "zero(::Type{Matrix{T}})".
  • Printf
    • %s a %c nyní používají argument šířky textu k formátování šířky.
  • Změna hesla
    • Profilování zatížení CPU nyní zaznamenává metadata včetně vláken a úloh. Profile.print() má nový argument groupby, který vám umožňuje seskupit vlákna, úlohy nebo podvlákna/úlohy, úlohy/vlákna a vlákna a argumenty úloh za účelem filtrování. Navíc se nyní uvádí procento využití buď jako celkové, nebo na vlákno, v závislosti na tom, zda je vlákno v každém vzorku nečinné nebo ne. Profile.fetch() ve výchozím nastavení obsahuje nová metadata. Pro zpětnou kompatibilitu s externími spotřebiteli profilovacích dat je lze vyloučit předáním include_meta=false.
    • Nový modul Profile.Allocs umožňuje profilovat alokace paměti. Zaznamenává se trasování zásobníku typu a velikosti každé alokace paměti a argument sample_rate umožňuje přeskočit konfigurovatelný počet alokací, což snižuje režii výkonu.
    • Profilování CPU s pevnou dobou trvání může nyní uživatel spouštět při spuštěných úlohách bez předchozího načtení profilu a během běhu se bude zobrazovat sestava. Na MacOS a FreeBSD stiskněte ctrl-t nebo zavolejte SIGINFO. Pro ostatní platformy aktivujte SIGUSR1, tzn. % kill -USR1 $julia_pid. Toto není k dispozici v systému Windows.
  • ODPOVĚĎ
    • RadioMenu nyní podporuje další klávesové zkratky pro přímý výběr možností.
    • Sekvence "?(x, y" následovaná stisknutím klávesy TAB zobrazí všechny metody, které lze volat s argumenty x, y, .... (Mezera na začátku vám brání vstoupit do režimu nápovědy.) "MyModule.?(x, y " omezí hledání na "MyModule". Stisknutí klávesy TAB vyžaduje, aby alespoň jeden argument byl specifičtějšího typu než Libovolný. Nebo použijte SHIFT-TAB místo TAB, abyste povolili jakékoli kompatibilní metody.
    • Nová globální proměnná err vám umožňuje získat nejnovější výjimku, podobně jako chování ans s poslední odpovědí. Zadáním err se znovu vytisknou informace o výjimce.
  • SparseArrays
    • Přesunul kód SparseArrays z úložiště Julia do externího úložiště SparseArrays.jl.
    • Nové funkce zřetězení sparse_hcat, sparse_vcat a sparse_hvcat vracejí typ SparseMatrixCSC bez ohledu na typy vstupních argumentů. To se stalo nezbytným pro sjednocení mechanismu pro lepení matic po oddělení kódu LinearAlgebra.jl a SparseArrays.jl.
  • Přihlášení
    • Standardní úrovně protokolování BelowMinLevel, Debug, Info, Warn, Error a AboveMaxLevel jsou nyní exportovány ze standardní knihovny protokolování.
  • Unicode
    • Přidána funkce isequal_normalized pro kontrolu ekvivalence Unicode bez explicitního vytváření normalizovaných řetězců.
    • Funkce Unicode.normalize nyní přijímá klíčové slovo charttransform, které lze použít k poskytování vlastních mapování znaků, a funkce Unicode.julia_chartransform je také k dispozici pro reprodukci mapování použitého při normalizaci identifikátorů analyzátorem Julia.
  • test
    • '@test_throws "nějaká zpráva" triggers_error()' lze nyní použít k testování, zda zobrazený text chyby obsahuje chybu "nějaká zpráva", bez ohledu na konkrétní typ výjimky. Podporovány jsou také regulární výrazy, seznamy řetězců a porovnávací funkce.
    • @testset foo() lze nyní použít k vytvoření testovací sady z dané funkce. Název testovacího případu je název volané funkce. Volaná funkce může obsahovat @test a další definice @testset, včetně volání jiných funkcí, a zároveň zaznamenávat všechny mezivýsledky testu.
    • TestLogger a LogRecord jsou nyní exportovány ze standardní knihovny Test.
  • Distribuováno
    • SSHManager nyní podporuje pracovní vlákna s obalem csh/tcsh prostřednictvím metody addprocs() a parametru shell=:csh.
  • Další změny
    • GC.enable_logging(true) lze použít k protokolování každé operace shromažďování odpadu s časem a množstvím shromážděné paměti.

Zdroj: opennet.ru

Přidat komentář