Objavljeno je izdanje programskog jezika Julia 1.9, koji kombinira kvalitete kao što su visoke performanse, podrška za dinamičko tipkanje i ugrađeni alati za paralelno programiranje. Sintaksa Julije je bliska MATLAB-u, s nekim elementima posuđenim iz Rubyja i Lispa. Metoda manipulacije stringovima podsjeća na Perl. Kod projekta se distribuira pod licencom MIT-a.
Ključne značajke jezika:
- Visoke performanse: jedan od ključnih ciljeva projekta je postizanje performansi bliskih C programima. Kompajler Julia temelji se na projektu LLVM i generira učinkovit izvorni strojni kod za mnoge ciljne platforme;
- Podrška za različite programske paradigme, uključujući elemente objektno orijentiranog i funkcionalnog programiranja. Standardna biblioteka nudi funkcije za asinkroni I/O, upravljanje procesima, bilježenje, profiliranje i upravljanje paketima, između ostalog;
- Dinamičko tipkanje: jezik ne zahtijeva eksplicitnu definiciju tipova za varijable, analogno skriptnim programskim jezicima. Podržava interaktivni način rada;
- Neobavezna mogućnost eksplicitnog određivanja tipova;
- Sintaksa koja je izvrsna za numeričke izračune, znanstvene izračune, sustave strojnog učenja i vizualizaciju podataka. Podrška za mnoge tipove numeričkih podataka i alate za paraleliziranje izračuna.
- Mogućnost izravnog pozivanja funkcija iz C knjižnica bez dodatnih slojeva.
Glavne promjene u Juliji 1.9:
- Nove jezične značajke
- Omogućuje dodjeljivanje zadataka u drugom modulu koristeći "setproperty!(::Module, ::Symbol, x)".
- Dopušteno je višestruko dodjeljivanje koje nije na konačnoj poziciji. Na primjer, niz "a, b..., c = 1, 2, 3, 4" bit će obrađen kao "a = 1; b…, = 2, 3; c = 4". Time se upravlja preko Base.split_rest.
- Jednoznačni literali sada podržavaju istu sintaksu kao string literali; oni. sintaksa može predstavljati nevažeće UTF-8 sekvence, što dopušta tip Char.
- Dodana podrška za specifikaciju Unicode 15.
- Ugniježđene kombinacije torki i imenovanih torki znakova sada se mogu koristiti kao parametri tipa.
- Nove ugrađene funkcije "getglobal(::Module, ::Symbol[, order])" i "setglobal!(::Module, ::Symbol, x[, order])" za čitanje i pisanje isključivo u globalne varijable. Metoda getglobal sada bi trebala imati prednost nad metodom getfield za pristup globalnim varijablama.
- Jezične promjene
- Makronaredba "@invoke" predstavljena u verziji 1.7 sada je izvezena i dostupna za upotrebu. Također, sada koristi metodu "Core.Typeof(x)" umjesto "Any" kada je oznaka tipa izostavljena za argument "x". Ovo je neophodno kako bi se tipovi proslijeđeni kao argumenti pravilno obrađivali.
- Omogućen izvoz funkcije "invokelatest" i makronaredbe "@invokelatest" predstavljene u verziji 1.7.
- Poboljšanja kompilatora/vremena izvođenja
- Značajno smanjeno vrijeme do prvog izvršenja (TTFX - Vrijeme do prvog izvršenja). Predkompilacija paketa sada sprema izvorni kod u "pkgimage", što znači da se kod generiran tijekom predkompilacije neće morati ponovno kompajlirati nakon učitavanja paketa. Korištenje načina rada pkgimages može se onemogućiti opcijom "--pkgimages=no".
- Poznati problem kvadratne složenosti zaključivanja tipa je riješen i općenito zaključivanje koristi manje memorije. Neki rubni slučajevi s automatski generiranim dugim funkcijama (kao što je ModelingToolkit.jl s parcijalnim diferencijalnim jednadžbama i velikim uzročnim modelima) kompajliraju mnogo brže.
- Pozivi s argumentima koji nisu specifični za tip sada mogu biti optimizirani za umetanje ili statičku razlučivost pomoću Union-splittinga, čak i ako postoji više različitih vrsta kandidata za otpremu. To može poboljšati izvedbu u određenim situacijama u kojima tipovi objekata nisu u potpunosti statički razriješeni, statičkim rješavanjem "@nospecialize-d" mjesta poziva i izbjegavanjem ponovne kompilacije.
- Sve upotrebe makronaredbe @pure u modulu Base zamijenjene su s Base.@assume_effects.
- Pozivi za invoke(f, invokesig, args...) s tipovima manje specifičnim od onih koji se inače koriste za f(args...) više ne uzrokuju ponovno kompajliranje paketa.
- Promjene parametara naredbenog retka
- U sustavu Linux i Windows, opcija "--threads=auto" sada pokušava odrediti dostupni broj procesora na temelju afiniteta CPU-a, što je maska koja se obično postavlja u HPC i okruženjima oblaka.
- Isključena je opcija "--math-mode=fast" umjesto koje se preporučuje korištenje makronaredbe "@fastmath" koja ima dobro definiranu semantiku.
- Parametar "--threads" sada ima format "auto | N[,auto|M]", gdje M navodi broj interaktivnih niti za stvaranje (trenutno auto znači 1).
- Dodana opcija "--heap-size-hint= ”, koji postavlja prag nakon kojeg počinje aktivno prikupljanje smeća. Veličina se može navesti u bajtovima, kilobajtima (1000 KB), megabajtima (300 MB) ili gigabajtima (1,5 GB).
- Promjene višenitnosti
- "Threads.@spawn" sada ima izborni prvi argument s vrijednošću ":default" ili ":interactive". Interaktivni zadatak zahtijeva nisku latenciju odgovora i osmišljen je da bude kratak ili da se često izvodi. Interaktivni zadaci izvodit će se na interaktivnim nitima ako su navedeni prilikom pokretanja Julije.
- Niti pokrenute izvan Julia runtime-a (na primjer, iz C-a ili Jave) sada mogu pozvati Julia kod pomoću "jl_adopt_thread". To se događa automatski kada unesete Julia kod putem "cfunction" ili "@ccallable" ulazne točke. Kao posljedica toga, broj niti se sada može promijeniti tijekom izvođenja.
- Nove funkcije knjižnice
- Nova funkcija "Iterators.flatmap".
- Nova funkcija "pkgversion(m::Module)" za dobivanje verzije paketa koji je učitao određeni modul, slično "pkgdir(m::Module)".
- Nova funkcija "stack(x)" koja generalizira "reduce(hcat, x::Vector{<:Vector})" na bilo koju dimenziju i dopušta bilo koji iterator iteratora. Metoda "stack(f, x)" generalizira "mapreduce(f, hcat, x)" i učinkovitija je.
- Nova makronaredba za analizu dodijeljene memorije "@allocations", slična "@allocated", osim što vraća broj dodijeljenih memorija, a ne ukupnu veličinu dodijeljene memorije.
- Nove značajke knjižnice
- "RoundFromZero" sada radi za vrste koje nisu "BigFloat".
- "Dict" se sada može ručno smanjiti pomoću "sizehint!".
- "@time" sada zasebno označava postotak vremena utrošenog na ponovno kompajliranje nevažećih metoda.
- Promjene u standardnoj knjižnici
- Riješen je problem istodobnosti u metodama iteracije za Dict i druge izvedene objekte kao što su ključevi(::Dict), vrijednosti(::Dict) i Set. Ove metode iteracije sada se mogu pozvati na Dict ili Set paralelno na neograničenom broju niti, sve dok nema radnji koje mijenjaju rječnik ili skup.
- Negiranje predikatne funkcije "!f" sada vraća složenu funkciju "(!) ∘ f" umjesto anonimne funkcije.
- Funkcije odsječka dimenzije sada rade u više dimenzija: "eachslice", "eachrow" i "eachcol" vraćaju objekt "Slices" koji omogućuje otpremanje radi pružanja učinkovitijih metoda.
- Dodana makronaredba "@kwdef" u javni API.
- Riješen je problem s redoslijedom operacija u "fld1".
- Sortiranje je sada uvijek vremenski stabilno (redizajnirani QuickSort).
- "Base.splat" je sada izvezen. Povratna vrijednost je tipa "Base.Splat", a ne anonimna funkcija, što omogućuje da se lijepo izvede.
- Upravitelj paketa
- "Proširenja paketa": podrška za učitavanje isječka koda iz drugih paketa učitanih u sesiji Julia. Aplikacija je slična paketu "Requires.jl", ali su podržane kompatibilnost prije kompilacije i konfiguracije.
- Biblioteka LinearAlgebra
- Zbog opasnosti od zabune kod dijeljenja po elementima, uklonjene su metode "a / b" i "b \ a" sa skalarom "a" i vektorom "b", koji su bili ekvivalentni "a * pinv(b)".
- BLAS i LAPACK pozivi sada koriste "libblastrampoline (LBT)". OpenBLAS je isporučen prema zadanim postavkama, ali izgradnja slike sustava s drugim BLAS/LAPACK bibliotekama nije podržana. Umjesto toga, preporučuje se korištenje LBT mehanizma za zamjenu BLAS/LAPACK drugim dostupnim skupom biblioteka.
- "lu" podržava novu strategiju rotacije matrice "RowNonZero()", koja odabire prvi element rotacije koji nije nula za korištenje s novim aritmetičkim tipovima iu obrazovne svrhe.
- "normalize(x, p=2)" sada podržava bilo koji normalizirani vektorski prostor "x", uključujući skalare.
- Zadani broj BLAS niti sada je jednak broju CPU niti na ARM arhitekturi i polovici broja CPU niti na drugim arhitekturama.
- Printf: Prerađene poruke o pogrešci za neispravne nizove radi bolje čitljivosti.
- Profil: nova funkcija "Profile.take_heap_snapshot(file)" koja snima datoteku u formatu ".heapsnapshot" temeljenom na JSON-u koji podržava Chrome.
- Random: randn i randexp sada rade za bilo koji tip AbstractFloat koji definira rand.
- ZAMJENA
- Pritiskom na kombinaciju tipki "Alt-e" sada se otvara trenutni unos u uređivaču. Sadržaj (ako je promijenjen) bit će izvršen kada uređivač izađe.
- Trenutačni kontekst modula koji je aktivan u REPL-u može se promijeniti (prema zadanim postavkama je Main) pomoću funkcije "REPL.activate(::Module)" ili unosom modula u REPL i pritiskom na tipku "Alt-m" kombinacija.
- Način rada "numbered prompt", koji ispisuje brojeve za svaki ulaz i izlaz i pohranjuje procijenjene rezultate u Out, može se aktivirati s "REPL.numbered_prompt!()".
- Dovršavanje kartice prikazuje dostupne argumente ključne riječi.
- SuiteSparse: premješten kod za rješavanje "SuiteSparse" u "SparseArrays.jl". Rješivače sada ponovno izvozi "SuiteSparse.jl".
- Rijetki nizovi
- Rješivači SuiteSparse sada su dostupni kao podmoduli SparseArrays.
- Načini zaštite toka UMFPACK i CHOLMOD poboljšani su uklanjanjem globalnih varijabli i korištenjem zaključavanja. Višenitni "ldiv!" UMFPACK objekti sada se mogu sigurno izvršiti.
- Eksperimentalna funkcija "SparseArrays.allowscalar(::Bool)" omogućuje vam da onemogućite ili omogućite skalarno indeksiranje rijetkih nizova. Ova je funkcija dizajnirana za otkrivanje nasumičnog skalarnog indeksiranja objekata "SparseMatrixCSC", što je uobičajeni izvor problema s izvedbom.
- Novi failover mod za pakete testova koji prekida test rano u slučaju kvara ili pogreške. Postavite putem "@testset kwarg failfast=true" ili "export JULIA_TEST_FAILFAST=true". Ovo može biti potrebno u CI pokretanjima za primanje ranih poruka o pogrešci.
- Datumi: Prazni se nizovi više ne analiziraju pogrešno kao valjane vrijednosti "DateTime", "Dates" ili "Times" i umjesto toga stvaraju pogrešku "ArgumentError" u konstruktorima i raščlanjivanju, dok "tryparse" ne vraća ništa.
- Distribuirani paket
- Konfiguracija paketa (aktivni projekt, "LOAD_PATH", "DEPOT_PATH") sada se propagira kada se dodaju lokalni radni procesi (npr. s "addprocs(N::Int)" ili s oznakom naredbenog retka "-procs=N").
- "addprocs" za lokalne radne procese sada uzima argument pod nazivom "env" za prosljeđivanje varijabli okruženja radnim procesima.
- Unicode: "graphemes(s, m:n)" vraća podniz od m-tog do n-tog grafema u "s".
- Paket DelimitedFiles uklonjen je iz knjižnica sustava i sada se distribuira kao zaseban paket koji mora biti izričito instaliran kako bi se mogao koristiti.
- Vanjske ovisnosti
- Linux automatski otkriva verziju sistemske biblioteke libstdc++ i učitava je ako je novija. Staro ponašanje učitavanja ugrađenog libstdc++ bez obzira na verziju sustava može se vratiti postavljanjem varijable okruženja "JULIA_PROBE_LIBSTDCXX=0".
- Uklonjen je "RPATH" iz binarne datoteke julia, što može pokvariti biblioteke na Linuxu koje ne uspiju definirati varijablu "RUNPATH".
- Poboljšanja alata: izlaz "MethodError" i metoda (na primjer, iz "methods(my_func)") sada je formatiran i obojen u skladu s načinom na koji se metode izlaze u tragovima stoga.
Izvor: opennet.ru