është publikuar versioni i gjuhës së programimit Julia 1.9, i cili kombinon cilësi të tilla si performancë e lartë, mbështetje për tipizimin dinamik dhe mjete të tjera të ndërtuara për programim paralel. Sintaksa e Julia është e ngjashme me MATLAB, duke huazuar disa elemente nga Ruby dhe Lisp. Metoda e manipulimit të vargjeve i ngjan Perl.
Veçoritë kyçe të gjuhës:
- Performancë e lartë: Një nga qëllimet kryesore të projektit është arritja e performancës afër programeve në gjuhën C. Kompilatori i Julia-s bazohet në punët e projektit LLVM dhe gjeneron kod të efektshëm të makinës natyrore për shumë platforma të synuara;
- Mbështetje për paradigmat të ndryshme të programimit, duke përfshirë elemente të programimit objekt-orientuar dhe funksional. Biblioteka standarde ofron gjithashtu funksione për hyrje/dalje asinkrone, menaxhimin e proceseve, regjistrimin, profilimin dhe menaxhimin e pakot;
- Tipizimi dinamik: gjuha nuk kërkon përcaktimin e qartë të tipave për variablat, ngjashëm me gjuhët e programimit të skriptimit. Mbështetet një mod i ndërveprueshëm;
- Mundësi opsionale për të specifikuar qartë tipet;
- Sintaksa, e cila përshtatet shkëlqyeshëm për llogaritjet numerike, llogaritjet shkencore, sistemet e mësimit të makinerive dhe vizualizimin e të dhënave. Mbështetje për shumë lloje të të dhënave numerike dhe mjete për paralelizimin e llogaritjeve.
- Mundësia për të thirrur drejtpërdrejt funksionet nga bibliotekat në gjuhën C pa shtresa të tjera.
Ndryshimet kryesore në Julia 1.9:
- Mundësi të reja të gjuhës
- Lejohet ekzekutimi i caktimeve në një modul tjetër me "setproperty!(::Module, ::Symbol, x)".
- Lejohet caktimi tĂ« shumĂ«fishtĂ« jo nĂ« pozitat pĂ«rfundimtare. PĂ«r shembull, rreshti "a, bâŠ, c = 1, 2, 3, 4" do tĂ« pĂ«rpunojĂ« si "a = 1; bâŠ, = 2, 3; c = 4". Kjo pĂ«rpunim bĂ«het pĂ«rmes Base.split_rest.
- Literalet e simboleve të veçanta tani mbështesin të njëjtën sintaksë si literalet e vargjeve; dmth. sintaksa mund të përfaqësojë sekuenca të pavlefshme UTF-8, siç lejohet nga tipi Char.
- Shtuar mbështetje për specifikimin e Unicode 15.
- Kombinimet e brendshme të tuples dhe tuples me emra tani mund të përdoren si parametra të tipit.
- Funksionet e reja të ndërtuara "getglobal(::Module, ::Symbol[, order])" dhe "setglobal!(::Module, ::Symbol, x[, order])" për të lexuar dhe shkruar ekskluzivisht në variablat globale. Metoda getglobal tani duhet të preferohet për aksesin në variablat globale në krahasim me metodën getfield.
- Ndryshime në gjuhë
- Makrosi "@invoke", i prezantuar në versionin 1.7, tani eksportojnë dhe janë të disponueshëm për t'u përdorur. Për më tepër, tani përdor metodën "Core.Typeof(x)", jo "Any" në rast se annotimi i tipit është lënë jashtë për argumentin "x". Kjo është e nevojshme që tipet e kaluara si argumente të përpunohen saktë.
- Shtuar eksportimi i funksionit "invokelatest" dhe makros "@invokelatest", të cilat shfaqen në versionin 1.7.
- Përmirësime të kompiluesit/ambientit të ekzekutimit.
- KohĂ«zgjatja deri nĂ« ekzekutimin e parĂ« (TTFX - Koha deri nĂ« ekzekutimin e parĂ«) Ă«shtĂ« shkurtuar ndjeshĂ«m. Para-grumbullimi i paketĂ«s tani ruan kodin makinerik nĂ« "pkgimage", qĂ« do tĂ« thotĂ« se kodi i gjeneruar gjatĂ« para-grumbullimit nuk do tĂ« kĂ«rkojĂ« ripĂ«rpunim pas ngarkimit tĂ« paketĂ«s. PĂ«rdorimi i modalitetit pkgimages mund tĂ« çaktivizohet me opsionin "âpkgimages=no".
- Rregulluar problemi i njohur i kompleksitetit katror të inferencës së tipeve, dhe për përgjithësi, inferenca përdor më pak memorie. Disa raste të kufijve me funksione të gjata të gjeneruara automatikisht (p.sh., ModelingToolkit.jl me ekuacione të pjesshëm dhe modele të mëdha shkakësore) përpunohen shumë më shpejt.
- Thirrjet me argumente pa tipe specifike tani mund të optimizohen me metodën Union-splitting për injektim ose zgjidhje statike, edhe nëse ekzistojnë disa kandidatë të ndryshëm për dispatcher. Kjo mund të përmirësojë performancën në disa situata, kur tipet e objekteve nuk zgjidhen plotësisht statikisht, duke shfrytëzuar zgjidhjen statike të vendeve të thirrjes "@nospecialize-d" dhe duke shmangur ripërpunimin.
- Të gjitha variantet e përdorimit të makros @pure në modulit Base janë zëvendësuar me Base.@assume_effects.
- Thirrjet invoke(f, invokesig, argsâŠ) me tipe mĂ« pak specifike sesa zakonisht pĂ«rdoren pĂ«r f(argsâŠ) tani nuk shkaktojnĂ« ripĂ«rpunimin e paketĂ«s.
- Ndryshimet në parametrat e komandës
- NĂ« Linux dhe Windows, parametri "âthreads=auto" tani pĂ«rpiqet tĂ« pĂ«rcaktojĂ« numrin e disponueshĂ«m tĂ« procesorĂ«ve nĂ« bazĂ« tĂ« CPU affinity, maska e sĂ« cilĂ«s zakonisht vendoset nĂ« mjedise tĂ« larta tĂ« performancĂ«s dhe nĂ« mjediset cloud.
- Ăaktivizuar parametri "âmath-mode=fast", ndĂ«rsa rekomandohet tĂ« pĂ«rdoret makroja "@fastmath", e cila ka semantikĂ« tĂ« qartĂ« tĂ« pĂ«rcaktuar.
- Parametri "âthreads" tani ka formatin "auto | N[,auto|M]", ku M tregon numrin e proceseve interaktive qĂ« krijohen (aktualisht auto do tĂ« thotĂ« 1).
- Shtuar opsioni "âheap-size-hint=", i cili vendos pragun, pas sĂ« cilit fillon mbledhja aktive e mbeturinave. MadhĂ«sia mund tĂ« specifikohet nĂ« bytes, kilobytes (1000 KB), megabytes (300 MB) ose gigabytes (1.5 GB).
- Ndryshime në shumëfishtësi
- "Threads.@spawn" tani ka një argument të parë opsional me vlerën "default" ose "interactive". Detyra interaktive kërkon një vonesë të vogël përgjigjie dhe është menduar të jetë e shkurtër ose të kryhet shpesh. Detyrat interaktive do të ekzekutohen në procese interaktive, nëse ato janë specificuar gjatë nisjes së Julia.
- Proceset e nisura jashtë mjedisit të ekzekutimit të Julia (p.sh., nga C ose Java) tani mund të thërrasin kodin Julia, duke përdorur "jl_adopt_thread". Kjo ndodh automatikisht kur futihet kodi Julia përmes "cfunction" ose pikës hyrëse "@ccallable". Si rezultat, numri i proceseve tani mund të ndryshojë gjatë ekzekutimit.
- Funksionet e reja të bibliotekës
- Funksioni i ri "Iterators.flatmap".
- Funksioni i ri «pkgversion(m::Module)» për të marrë versionin e paketës që ka ngarkuar moduli përkatës, në mënyrë të ngjashme me «pkgdir(m::Module)».
- Funksioni i ri «stack(x)», i cili përmbledh «reduce(hcat, x::Vector{<:Vector})» në çfarëdo dimensionaliteti dhe lejon çdo iterator të iteratorëve. Metoda «stack(f, x)» përmbledh «mapreduce(f, hcat, x)» dhe është më efikase.
- Një makros për analizimin e memories së alokuar «@allocations», në mënyrë të ngjashme me «@allocated», përveç se kthen numrin e operacioneve të alokimit të memories, në vend të madhësisë totale të memories së alokuar.
- Mundësi të reja në bibliotekë
- «RoundFromZero» tani funksionon për tipe të tjera përveç «BigFloat».
- «Dict» tani mund të reduktohet manualisht me «sizehint!».
- «@time» tani tregon veçmas përqindjen e kohës që është shpenzuar për ripërpilimin e metodave të pavlefshme.
- Ndryshime në bibliotekën standarde
- U zgjidh problemi i aksesit paralel në metodat e iterimit për Dict dhe objekte të tjera të degraduara, si keys(::Dict), values(::Dict) dhe Set. Këto metoda interaktive tani mund të thirren për Dict ose Set në mënyrë paralel për një numër të pakufizuar threads në kushtin që nuk ka aktivitete që ndryshojnë fjalorin ose grupin.
- Mohimi i funksionit predikativ «!f» tani kthen njĂ« funksion tĂ« pĂ«rbĂ«rĂ« «(!) â f» nĂ« vend tĂ« njĂ« funksioni anonim.
- Funksionet e prekjeve të dimensioneve tani punojnë në shumë dimensione: «eachslice», «eachrow» dhe «eachcol» kthejnë objektin «Slices», i cili lejon dispatch për të ofruar metoda më efikase.
- Makros «@kwdef» është shtuar në API-në publike.
- Problemi me rendin e operacioneve në «fld1» është zgjidhur.
- Renditja tani është gjithmonë e qetë me kohë (QuickSort është ripunuar).
- «Base.splat» tani eksportohesh. Vlera e kthyer përfaqëson tipin «Base.Splat», dhe jo një funksion anonim, çka e bën atë të duket bukur në dalje.
- Menaxheri i paketave
- «Package Extensions»: mbështetje për ngarkimin e fraksionit të kodit nga paketa të tjera, të ngarkuara në seancën Julia. Përdorimi është i ngjashëm me paketën «Requires.jl», por mbështetet parakompilimi dhe përputhshmëria e konfigurimeve.
- Biblioteka LinearAlgebra
- Për shkak të rrezikut të konfuzionit me ndarjen për çdo element janë hequr metodat «a / b» dhe «b \ a» me skalar «a» dhe vektor «b», të cilat ishin ekuivalente me «a * pinv(b)».
- Për thirrjen e BLAS dhe LAPACK tani aplikohet «libblastrampoline (LBT)». OpenBLAS ofrohet si një parazgjedhje, por ndërtimi i imazhit të sistemit me biblioteka të tjera BLAS/LAPACK nuk mbështetet. Në vend të kësaj, rekomandohet përdorimi i mekanizmit LBT për të zëvendësuar BLAS/LAPACK me një paketë bibliotekash të tjera.
- «lu» mbështet një strategji të re të rrotullimit të matricës «RowNonZero()», e cila zgjedh elementin e parë jo-zero për përdorim me lloje të reja aritmetike dhe për qëllime edukative.
- «normalize(x, p=2)» tani mbështet çdo hapësirë vektoriale të normalizuar «x», duke përfshirë skalarët.
- Numri i thesareve të BLAS parazgjedhur tani është i barabartë me numrin e thesareve të CPU në arkitekturën ARM dhe gjysmën e numrit të thesareve të CPU në arkitektura të tjera.
- Printf: Për lexueshmëri më të mirë, mesazhet e gabimeve për stringjet me format të gabuar janë ripunuar.
- Profile: Funksioni i ri «Profile.take_heap_snapshot(file)», i cili shkruan një file në formatin «.heapsnapshot» bazuar në JSON, i mbështetur në Chrome.
- Random: randn dhe randexp tani funksionojnë për çdo lloj AbstractFloat, që përcakton rand.
- REPL
- Shtypja e kombinimit të çelësave «Alt-e» tani hap inputin aktual në redaktor. Përmbajtja (nëse është ndryshuar) do të ekzekutohet kur dilet nga redaktori.
- Konteksti aktual i modulit, i aktivizuar në REPL, mund të ndryshohet (parazgjedhja është Main) me funksionin «REPL.activate(::Module)» ose duke futur modul në REPL dhe shtypur kombinimin e çelësave «Alt-m».
- Mënyra e «nënshkrimit të numëruar», e cila tregon numra për çdo hyrje dhe dalje dhe ruan rezultatet e vlerësuar në Out, mund të aktivizohet me «REPL.numbered_prompt!()».
- Autopërfundimi me ndihmën e tab-it tregon argumentet e disponueshme të fjalës kyç.
- SuiteSparse: Kodi për zgjidhësin «SuiteSparse» është kaluar në «SparseArrays.jl». Zgjidhësit tani ripërzgjidhen nga «SuiteSparse.jl».
- SparseArrays
- Zgjidhësit «SuiteSparse» tani janë të disponueshëm si nënmodula të «SparseArrays».
- Mënyrat e mbrojtjes së threads UMFPACK dhe CHOLMOD janë përmirësuar duke eliminuar variablat globalë dhe duke përdorur bllokime. «ldiv!» i objekteve UMFPACK tani mund të ekzekutohet në mënyrë të sigurt.
- Funksioni eksperimental «SparseArrays.allowscalar(::Bool)» lejon çaktivizimin ose aktivizimin e indekset skalarë të matricave të holluara. Ky funksion është i destinuar për zbulimin e indekseve skalarë të rastësishme në objektet «SparseMatrixCSC», që është një burim i zakonshëm i problemeve me performancën.
- Një mënyrë e re e qëndrueshmërisë për grupe testesh, e cila përfundon parakohe ekzekutimin e testit në rast dështimi ose gabimi. Vendoset ose përmes "@testset kwarg failfast=true", ose "export JULIA_TEST_FAILFAST=true". Kjo është e nevojshme ndonjëherë në ekzekutimet CI për të marrë mesazhe gabimi më herët.
- Datat: Rreshtat e zbrazët nuk analizohen më gabimisht si vlera të pranueshme "DateTime", "Dates" ose "Times", dhe në vend të kësaj japin një gabim "ArgumentError" në konstruktorë dhe analizën sintaksore, ndërsa "tryparse" nuk kthen asgjë.
- Paketë Distribuar
- Konfigurimi i paketĂ«s (projekti aktiv, "LOAD_PATH", "DEPOT_PATH") tani shpĂ«rndahet kur shtohen proceset lokale tĂ« punĂ«s (p.sh., me "addprocs(N::Int)" ose me flagun e komandĂ«s "âprocs=N").
- "addprocs" për proceset lokale të punës tani pranon një argument me emrin "env" për të transmetuar variablat e mjedisit tek proceset e punës.
- Unicode: "graphemes(s, m:n)" kthen një nënstring nga m-ë grafema deri në n-ë grafema në "s".
- Paketë DelimitedFiles është hequr nga bibliotekat sistemore dhe tani shpërndahet si një paketë e veçantë, e cila duhet të instalohet në mënyrë të qartë për t'u përdorur.
- Varësitë e jashtme
- Në Linux, versioni i bibliotekës sistemore libstdc++ identifikohet automatikisht dhe nëse është më i ri, ngarkohet. Sjellja e vjetër e ngarkimit të libstdc++ të integruar pavarësisht nga versioni i sistemit mund të rikthehet duke vendosur variablën e mjedisit "JULIA_PROBE_LIBSTDCXX=0".
- RPATH është hequr nga skedari binar julia, gjë që mund të shkaktojë probleme në Linux për bibliotekat që nuk u është mundësuar të identifikojnë variablën "RUNPATH".
- Përmirësime të mjeteve: Dalja "MethodError" dhe metodat (p.sh., nga "methods(my_func)") tani janë formatuar dhe të ngjyrosura në përputhje me parimin e daljes së metodave gjatë ndjekjes së stack-ut.
Burimi: opennet.ru
