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