Objavljeno je izdanje programskog jezika Julia 1.9, koji kombinuje kvalitete kao što su visoke performanse, podrška za dinamičko kucanje i ugrađeni alati za paralelno programiranje. Julijina sintaksa je bliska MATLAB-u, pozajmljujući neke elemente iz Ruby-ja i Lisp-a. Metoda manipulacije stringovima podsjeća na Perl. Šifra projekta se distribuira pod MIT licencom.
Ključne karakteristike jezika:
- Visoke performanse: jedan od ključnih ciljeva projekta je postizanje performansi bliskih C programima. Julia kompajler je zasnovan na radu LLVM projekta i generiše efikasan izvorni mašinski kod za mnoge ciljne platforme;
- Podržava različite paradigme programiranja, uključujući elemente objektno orijentisanog i funkcionalnog programiranja. Standardna biblioteka pruža, između ostalog, funkcije za asinhroni I/O, kontrolu procesa, evidentiranje, profilisanje i upravljanje paketima;
- Dinamičko kucanje: jezik ne zahtijeva eksplicitnu definiciju tipova za varijable, slično programskim jezicima za skriptiranje. Podržan interaktivni način rada;
- Opciona mogućnost eksplicitnog specificiranja tipova;
- Sintaksa idealna za numeričko računanje, naučno računanje, mašinsko učenje i vizualizaciju podataka. Podrška za mnoge tipove numeričkih podataka i alate za paralelizaciju izračunavanja.
- Mogućnost direktnog pozivanja funkcija iz C biblioteka bez dodatnih slojeva.
Glavne promjene u Juliji 1.9:
- Nove jezičke karakteristike
- Dozvolite da se dodijeli u drugom modulu koristeći "setproperty!(::Module, ::Symbol, x)".
- Višestruki zadaci koji nisu na konačnoj poziciji su dozvoljeni. Na primjer, niz “a, b…, c = 1, 2, 3, 4” će biti obrađen kao “a = 1; b…, = 2, 3; c = 4". Ovo se rješava preko Base.split_rest.
- Literali jednog karaktera sada podržavaju istu sintaksu kao i literali stringova; one. Sintaksa može predstavljati nevažeće UTF-8 sekvence, kako to dozvoljava tip Char.
- Dodata podrška za Unicode 15 specifikaciju.
- Ugniježđene kombinacije torki i imenovanih tuple 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. Getglobal metoda bi sada trebala imati prednost u odnosu na getfield metodu za pristup globalnim varijablama.
- Promjene u jeziku
- Makro "@invoke" uveden u verziji 1.7 je sada izvezen i dostupan za upotrebu. Osim toga, sada koristi metodu "Core.Typeof(x)" umjesto "Bilo koji" u slučaju kada je oznaka tipa izostavljena za argument "x". Ovo je neophodno kako bi se osiguralo da se tipovi proslijeđeni kao argumenti ispravno obrađuju.
- Omogućen izvoz funkcije "invokelatest" i makronaredbe "@invokelatest", uvedene u verziji 1.7.
- Poboljšanja kompajlera/runtime
- Značajno smanjeno vrijeme do prvog izvršenja (TTFX - Vrijeme do prvog izvršenja). Prethodno kompajliranje paketa sada pohranjuje izvorni kod u "pkgimage", što znači da kod generiran procesom prekompilacije neće biti potrebno ponovo kompajlirati nakon što se paket učita. Upotreba režima pkgimages može se onemogućiti pomoću opcije "--pkgimages=no".
- Poznati problem kvadratne složenosti zaključivanja tipa je popravljen, a zaključivanje ukupno koristi manje memorije. Neki rubni slučajevi s automatski generiranim dugim funkcijama (kao što je ModelingToolkit.jl s parcijalnim diferencijalnim jednadžbama i velikim kauzalnim modelima) se kompiliraju mnogo brže.
- Pozivi s argumentima bez konkretnih tipova sada mogu biti optimizirani za ubrizgavanje ili statičku rezoluciju, čak i ako postoji više različitih tipova kandidata za otpremu. Ovo može poboljšati performanse u određenim situacijama kada tipovi objekata nisu u potpunosti statički razriješeni, statičkim rješavanjem "@nospecialize-d" lokacija poziva i izbjegavanjem ponovnog kompiliranja.
- Sve upotrebe makroa @pure u osnovnom modulu su zamijenjene sa Base.@assume_effects.
- Pozivi za invoke(f, invokesig, args...) sa manje specifičnim tipovima od onih koji se obično koriste za f(args...) više ne uzrokuju ponovno kompajliranje paketa.
- Promjene u opcijama komandne linije
- Na Linuxu i Windowsu, opcija "--threads=auto" sada pokušava da odredi raspoloživi broj procesora na osnovu afiniteta CPU-a, maske koja se obično postavlja u HPC i cloud okruženjima.
- Parametar “--math-mode=fast” je onemogućen, umjesto kojeg se preporučuje korištenje makronaredbe “@fastmath” koja ima jasno definiranu semantiku.
- Opcija "--threads" je sada u formatu "auto | N[,auto|M]", gdje M označava broj interaktivnih niti za kreiranje (trenutno auto znači 1).
- Dodata opcija “—heap-size-hint=” ", koji postavlja prag nakon kojeg počinje aktivno sakupljanje smeća. Veličina se može odrediti u bajtovima, kilobajtima (1000 KB), megabajtima (300 MB) ili gigabajtima (1,5 GB).
- Promjene u višenitnosti
- "Threads.@spawn" sada ima opcioni prvi argument sa vrijednošću ":default" ili ":interactive". Interaktivni zadatak zahtijeva malo kašnjenje odgovora i dizajniran je tako da bude kratak ili da se izvodi često. Interaktivni zadaci će se izvoditi na interaktivnim nitima ako su navedeni pri pokretanju Julije.
- Niti koje se pokreću izvan Julia runtimea (kao što je iz C ili Java) sada mogu pozvati Julia kod koristeći "jl_adopt_thread". Ovo se dešava automatski kada unesete Julia kod preko "cfunction" ili "@ccallable" ulazne tačke. Kao posljedica toga, broj niti se sada može promijeniti tokom izvršavanja.
- Nove funkcije biblioteke
- Nova funkcija "Iterators.flatmap".
- Nova funkcija "pkgversion(m::Module)" za dobivanje verzije paketa koji je učitao dati modul, slično kao "pkgdir(m::Module)".
- Nova funkcija "stack(x)" koja generalizira "reduce(hcat, x::Vector{<:Vector})" na bilo koju dimenziju i dozvoljava bilo koji iterator iteratora. Metoda "stack(f, x)" generalizira "mapreduce(f, hcat, x)" i efikasnija je.
- Novi makro za analizu dodijeljene memorije "@allocations", sličan "@allocated", osim što vraća broj dodijeljenih memorija, a ne ukupnu veličinu dodijeljene memorije.
- Nove funkcije biblioteke
- "RoundFromZero" sada radi za tipove koji nisu "BigFloat".
- "Dict" se sada može ručno smanjiti pomoću "sizehint!"
- "@time" sada posebno specificira procenat vremena utrošenog na ponovno kompajliranje nevažećih metoda.
- Promjene u standardnoj biblioteci
- Popravljen je problem istovremenosti 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 pozivati na Dict ili Set paralelno za neograničen broj niti, sve dok nema radnji koje modificiraju rječnik ili skup.
- Negiranje predikatske funkcije "!f" sada vraća složenu funkciju "(!) ∘ f" umjesto anonimne funkcije.
- Funkcije odsječaka dimenzija sada rade na više dimenzija: "eachslice", "eachrow" i "eachcol" vraćaju objekt "Slices" koji omogućava dispečiranje radi pružanja efikasnijih metoda.
- Dodan makro "@kwdef" javnom API-ju.
- Rešen je problem sa redosledom operacija u "fld1".
- Sortiranje je sada uvijek vremenski stabilno (QuickSort je redizajniran).
- "Base.splat" je sada izvezen. Povratna vrijednost je tip "Base.Splat", a ne anonimna funkcija, što omogućava da se lijepo prikaže.
- Package Manager
- "Proširenja paketa": Podrška za učitavanje isječka koda iz drugih paketa učitanih u Julia sesiji. Aplikacija je slična paketu "Requires.jl", ali je podržana predkompilacija i kompatibilnost postavki.
- LinearAlgebra Library
- Zbog rizika od zabune sa podjelom po elementima, uklonjene su metode "a/b" i "b\a" sa skalarnim "a" i vektorom "b", koji su bili ekvivalentni "a * pinv(b)".
- Pozivanje BLAS-a i LAPACK-a sada koristi "libblastrampoline (LBT)". OpenBLAS je osiguran po defaultu, ali izgradnja slike sistema sa drugim BLAS/LAPACK bibliotekama nije podržana. Umjesto toga, preporučuje se korištenje LBT mehanizma za zamjenu BLAS/LAPACK sa drugim postojećim skupom biblioteka.
- "lu" podržava novu strategiju rotacije matrice, "RowNonZero()", koja bira prvi element rotacije koji nije nula za upotrebu sa novim aritmetičkim tipovima i za potrebe obuke.
- "normalize(x, p=2)" sada podržava bilo koji normalizirani vektorski prostor "x", uključujući skalare.
- Zadani broj BLAS niti je sada jednak broju CPU niti na ARM arhitekturi i polovini broja CPU niti na drugim arhitekturama.
- Printf: Prerađene poruke o grešci za pogrešno formatirane stringove radi bolje čitljivosti.
- Profil: Nova funkcija "Profile.take_heap_snapshot(file)", koja upisuje datoteku u JSON baziranom ".heapsnapshot" formatu koji je podržan u Chromeu.
- 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 editoru. Sadržaj (ako je izmijenjen) će se izvršiti kada izađete iz editora.
- Trenutni kontekst modula aktivan u REPL-u može se promijeniti (po defaultu glavni) pomoću funkcije "REPL.activate(::Module)" ili unosom modula u REPL i pritiskom na kombinaciju tipki "Alt-m".
- Režim "numerirane prompt", koji ispisuje brojeve za svaki ulaz i izlaz i pohranjuje postignute rezultate u Out, može se aktivirati korištenjem "REPL.numbered_prompt!()".
- Dovršavanje kartice prikazuje dostupne argumente ključne riječi.
- SuiteSparse: Premješten kod za "SuiteSparse" rješavač u "SparseArrays.jl". Rešači sada ponovo izvozi "SuiteSparse.jl".
- SparseArrays
- "SuiteSparse" rješavači su sada dostupni kao "SparseArrays" podmoduli.
- UMFPACK i CHOLMOD načini zaštite niti su poboljšani eliminacijom globalnih varijabli i korištenjem zaključavanja. Višestruki "ldiv!" UMFPACK objekti se sada mogu bezbedno izvršavati.
- Eksperimentalna funkcija "SparseArrays.allowscalar(::Bool)" omogućava vam da onemogućite ili omogućite skalarno indeksiranje rijetkih nizova. Ova funkcija je dizajnirana da otkrije nasumično skalarno indeksiranje "SparseMatrixCSC" objekata, što je uobičajen izvor problema s performansama.
- Novi način rada bez greške za testne pakete koji rano prekida probno izvođenje u slučaju kvara ili greške. Postavite ili putem “@testset kwarg failfast=true” ili “export JULIA_TEST_FAILFAST=true”. Ovo je ponekad potrebno u CI izvo enjima za rano primanje poruka o greškama.
- Datumi: Prazni nizovi se više ne raščlanjuju ispravno kao važeće vrijednosti "DateTime", "Dates" ili "Times" i umjesto toga bacaju "ArgumentError" u konstruktore i raščlanjuju, dok "tryparse" ne vraća ništa.
- Package Distributed
- Konfiguracija paketa (aktivni projekt, "LOAD_PATH", "DEPOT_PATH") se sada širi prilikom dodavanja lokalnih radnih procesa (npr. korištenjem "addprocs(N::Int)" ili korištenjem oznake komandne linije "--procs=N").
- "addprocs" za lokalne radne procese sada prihvata 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-og grafema u "s".
- Paket DelimitedFiles je uklonjen iz sistemskih biblioteka i sada se distribuira kao poseban paket koji mora biti eksplicitno instaliran da bi se koristio.
- Eksterne zavisnosti
- U Linuxu se verzija sistemske biblioteke libstdc++ automatski otkriva i, ako je novija, učitava se. Staro ponašanje učitavanja ugrađenog u libstdc++, bez obzira na verziju sistema, može se vratiti postavljanjem varijable okruženja "JULIA_PROBE_LIBSTDCXX=0".
- Uklonjeno je "RPATH" iz julia binarne datoteke, koja može pokvariti biblioteke na Linuxu koje ne mogu definirati varijablu "RUNPATH".
- Poboljšanja alata: Izlaz "MethodError" i metoda (na primjer iz "methods(my_func)") je sada formatiran i obojen u skladu s principom izlaza metoda u tragu steka.
izvor: opennet.ru