E disponueshme gjuha e programimit Julia 1.9

Publikimi i gjuhës së programimit Julia 1.9 është publikuar, duke kombinuar cilësi të tilla si performanca e lartë, mbështetje për shtypjen dinamike dhe mjete të integruara për programim paralel. Sintaksa e Julia është afër MATLAB, duke huazuar disa elemente nga Ruby dhe Lisp. Metoda e manipulimit të vargut të kujton Perl. Kodi i projektit shpërndahet nën licencën MIT.

Karakteristikat kryesore të gjuhës:

  • Performanca e lartë: një nga qëllimet kryesore të projektit është arritja e performancës afër programeve C. Përpiluesi Julia bazohet në punën e projektit LLVM dhe gjeneron kod efikas të makinës vendase për shumë platforma të synuara;
  • Mbështet paradigma të ndryshme programimi, duke përfshirë elementë të programimit të orientuar drejt objektit dhe funksional. Biblioteka standarde ofron, ndër të tjera, funksione për hyrje/dalje asinkrone, kontrollin e procesit, regjistrimin, profilizimin dhe menaxhimin e paketave;
  • Shtypja dinamike: gjuha nuk kërkon përcaktim të qartë të llojeve për variabla, të ngjashëm me gjuhët e programimit të skriptimit. Mbështetja e modalitetit interaktiv;
  • Aftësia opsionale për të specifikuar në mënyrë eksplicite llojet;
  • Një sintaksë ideale për llogaritjen numerike, llogaritjen shkencore, mësimin e 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.
  • Aftësia për të thirrur drejtpërdrejt funksionet nga bibliotekat C pa shtresa shtesë.

Ndryshime të mëdha në Julia 1.9:

  • Karakteristikat e reja të gjuhës
    • Lejo që detyrat të bëhen në një modul tjetër duke përdorur "setproperty!(::Module, ::Symbol, x)".
    • Lejohen detyra të shumta që nuk janë në pozicionin përfundimtar. Për shembull, vargu “a, b…, c = 1, 2, 3, 4” do të përpunohet si “a = 1; b…, = 2, 3; c = 4". Kjo trajtohet nëpërmjet Base.split_rest.
    • Literalet me një karakter tani mbështesin të njëjtën sintaksë si literalet e vargjeve; ato. Sintaksa mund të përfaqësojë sekuenca të pavlefshme UTF-8, siç lejohet nga lloji Char.
    • Mbështetje e shtuar për specifikimet Unicode 15.
    • Kombinimet e mbivendosura të tupave dhe tupleve të karaktereve të emërtuara tani mund të përdoren si parametra tipi.
    • Funksionet e reja të integruara "getglobal(::Module, ::Symbol[, order])" dhe "setglobal!(::Module, ::Symbol, x[, order])" për lexim dhe shkrim ekskluzivisht për variablat globale. Metoda getglobal tani duhet të preferohet mbi metodën getfield për të hyrë në variablat globale.
  • Ndryshimet në gjuhë
    • Makroja "@invoke" e prezantuar në versionin 1.7 tani është eksportuar dhe e disponueshme për përdorim. Për më tepër, ai tani përdor metodën "Core.Typeof(x)" në vend të "Any" në rastin kur shënimi i llojit hiqet për argumentin "x". Kjo është e nevojshme për të siguruar që llojet e miratuara si argumente të përpunohen në mënyrë korrekte.
    • Eksportimi i aktivizuar i funksionit "invokelatest" dhe makro "@invokelatest", i prezantuar në versionin 1.7.
  • Përmirësimet e përpiluesit/kohës së ekzekutimit
    • Koha e reduktuar ndjeshëm deri në ekzekutimin e parë (TTFX - Koha deri në ekzekutimin e parë). Parapërpilimi i një pakete tani ruan kodin vendas në "pkgimage", që do të thotë se kodi i gjeneruar nga procesi i parapërpilimit nuk do të duhet të ripërpilohet pasi të jetë ngarkuar paketa. Përdorimi i modalitetit pkgimages mund të çaktivizohet duke përdorur opsionin "--pkgimages=jo".
    • Çështja e njohur e kompleksitetit kuadratik të konkluzionit të tipit është rregulluar dhe përfundimi përdor më pak memorie në përgjithësi. Disa raste të skajeve me funksione të gjata të gjeneruara automatikisht (siç është ModelingToolkit.jl me ekuacione diferenciale të pjesshme dhe modele të mëdha kauzale) përpilohen shumë më shpejt.
    • Thirrjet me argumente pa lloje konkrete tani mund të optimizohen për ndarjen e Unionit për injeksion ose rezolucion statik, edhe nëse ka shumë kandidatë të llojeve të ndryshme për dërgim. Kjo mund të përmirësojë performancën në situata të caktuara ku llojet e objekteve nuk zgjidhen plotësisht në mënyrë statike, duke zgjidhur në mënyrë statike sajtet e thirrjeve "@nospecialize-d" dhe duke shmangur ripërpilimin.
    • Të gjitha përdorimet e makros @pure në modulin Base janë zëvendësuar me Base.@assume_effects.
    • Thirrjet për të thirrur (f, invokesig, args...) me lloje më pak specifike sesa përdoren zakonisht për f(args...) nuk shkaktojnë më ripërpilimin e paketës.
  • Ndryshimet në opsionet e linjës së komandës
    • Në Linux dhe Windows, opsioni "--threads=auto" tani përpiqet të përcaktojë numrin e disponueshëm të procesorëve bazuar në afinitetin e CPU-së, një maskë e vendosur zakonisht në mjediset HPC dhe cloud.
    • Parametri “--math-mode=fast” është i çaktivizuar, në vend të të cilit rekomandohet të përdoret makroja “@fastmath”, e cila ka semantikë të përcaktuar qartë.
    • Opsioni "--threads" është tani në formatin "auto | N[,auto|M]", ku M tregon numrin e thread-ve ndërveprues për t'u krijuar (aktualisht automatikisht do të thotë 1).
    • Opsioni i shtuar "-heap-size-hint=" ", i cili përcakton pragun pas të cilit fillon grumbullimi aktiv i plehrave. Madhësia mund të specifikohet në bajt, kilobajt (1000 KB), megabajt (300 MB) ose gigabajt (1,5 GB).
  • Ndryshimet në multithreading
    • "Threads.@spawn" tani ka një argument të parë opsional me vlerën ":default" ose ":interactive". Një detyrë ndërvepruese kërkon vonesë të ulët të përgjigjes dhe është projektuar të jetë e shkurtër ose të kryhet shpesh. Detyrat ndërvepruese do të ekzekutohen në temat ndërvepruese nëse ato specifikohen kur fillon Julia.
    • Temat që ekzekutohen jashtë kohës së ekzekutimit të Julia (si nga C ose Java) tani mund të thërrasin kodin e Julia duke përdorur "jl_adopt_thread". Kjo ndodh automatikisht kur futni kodin Julia nëpërmjet "cfunction" ose pikës hyrëse "@callable". Si pasojë, numri i thread-eve 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ë ngarkoi një modul të caktuar, i ngjashëm me "pkgdir(m::Module)".
    • Funksioni i ri "stack(x)" që përgjithëson "reduce(hcat, x::Vector{<:Vector})" në çdo dimension dhe lejon çdo përsëritës të përsëritësve. Metoda "stack(f, x)" përgjithëson "mapreduce(f, hcat, x)" dhe është më efikase.
    • Makro e re për analizimin e memories së alokuar "@allocations", e ngjashme me "@allocated", përveç që kthen numrin e alokimeve të memories, në vend të madhësisë totale të memories së alokuar.
  • Karakteristikat e reja të bibliotekës
    • "RoundFromZero" tani funksionon për lloje të tjera përveç "BigFloat".
    • "Dict" tani mund të reduktohet manualisht duke përdorur "sizehint!"
    • "@time" tani specifikon veçmas përqindjen e kohës së shpenzuar për ripërpilimin e metodave të pavlefshme.
  • Ndryshimet në bibliotekën standarde
    • Rregulloi një problem të konkurencës në metodat e përsëritjes për Dict dhe objekte të tjera të prejardhura si çelësat(::Dict), vlerat(::Dict) dhe Set. Këto metoda përsëritjeje tani mund të thirren në një Dict ose Set paralelisht për një numër të pakufizuar temash, për sa kohë që nuk ka veprime që modifikojnë fjalorin ose grupin.
    • Negimi i një funksioni kallëzues "!f" tani kthen një funksion të përbërë "(!) ∘ f" në vend të një funksioni anonim.
    • Funksionet e ndarjes së dimensionit tani funksionojnë nëpër dimensione të shumta: "secila pjesë", "secila" dhe "secila" kthejnë një objekt "Fetë" që lejon dërgimin për të ofruar metoda më efikase.
    • U shtua makro "@kwdef" në API-në publike.
    • Rregulloi një problem me rendin e operacioneve në "fld1".
    • Renditja tani është gjithmonë e qëndrueshme në kohë (QuickSort është ridizajnuar).
    • "Base.splat" tani eksportohet. Vlera e kthyer është një tip "Base.Splat" dhe jo një funksion anonim, duke e lejuar atë të dalë mirë.
  • Menaxheri i paketave
    • "Zgjerime të paketës": Mbështetje për ngarkimin e një fragmenti kodi nga paketat e tjera të ngarkuara në një sesion Julia. Aplikacioni është i ngjashëm me paketën "Requires.jl", por përpilimi paraprak dhe përputhshmëria e cilësimeve mbështeten.
  • Biblioteka LinearAlgjebër
    • Për shkak të rrezikut të konfuzionit me ndarjen sipas elementeve, u hoqën metodat "a/b" dhe "b\a" me skalar "a" dhe vektorin "b", të cilat ishin ekuivalente me "a * pinv(b)".
    • Thirrja e BLAS dhe LAPACK tani përdor "libblastrampoline (LBT)". OpenBLAS ofrohet si 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ë grup tjetër ekzistues bibliotekash.
    • "lu" mbështet një strategji të re të rrotullimit të matricës, "RowNonZero()", e cila zgjedh elementin e parë të rrotullimit jozero për përdorim me lloje të reja aritmetike dhe për qëllime trajnimi.
    • "normalize(x, p=2)" tani mbështet çdo hapësirë ​​vektoriale të normalizuar "x", duke përfshirë skalarët.
    • Numri i paracaktuar i fijeve BLAS tani është i barabartë me numrin e thread-ve të CPU-së në arkitekturat ARM dhe gjysmën e numrit të thread-ve të CPU-së në arkitekturat e tjera.
  • Printf: Mesazhe gabimi të ripunuara për vargjet e formatuara gabimisht për lexueshmëri më të mirë.
  • Profili: Funksioni i ri "Profile.take_heap_snapshot(file)", i cili shkruan një skedar në formatin ".heapsnapshot" të bazuar në JSON të mbështetur në Chrome.
  • Random: randn dhe randexp tani punojnë për çdo lloj AbstractFloat që përcakton rand.
  • PPLRGJIGJE
    • Shtypja e kombinimit të tastit "Alt-e" hap tani hyrjen aktuale në redaktues. Përmbajtja (nëse modifikohet) do të ekzekutohet kur të dilni nga redaktori.
    • Konteksti aktual i modulit aktiv në REPL mund të ndryshohet (Kryesor sipas parazgjedhjes) duke përdorur funksionin "REPL.activate(::Module)" ose duke futur modulin në REPL dhe duke shtypur kombinimin e tastit "Alt-m".
    • Modaliteti "prompt i numëruar", i cili printon numra për çdo hyrje dhe dalje dhe ruan rezultatet e shënuara në Out, mund të aktivizohet duke përdorur "REPL.numbered_prompt!()".
    • Plotësimi i skedës shfaq argumentet e disponueshme të fjalëve kyçe.
  • SuiteSparse: Kodi i zhvendosur për zgjidhësin "SuiteSparse" te "SparseArrays.jl". Zgjidhësit tani rieksportohen nga "SuiteSparse.jl".
  • Vargjet e rralla
    • Zgjidhësit "SuiteSparse" janë tani të disponueshëm si nënmodule "SparseArrays".
    • Mënyrat e mbrojtjes së fijeve UMFPACK dhe CHOLMOD janë përmirësuar duke eliminuar variablat globale dhe duke përdorur bravat. "ldiv!" Objektet UMFPACK tani mund të ekzekutohen në mënyrë të sigurt.
    • Funksioni eksperimental "SparseArrays.allowscalar(::Bool)" ju lejon të çaktivizoni ose aktivizoni indeksimin skalar të grupeve të rralla. Ky funksion është krijuar për të zbuluar indeksimin e rastësishëm skalar të objekteve "SparseMatrixCSC", i cili është një burim i zakonshëm i problemeve të performancës.
  • Modaliteti i ri i sigurt për dështimet për grupet e provës që përfundon fillimin e testimit në rast të një dështimi ose gabimi. Cakto ose nëpërmjet "@testset kwarg failfast=true" ose "eksporto JULIA_TEST_FAILFAST=true". Kjo ndonjëherë është e nevojshme në ekzekutimet CI për të marrë mesazhe gabimi herët.
  • Datat: Vargjet boshe nuk analizohen më gabimisht si vlera të vlefshme "DateTime", "Dates" ose "Times" dhe në vend të kësaj hedhin një "ArgumentError" në konstruktorë dhe analizë, ndërsa "tryparse" nuk kthen asgjë.
  • Paketa e Shperndare
    • Konfigurimi i paketës (projekti aktiv, "LOAD_PATH", "DEPOT_PATH") përhapet tani kur shtohen proceset e punonjësve lokalë (p.sh. duke përdorur "addprocs(N::Int)" ose duke përdorur flamurin e linjës së komandës "--procs=N").
    • "addprocs" për proceset e punëtorit lokal tani pranon një argument të quajtur "env" për të kaluar variablat e mjedisit tek proceset e punës.
  • Unicode: "grafema(s, m:n)" kthen nënvargun nga grafema mth në n-të në "s".
  • Paketa DelimitedFiles është hequr nga bibliotekat e sistemit dhe tani shpërndahet si një paketë e veçantë që duhet të instalohet në mënyrë eksplicite për t'u përdorur.
  • Varësitë e jashtme
    • Në Linux, versioni i bibliotekës së sistemit libstdc++ zbulohet automatikisht dhe, nëse është më i ri, ngarkohet. Sjellja e vjetër e ngarkimit e integruar libstdc++, pavarësisht nga versioni i sistemit, mund të rikthehet duke vendosur variablin e mjedisit "JULIA_PROBE_LIBSTDCXX=0".
    • U hoq "RPATH" nga binar julia, i cili mund të thyejë bibliotekat në Linux që nuk arrijnë të përcaktojnë variablin "RUNPATH".
    • Përmirësimet e veglave: Dalja e "MethodError" dhe metodave (për shembull nga "methods(my_func)") tani është formatuar dhe ngjyrosur në përputhje me parimin e daljes së metodave në një gjurmë stek.

    Burimi: opennet.ru

Shto një koment