Dostupan programski jezik Julia 1.9

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

Dodajte komentar