Programeerimiskeele Julia 1.11 väljaanne toob kaasa kõrge jõudluse, dünaamilise tüpiseerimise toe ja sisseehitatud tööriistad paralleelseks programmeerimiseks. Julia süntaks on sarnane MATLAB-ile, varastades samas elemente Ruby ja Lisp keeltest. Stringide manipuleerimise meetod meenutab Perl-i. Projekti kood levitatakse MIT litsentsi alusel.
Keele põhijooned:
- Kõrge jõudlus: projekti üheks peamiseks eesmärgiks on jõudluse saavutamine, mis on lähedane C keeles kirjutatud programmidele. Julia kompilaator põhineb LLVM projektide arendustel ja genereerib tõhusat natiivset masinkoodi mitmesugustele sihtplatvormidele;
- Toetab erinevaid programmeerimisparadigmasid, sealhulgas objekte orienteeritud ja funktsionaalset programmeerimist. Standardraamatukogu sisaldab funktsioone, sealhulgas asünkroonseks sisendiks/väljundiks, protsesside juhtimiseks, logimise, profileerimise ja paketihaldamise jaoks;
- Dünaamiline tüpiseerimine: keel ei nõua muutujate tüüpide selget määratlemist, sarnaselt skriptikeeltele. Toetatakse interaktiivset töörežiimi;
- Valikuline võimalus tüüpide selgeks määramiseks;
- Süntaks, mis sobib suurepäraselt arvutuste, teaduslike arvutuste, masinõppe süsteemide ja andmete visualiseerimise jaoks. Toetatakse mitmeid arvandmete type ja lahendusi arvutuste paralleliseerimiseks.
- Otsene funktsioonide kutsumise võimalus C-keele raamatukogudest ilma täiendavate vahelkihtideta.
Olulised muudatused Julia 1.11:
- Keele uued võimalused
- Lisatud on Memory tüüp, mis on madala taseme alternatiiv Array tüübile. Memory tüüp vajab vähem ressursse ja on kiire konstruktor, olles alternatiiv Array-le seal, kus ei ole vajalik kogu selle funktsionaalsus. Näiteks mitme mõõtme massiivid. Sisemise rakenduse kohaselt on enamik Array tüübi meetodeid rakendatud Memory tübi peal, mis on oluliselt kiirendanud mõningaid funktsioone, nagu push.
- Lisa on märksõna „public“. Identifikaatorid, mis on märgistatud kui „public“, käsitletakse välise programmeerimise liidese etalonina. Identifikaatoreid, millel on märksõna „export“, käsitletakse sarnaselt. Kuid peamine erinevus „public“ ja „export“ vahel on see, et nimed, mis on märgitud „public“, ei kuulu mooduli konteksti, kui kasutatakse „using“ sõltuvates moodulites.
- Pakett ScopedValue rakendab dünaamilise ulatuse paralleelses programmeerimises, Threads/tasks kasutamisel.
- Fail Manifest.toml võib nüüd olla ümber nimetatud vormingus Manifest-v{major}.{minor}.toml, et kasutada konkreetset Julia versiooni. Näiteks fail Manifest-v1.11.toml kasutatakse versiooni 1.11 jaoks, samas kui fail Manifest.toml samas kaustas kasutatakse teiste Julia versioonide jaoks.
- Unicode 15.1 tugi on lisatud.
- Keeles tehtud muudatused
- Eelkompileerimise käigus käivitatakse „atexit“ töötleja enne lõppfaili loomist. See võimaldab kasutajatel ohutult lõpetada taustategevuse (näiteks ajastustriggerid või perioodilised teavitused) ja samuti vabastada ressursse enne programmi lõpetamist.
- Koodi katte ja mälu eraldamise failid ei genereerita enam enne kompileerimist. Lisaks kasutatakse nendes režiimides pkgimage vahemälu pakettide jaoks, milles jälgimist ei toimu. See tähendab, et katse katvuse eesmärgil (julia-actions/julia-runtest vaikimisi) kasutatakse pkgimage vahemälu kõigi teiste pakettide jaoks, millest testitav sõltub. See kiirendab testimist.
- JULIA_DEPOT_PATH-teel on nüüd erinev töötlemine. Ühe tee olemasolul sisestatakse ainult see tee sisemise DEPOT_PATH muutujasse. Kui viimane märk on ":", siis DEPOT_PATH muutuja saab väärtuse, mis sisaldab kõike, mis oli enne ":", ning nimekirja süsteemi teedest, kus Julia asub.
- Eelkompileerimise vahemälu faile saab nüüd liikuda, ning nende värskust kontrollitakse lähtfailide sisu sisemiste hashide abil, mitte «mtime» kaudu.
- Kompilaatori/ajaviimese parandused
- Prügi kogumise heuristika on ajakohastatud, võimaldades töötada mälu lehtedega tervikuna, mitte üksikute objektidega.
- Soodne toetamine Base.@assume_effects annotatsioonide lisamiseks koodi.
- Käsurea parameetrite muudatused
- Sisesta punkttuli on nüüd täpselt määratletud kui Main.main(args). Sisestuspunkt tuleb määrata makro @main abil (vt dokumentatsiooni). Kui sisestuspunkt on määratud skriptis, mida käivitatakse käsuviibas (nt «julia script.jl» või «julia -e expr»), käivitab julia automaatselt funktsiooni Main.main. See on tehtud skriptide täitmise ja kompileerimise ühtlustamiseks, kui koodi laadimine võib toimuda kompileerimiseks ning Main.main meetodi täitmine vaid täitmisfaili käivitamise etapil. Interaktiivses režiimis Jutlial mingeid muudatusi ei toimu. Kogu kood täidetakse järjestikku. Argumente «—compiled-modules» ja «—pkgimages» võib seadistada režiimiks existing, mis sunnib Julial kasutama olemasolevaid vahemälu, kuid mitte uusi looma.
- Argument «—project» võib nüüd saada väärtuse @script, et märkida Project.toml faili asukoht käivitatava skripti suhtes. Näiteks «—project=@script/foo» alammapi foo jaoks. Kui mitte midagi ei ole määratud, st «—project=@script», siis on see sarnane «—project=@.», kui Project.toml faili otsitakse praeguses kataloogis.
- Mitme haru muudatused
- Makros Threads.@threads võimaldab määrata planeerija režiimi :greedy, mis on mugav ebaühtlase arvutuskoormuse korral. Uus struktuur (avaliku spetsiifika, kuid mitte export) «struct Base.Lockable{T, L<:AbstractLock}» on ümbris, mis korraldab paralleelset juurdepääsu koostisosade tüüpide elementidele, muudab koodi üldiselt lihtsamaks.
- Kogumisseadme muudatused
- Julia ja LLVM kokkupanemise jaoks mõeldud Makefile kasutab PGO ja LTO optimeerimisstrateegiaid. Vaata contrib/pgo-lto/Makefile.
- Uued raamatukogu funktsioonid
- Kolm uut tüüpi on lisatud annotatsiooni tekstide idee raames — Pair{Symbol, Any}, näiteks ‘:lang => «en»‘ või ‘:face => :magenta’. Kui see on võimalik, salvestatakse annotatsioonid stringide töötlemise ajal, näiteks konkateneerimise käigus.
- Konkreetselt tüüp AnnotatedString rakendab AbstractString. See tüüp on stringi ümbris, võimaldades lisada annotatsiooni sümbolite vahemikus. Tüüpi AnnotatedString kasutatakse laialdaselt uues standardraamatukogus StyledStrings, et kuvada teavet ekraanil stiilselt.
- Konkreetselt tüüp AnnotatedChar rakendab AbstractChar. See on ümbris sümboli üle ja võimaldab lisada sellele annotatsioonide nimekirja.
- Konkreetne tüüp AnnotatedIOBuffer rakendab IO-d, kordab IOBuffer tüübi liidest, kuid omab spetsialiseeritud read/write meetodeid voolu annotatsiooniks. Seda saab kasutada kas stringide ehitajana või annotatsioonitud ja mitte-annotatsioonitud stringide liimimise vahendina.
- Meetod „in!(x, s::AbstractSet)“ tagastab alati true. Kuid kui element x ei kuulu s-isse, siis see lisatakse.
- Uus funktsioon Libc.mkfifo on C-funktsiooni mkfifo ümberpakendamine Unix platvormide jaoks.
- Meetod „logrange(start, stop; length)“ loob logaritmilise järjestuse määratud kogusega, mitte fikseeritud sammuga.
- Meetodid „copyuntil(out, io, delim)“ ja „copyline(out, io)“ kopeerivad andmeid voolust io voolu out::IO.
- Meetod „eachrsplit(string, pattern)“ tagastab iteraatori stringi lõhestatud elementide jaoks paremalt vasakule.
- Meetod Sys.username() tagastab hetke kasutaja nime.
- Meetodeid Sys.isreadable(), Sys.iswritable() saab kasutada kasutaja lugemis- ja kirjutamisõiguste määramiseks.
- Meetod GC.logging_enabled() tagastab true, kui prügikoguja tegevuse logimine on lubatud läbi GC.enable_logging.
- Tüüp IdSet on nüüd eksportitud Base'ist ja on avalikult kätte saadav.
- Makro «@time» annab nüüd lukustamiskonfliktide arvu, kui kasutatakse ReentrantLock'i, mille ootamine on vajalik. Samuti on lisatud makro «@lock_conflicts», mis tagastab selle arvu.
- Makro Base.Cartesian.@ncallkw on loodud sarnasel põhjal Base.Cartesian.@ncall'iga, kuid võimaldab lisada argumendid võtmeväärtuste kujul funktsiooni kutsumiseks.
- Uus funktsioon Docs.hasdoc(module, symbol) teavitab, kas taotletud nime symbol kohta on olemas docstringi kirjeldus.
- Uus funktsioon Docs.undocumented_names(module) tagastab taotletud mooduli module dokumenteerimata funktsioonide nimed.
- Uued võimalused tuntud meetodites
- Meetod invmod(n, T) eeldefineeritud täisarvu tüübi T jaoks arvutab nüüd modulaarselt pöördväärtuse n uue algoritmi abil.
- Meetod invmod(n) pakub lühendatud vormi kutsumiseks invmod(n, typeof(n)) täisarvutüüpide jaoks.
- Meetod replace(string, pattern…) toetab nüüd valikulist argumenti IO, et tagastada väärtus voogu, mitte String tüüpi stringi.
- Uued meetodid allequal(f, itr) ja allunique(f, itr) funktsiooni näidikargumendiga.
- Meetod sizehint!(s, n) toetab nüüd valikut «shrink», mis võimaldab keelata elementide kärpimise.
- IOBuffer'i edastamine stdout'i argumendina protsesside genereerimisel töötab nüüd täieliku sünkroonimisega 'wait' või 'success', seega ei ole Base.BufferStream'is enam vajalik olemasolu üle kontrollida.
- Meetod 'closewrite' ei kutsu enam automaatselt edastatud voogu pärast protsessi sulgemist. Kasutage meetodit 'wait' protsessi jaoks, seejärel kutsuge 'closewrite' sunniviisiliselt üles. Või kasutage 'open' meetodi vormi funktsioonidega automaatseks sulgemiseks.
- Meetod '@timed' tagastab nüüd ka hinnangu kompileerimise ja rekompileerimise ajale, mis on põhjustatud tüüpide ebastabiilsusest.
- Meetod 'filter' suudab nüüd töötada ka NamedTuple'iga.
- Meetod Iterators.cycle(iter, n) käivitatakse iteratsioonil 'iter' fikseeritud n arv kordi.
- Meetod zero(::AbstractArray) rakendatakse rekursiivselt, näiteks zero([[1,2],[3,4,5]]) genereerib [[0,0],[0,0,0]] asemel vea.
- Meetod include_dependency(path; track_content=true) lisab sõltuvused eelkompileeritud koodi räsiväärtuse alusel, mitte mtime'i alusel.
- Põhibiblioteegi muudatused
- Meetod write(::IO, ::AbstractArray) kasutatakse rekursiivseks 'write' meetodite kutsumiseks iga massiivi elemendi jaoks, kuid nüüd salvestatakse iga väärtuse mälus esindus. Näiteks write(io, ‘a’:’b’) kutsumine salvestab 4 bait iga sümboli jaoks, selle asemel et kasutada igaühe jaoks lühendatud UTF-8 vormingut. Uus formaat on kooskõlas Array'ga, mis võimaldab kasutada meetodit 'read!' väärtuste tagasivõtmiseks.
- Ei saa määrata meetodit 'length' olekuga iteratooridele üldiselt. Seoses potentsiaalsete probleemidega olekuga iteratooridega on meetod length(::Stateful) eemaldatud.
- StyledStrings
- Uus standardraamatuguru stiilsete stringide esitlemiseks.
- Faces struktuur on stiilse teabe (värv, dekoraatorid jne) konteiner, samuti pakub see mugavat, laiendatavat (lisades addface!) ja kohandatavat (kasutades kohandatud Faces.toml ja loadfaces!) lähenemist sisu stiilide kuvamiseks.
- Makro @styled_str pakub mugavat viisi annotatsioonidega stringide AnnotatedString loomiseks erinevate stiilide atribuutidega. Näiteks StyledStrings.addface!(:orange => StyledStrings.Face(foreground = 0xFF7700)) styled»{orange:this is orange text}»
- Libdl
- Uus LazyLibrary tüüp eksporditakse Libdli teegist, et luua laiskeid raamatukogude laadimise ahelaid, mis on esialgu kasutusel JLL formaadis.
- LinearAlgebra
- Meetod cbrt(::AbstractMatrix{<:Real}) tagastab nüüd reaalarvude ruutjuurte matriisi sisendmatriisi reaalarvudest.
- Omandi väärtuste arvutamise meetod «eigvals/eigen(A, bunchkaufman(B)) ja eigvals/eigen(A, lu(B))» kasutab vastavalt Bunchkaufmani (LDL) ja LU dekompositsiooni algoritme B jaoks, et efektiivselt arvutada A ja B üldiseid omandi väärtusi (eigen: ja eigenvektorid). Meetodi teise argumendina edastatakse bunchkaufman või lu meetodite tulemus.
- Spetsialiseeritud meetod «eigvals/eigen(::Hermitian{<:Tridiagonal})», mis on mõeldud sümmeetrilistele triidiagonaalmatriisidele ja kasutab LAPACK tööriistu.
- Struktureeritud matriisid säilitavad nüüd vanemate telgede (Symmetric/Hermitian/AbstractTriangular/UpperHessenberg) või peadiagonalide telgede (lintmatriiside puhul).
- BunchKaufmani ja bunchkaufman! meetodid on nüüd määratletud AbstractFloat, Rational ja nende komplekssete variatsioonide tüüpide jaoks. BunchKaufmani meetod toetab nüüd Integer tüüpe, muutes need sisemiselt Rational{BigInt}. Lisatud on inertsifunktsioon, mis arvutab BunchKaufmani protseduuri diagonaalfaktori inertsuse reaalse sümmeetrilise või Hermiti maatriisi objekti jaoks. Komplekssete sümmeetriliste maatrikside puhul arvutab inertsimeetod ainult diagonaalfaktori omade väärtuste arvu.
- Pakett, mis määratleb maatriksi korrutamise meetodi mul! allkirjaga mul!(::AbstractMatrix, ::MyMatrix, ::AbstractMatrix, ::Number, ::Number) ei oma enam ebamugavusi LinearAlgebra paketiga. Varasemalt tekitas korrutamise käigus ebamugavusi kasutaja määratletud maatriksi MyMatrix ja LinearAlgebra paketi poolt pakutud struktureeritud maatriksite, näiteks AbstractTriangular vahel. Taolised probleemid on lahendatud mul! operatsioonide jaoks maatriksvektoritüüpidega.
- Lu ja issuccess(::LU) meetodid toetavad nüüd argumenti allowsingular. Kui selle väärtus on true, loetakse U faktoriga madala reitinguga faktoreerimine edukaks, mitte ei teata viga. Sellised faktoreerimised kuvatakse nüüd tegurite koos märkega „rank-deficient”, mitte „Failed Factorization”.
- Juhuslik
- Rand meetod on nüüd rakendatav tüüpide jaoks, mis on antud Tuple vormis.
- Rand meetod on nüüd rakendatav tüüpide jaoks, mis on antud Pair vormis.
- Random mooduli juhuslike arvude generaatori RNG esialgseks käivitamiseks on nüüd lubatud kasutada negatiivseid arve.
- Juhuslike arvude generaatori initsialiseerimine saab nüüd toimuda stringi kaudu, näiteks seed!(rng, "a random seed").
- REPL
- Tab-klahvi vajutamine vihje lõpetamiseks on nüüd esile tõstetud heleda fondiga. Selle režiimi väljalülitamiseks rakendage Base.active_repl.options.hint_tab_completes = false interaktiivselt või startup.jl skriptis: if VERSION >= v"1.11.0-0" atreplinit() do repl repl.options.hint_tab_completes = false end end
- Meta-M tühja käsu korral vahetab nüüd kontekstimooduli eelmise mittepeamise kontekstimooduli ja peamise vahel, lihtsustades sinna ja tagasi vahetamist.
- Kuupäevad
- Dokumenteerimata funktsioon adjust ei ole enam eksporditav, kuid see on dokumenteeritud.
- Statistika
- Pakett Statistics on nüüd uuendatav ilma kogu Julia komplektita.
- Jaotatud
- Meetod pmap kasutab nüüd vaikimisi CachingPooli.
- Aegunud ja eemaldatud meetodid
- Meetodid Base.map, Iterators.map ja foreach ühe argumendiga ei ole enam toetatud.
- Välist sõltuvust
- Raamatukogu libuv on uuendatud versioonilt 1.44.2 versioonile 1.48.0.
- Meetod tput ei ole enam kasutusel terminali võimete kontrollimiseks. Selle on asendanud terminfo parsimise vahendid, mis on täielikult implementitud Julia keeles.
- Terminfo on vaikimisi kasutusel. Kui süsteemis seda ei ole, siis võib Julia olla üles ehitatud valiku Makefile WITH_TERMINFO=0 abil.
- Tööriistade täiustused
- CI viib nüüd läbi piiratud automaatset tüüpide kontrolli kõigis sulandumisettepanekutes.
Allikas: opennet.ru
