Na voljo je programski jezik Julia 1.9

Objavljena je bila izdaja programskega jezika Julia 1.9, ki združuje lastnosti, kot so visoka zmogljivost, podpora za dinamično tipkanje in vgrajena orodja za vzporedno programiranje. Julijina sintaksa je blizu MATLAB-u, nekaj elementov pa si je sposodil od Rubyja in Lispa. Metoda manipulacije nizov spominja na Perl. Koda projekta se distribuira pod licenco MIT.

Glavne značilnosti jezika:

  • Visoka zmogljivost: eden ključnih ciljev projekta je doseči zmogljivost, ki je blizu C programom. Prevajalnik Julia temelji na delu projekta LLVM in ustvarja učinkovito domačo strojno kodo za številne ciljne platforme;
  • Podpira različne paradigme programiranja, vključno z elementi objektno usmerjenega in funkcionalnega programiranja. Standardna knjižnica med drugim zagotavlja funkcije za asinhroni V/I, nadzor procesa, beleženje, profiliranje in upravljanje paketov;
  • Dinamično tipkanje: jezik ne zahteva eksplicitne definicije tipov za spremenljivke, podobno kot skriptni programski jeziki. Podprt interaktivni način;
  • Izbirna zmožnost eksplicitnega določanja tipov;
  • Idealna sintaksa za numerično računalništvo, znanstveno računalništvo, strojno učenje in vizualizacijo podatkov. Podpora za številne tipe numeričnih podatkov in orodja za paralelizacijo izračunov.
  • Možnost neposrednega klicanja funkcij iz knjižnic C brez dodatnih slojev.

Glavne spremembe v Juliji 1.9:

  • Nove jezikovne funkcije
    • Dovolite dodelitve v drugem modulu z uporabo "setproperty!(::Module, ::Symbol, x)".
    • Dovoljenih je več dodelitev, ki niso na končnem mestu. Na primer, niz »a, b…, c = 1, 2, 3, 4« bo obdelan kot »a = 1; b…, = 2, 3; c = 4". To se obravnava prek Base.split_rest.
    • Enoznakovni literali zdaj podpirajo isto sintakso kot nizovni literali; tiste. Sintaksa lahko predstavlja neveljavna zaporedja UTF-8, kot dovoljuje vrsta Char.
    • Dodana podpora za specifikacijo Unicode 15.
    • Ugnezdene kombinacije tulp in tuple imenovanih znakov je zdaj mogoče uporabiti kot parametre tipa.
    • Nove vgrajene funkcije "getglobal(::Module, ::Symbol[, order])" in "setglobal!(::Module, ::Symbol, x[, order])" za branje in pisanje izključno v globalne spremenljivke. Za dostop do globalnih spremenljivk bi morala zdaj imeti prednost metoda getglobal pred metodo getfield.
  • Spremembe v jeziku
    • Makro "@invoke", predstavljen v različici 1.7, je zdaj izvožen in na voljo za uporabo. Poleg tega zdaj uporablja metodo "Core.Typeof(x)" namesto "Any" v primeru, ko je opomba tipa izpuščena za argument "x". To je potrebno za zagotovitev pravilne obdelave tipov, posredovanih kot argumenti.
    • Omogočen izvoz funkcije "invokelatest" in makra "@invokelatest", predstavljen v različici 1.7.
  • Izboljšave prevajalnika/izvajalnega okolja
    • Občutno skrajšan čas do prve izvedbe (TTFX - Time to first execution). Vnaprejšnje prevajanje paketa zdaj shrani izvorno kodo v "pkgimage", kar pomeni, da kode, ustvarjene s postopkom predprevajanja, po nalaganju paketa ne bo treba znova prevajati. Uporabo načina pkgimages lahko onemogočite z možnostjo "--pkgimages=no".
    • Znano vprašanje kvadratne kompleksnosti sklepanja tipa je bilo odpravljeno in sklepanje na splošno porabi manj pomnilnika. Nekateri robni primeri s samodejno ustvarjenimi dolgimi funkcijami (kot je ModelingToolkit.jl s parcialnimi diferencialnimi enačbami in velikimi vzročnimi modeli) se prevedejo veliko hitreje.
    • Klice z argumenti brez konkretnih vrst je zdaj mogoče optimizirati za vstavljanje ali statično ločljivost z razdelitvijo Union, tudi če obstaja več kandidatov različnih vrst za pošiljanje. To lahko izboljša zmogljivost v določenih situacijah, ko tipi objektov niso v celoti statično razrešeni, s statično razrešitvijo klicnih mest "@nospecialize-d" in izogibanjem ponovnemu prevajanju.
    • Vse uporabe makra @pure v modulu Base so bile nadomeščene z Base.@assume_effects.
    • Klici invoke(f, invokesig, args...) z manj specifičnimi tipi, kot se običajno uporabljajo za f(args...), ne povzročajo več ponovnega prevajanja paketa.
  • Spremembe možnosti ukazne vrstice
    • V sistemih Linux in Windows poskuša možnost »--threads=auto« zdaj določiti razpoložljivo število procesorjev na podlagi afinitete procesorja, maske, ki je običajno nastavljena v okoljih HPC in oblaku.
    • Parameter “--math-mode=fast” je onemogočen, namesto katerega je priporočljiva uporaba makra “@fastmath”, ki ima jasno definirano semantiko.
    • Možnost "--threads" je zdaj v obliki "samodejno | N[,auto|M]", kjer M označuje število interaktivnih niti, ki jih je treba ustvariti (trenutno samodejno pomeni 1).
    • Dodana možnost “—heap-size-hint=” «, ki nastavi prag, po katerem se začne aktivno zbiranje smeti. Velikost lahko določite v bajtih, kilobajtih (1000 KB), megabajtih (300 MB) ali gigabajtih (1,5 GB).
  • Spremembe v večnitnosti
    • »Threads.@spawn« ima zdaj izbirni prvi argument z vrednostjo »:default« ali »:interactive«. Interaktivna naloga zahteva nizko zakasnitev odziva in je zasnovana tako, da je kratka ali se izvaja pogosto. Interaktivna opravila se bodo izvajala v interaktivnih nitih, če so podana ob zagonu Julije.
    • Niti, ki se izvajajo zunaj izvajalnega okolja Julia (na primer iz C ali Jave), lahko zdaj kličejo kodo Julia z uporabo "jl_adopt_thread". To se zgodi samodejno, ko vnesete kodo Julia prek "cfunction" ali vstopne točke "@ccallable". Posledično se lahko število niti med izvajanjem zdaj spremeni.
  • Nove knjižnične funkcije
    • Nova funkcija "Iterators.flatmap".
    • Nova funkcija "pkgversion(m::Module)" za pridobitev različice paketa, ki je naložil dani modul, podobno kot "pkgdir(m::Module)".
    • Nova funkcija »stack(x)«, ki posploši »reduce(hcat, x::Vector{<:Vector})« na katero koli dimenzijo in omogoča kateri koli iterator iteratorjev. Metoda "stack(f, x)" posplošuje "mapreduce(f, hcat, x)" in je učinkovitejša.
    • Nov makro za analizo dodeljenega pomnilnika »@allocations«, podoben »@allocated«, le da vrne število dodelitev pomnilnika in ne skupne velikosti dodeljenega pomnilnika.
  • Nove funkcije knjižnice
    • "RoundFromZero" zdaj deluje za vrste, ki niso "BigFloat".
    • "Dict" je zdaj mogoče ročno zmanjšati z uporabo "sizehint!"
    • "@time" zdaj ločeno določa odstotek časa, porabljenega za ponovno prevajanje neveljavnih metod.
  • Spremembe standardne knjižnice
    • Odpravljena je težava s sočasnostjo v metodah ponavljanja za Dict in druge izpeljane objekte, kot so ključi(::Dict), vrednosti(::Dict) in Set. Te iteracijske metode je zdaj mogoče klicati na Dict ali Set vzporedno za neomejeno število niti, če ni dejanj, ki spreminjajo slovar ali niz.
    • Negiranje predikatne funkcije "!f" zdaj vrne sestavljeno funkcijo "(!) ∘ f" namesto anonimne funkcije.
    • Funkcije rezin dimenzij zdaj delujejo v več dimenzijah: »eachslice«, »eachrow« in »eachcol« vrnejo objekt »Slices«, ki omogoča dispečiranje za zagotavljanje učinkovitejših metod.
    • V javni API je bil dodan makro »@kwdef«.
    • Odpravljena težava z vrstnim redom operacij v »fld1«.
    • Razvrščanje je zdaj vedno časovno stabilno (QuickSort je bil preoblikovan).
    • "Base.splat" je zdaj izvožen. Vrnjena vrednost je tipa "Base.Splat" in ne anonimne funkcije, kar omogoča, da se lepo izpiše.
  • Upravitelj paketov
    • »Razširitve paketov«: Podpora za nalaganje izrezka kode iz drugih paketov, naloženih v seji Julia. Aplikacija je podobna paketu "Requires.jl", vendar sta podprti predkompilacija in združljivost nastavitev.
  • Knjižnica LinearAlgebra
    • Zaradi nevarnosti zamenjave pri delitvi po elementih smo odstranili metodi "a/b" in "b\a" s skalarjem "a" in vektorjem "b", ki sta bili enakovredni "a * pinv(b)".
    • Klicanje BLAS in LAPACK zdaj uporablja "libblastrampoline (LBT)". OpenBLAS je privzeto na voljo, vendar izdelava sistemske slike z drugimi knjižnicami BLAS/LAPACK ni podprta. Namesto tega je priporočljivo uporabiti mehanizem LBT za zamenjavo BLAS/LAPACK z drugim obstoječim nizom knjižnic.
    • "lu" podpira novo strategijo rotacije matrike, "RowNonZero()", ki izbere prvi neničelni rotacijski element za uporabo z novimi aritmetičnimi tipi in za namene usposabljanja.
    • "normalize(x, p=2)" zdaj podpira vsak normaliziran vektorski prostor "x", vključno s skalarji.
    • Privzeto število niti BLAS je zdaj enako številu niti CPE na arhitekturah ARM in polovici števila niti CPE na drugih arhitekturah.
  • Printf: Preoblikovana sporočila o napakah za nepravilno oblikovane nize za boljšo berljivost.
  • Profil: nova funkcija »Profile.take_heap_snapshot(file)«, ki zapiše datoteko v formatu ».heapsnapshot«, ki temelji na JSON in je podprt v Chromu.
  • Naključno: randn in randexp zdaj delujeta za kateri koli tip AbstractFloat, ki definira rand.
  • ODGOVOR
    • S pritiskom na kombinacijo tipk "Alt-e" zdaj odprete trenutni vnos v urejevalniku. Vsebina (če je spremenjena) bo izvedena, ko zapustite urejevalnik.
    • Trenutni kontekst modula, ki je aktiven v REPL, lahko spremenite (privzeto Main) s funkcijo "REPL.activate(::Module)" ali tako, da vnesete modul v REPL in pritisnete kombinacijo tipk "Alt-m".
    • Način "oštevilčenega poziva", ki natisne številke za vsak vhod in izhod ter shrani dosežene rezultate v Out, je mogoče aktivirati z uporabo "REPL.numbered_prompt!()".
    • Dokončanje zavihka prikaže razpoložljive argumente ključnih besed.
  • SuiteSparse: premaknjena koda za reševalec »SuiteSparse« v »SparseArrays.jl«. Reševalce zdaj znova izvozi »SuiteSparse.jl«.
  • SparseArrays
    • Reševalci »SuiteSparse« so zdaj na voljo kot podmoduli »SparseArrays«.
    • Načina zaščite niti UMFPACK in CHOLMOD sta bila izboljšana z odpravo globalnih spremenljivk in uporabo ključavnic. Večnitni "ldiv!" Objekte UMFPACK je zdaj mogoče varno izvajati.
    • Eksperimentalna funkcija "SparseArrays.allowscalar(::Bool)" vam omogoča, da onemogočite ali omogočite skalarno indeksiranje redkih nizov. Ta funkcija je zasnovana za odkrivanje naključnega skalarnega indeksiranja objektov "SparseMatrixCSC", ki je pogost vir težav z zmogljivostjo.
  • Nov varen način za testne pakete, ki predčasno prekine testni zagon v primeru okvare ali napake. Nastavite prek »@testset kwarg failfast=true« ali »export JULIA_TEST_FAILFAST=true«. To je včasih potrebno pri izvajanju CI, da prejmete sporočila o napakah zgodaj.
  • Datumi: prazni nizi niso več nepravilno razčlenjeni kot veljavne vrednosti »DateTime«, »Dates« ali »Times« in namesto tega vržejo »ArgumentError« v konstruktorjih in razčlenjevanju, medtem ko »tryparse« ne vrne ničesar.
  • Paket razdeljen
    • Konfiguracija paketa (aktivni projekt, "LOAD_PATH", "DEPOT_PATH") se zdaj razširi pri dodajanju lokalnih delovnih procesov (npr. z uporabo "addprocs(N::Int)" ali z uporabo zastavice ukazne vrstice "--procs=N").
    • »addproc« za lokalne delovne procese zdaj sprejema argument z imenom »env« za posredovanje spremenljivk okolja delovnim procesom.
  • Unicode: "graphemes(s, m:n)" vrne podniz od m-tega do n-tega grafema v "s".
  • Paket DelimitedFiles je bil odstranjen iz sistemskih knjižnic in je zdaj razdeljen kot ločen paket, ki mora biti za uporabo izrecno nameščen.
  • Zunanje odvisnosti
    • V Linuxu se različica sistemske knjižnice libstdc++ samodejno zazna in, če je novejša, se naloži. Staro vgrajeno vedenje pri nalaganju libstdc++, ne glede na različico sistema, je mogoče obnoviti z nastavitvijo spremenljivke okolja "JULIA_PROBE_LIBSTDCXX=0".
    • Odstranjen "RPATH" iz binarne datoteke julia, ki lahko prekine knjižnice v Linuxu, ki ne definirajo spremenljivke "RUNPATH".
    • Izboljšave orodja: Izhod »MethodError« in metod (na primer iz »methods(my_func)«) je zdaj oblikovan in obarvan v skladu z načelom izpisa metod v sledenju sklada.

    Vir: opennet.ru

Dodaj komentar