Programmeerimiskeele Julia 1.8 väljaanne on nüüd saadaval, pakkudes kõrget jõudlust, toetades dünaamilist tüpiseerimist ja sisaldades sisseehitatud vahendeid paralleelseks programmeerimiseks. Juulia süntaks on lähedane MATLAB-ile, koos mõningate elementide laenamisega Ruby-st ja Lisp-ist. Stringide manipuleerimise meetod meenutab Perl-i.
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.
Peamised muudatused Julia 1.8-s:
- Keele uued võimalused
- Muutuva struktuuri (mutable struct) väljad võivad nüüd olla märgitud kui konstantid, et takistada nende muutmist ja võimaldada optimeerimist.
- Tüübimärked võivad olla lisatud globaalsele muutuvale.
- Tühjad n-d mõõtmelised massiivid saab luua, kasutades ruutudes mitu koolonit, näiteks «[;;;]» loob massiivi 0×0×0.
- Try plokkidel võivad nüüd olla ka else plokid, mis täidetakse kohe peamise kehaga, kui ei ole mingeid vigu.
- @inline ja @noinline saab paigutada funktsiooni sisse, mis võimaldab anonüümseid funktsioone märgistada.
- @inline ja @noinline saab nüüd rakendada funktsioonidele, mis on kutsutud üles või plokis, et sundida vastavaid funktsioone sisse või välja lülitama.
- ∀, ∃ ja ∄ on lubatud identifikaatori sümbolitena.
- Toetust on lisatud Unicode 14.0.0 spetsifikatsioonile.
- Meetod Module(:name, false, false) saab kasutada mooduli loomiseks, mis ei sisalda nimesid, ei impordi Base'i ega Core'i ning ei viita iseendale.
- Keeles tehtud muudatused
- Uuesti loodud objektide Task (@spawn, @async jms.) world_age nüüd põhitasandi Task'i meetodite jaoks loomisel, mis võimaldab nende täitmise optimeerimist. Eelmise aktiveerimismeetodi saab kasutada meetodi Base.invokelatest kaudu.
- Unicode'i tasakaalustamata kahepoolsed vormindusdirektiivid on nüüd keelatud stringides ja kommentaarides, et vältida süstimist.
- Base.ifelse määratletakse nüüd üldise funktsioonina, mitte sisse ehitatud funktsioonina, mis võimaldab pakettidel selle määratlust laiendada.
- Iga globaalne muutuja määramine läbib nüüd esmalt convert(Any, x) või convert(T, x) kutset, kui globaalne muutuja on deklareeritud tüübi T. Enne globaalsete muutujate kasutamist veenduge, et invariant convert(Any, x) === x kehtib alati, vastasel juhul võib see põhjustada ootamatut käitumist.
- Sisseehitatud funktsioonid sarnanevad nüüd universaalsetele funktsioonidele ja neid saab programmeerimise teel loetleda meetodite abil.
- Kompilaatori/ajaviimese parandused
- Alglaadimise aeg on vähenenud umbes 25% võrra.
- LLVM-põhine kompilaator on eraldatud runtime-raamatukogust uude raamatukogusse libjulia-codegen. See laaditakse vaikimisi, seega tavapärase kasutuse korral ei tohiks muudatusi olla. Rakendustes, kus kompilaatorit ei vajata (nt süsteemipildid, kus kogu vajalik kood on eelnevalt kompileeritud), saab selle raamatukogu (ja tema LLVM-sõltuvuse) lihtsalt välja jätta.
- Konditsioonitüübi väljastamine on nüüd võimalik, edastades argumendi meetodile. Näiteks Base.ifelse(isa(x, Int), x, 0) tagastab ::Int, isegi kui tüüpi x ei teada.
- SROA (Scalar Replacement of Aggregates) on täiustatud: välistab getfield kutsed pidevate globaalsete väljadega, välistab muudetavad struktuurid, millel on initsialiseerimata väljad, parandab jõudlust ja töötlemist, kui getfield on pesastatud.
- Tüüpide väljund jälgib erinevaid efekte — kõrvaltoimeid ja loobumist. Arvestatakse konstantide levikut, mis suurendab oluliselt jõudlust kompileerimise ajal. Mõnes olukorras, näiteks funktsioonikutsed, mis ei saa kohapeal välja töötada, kuid ei mõjuta tulemust, jäetakse täitmise ajal kõrvale. Efektide reegleid saab käsitsi üle kirjutada makro abil Base.@assume_effects.
- Eelkompileerimine (ilmsete eelkompileerimise direktiivide või määratud töökoormustega) salvestab nüüd rohkem tüübiga määratletud koodi, mis vähendab esmakäivitamise aega. Kõik uued meetodite/tüüpide kombinatsioonid, mida teie paketil on vaja, olenemata sellest, kus need meetodid on määratletud, saavad nüüd eelkompileerimisfailis vahemällu salvestada, kui neid kutsub esile teie paketi kuuluv meetod.
- Käsurea parameetrite muudatused
- Vaikimisi käitumine @inbounds deklaratsioonide jälgimiseks on nüüd auto valik „—check-bounds=yes|no|auto”.
- Uus valik „—strip-metadata” dokumentatsiooni ridade, allika asukoha ja kohalikku muutuja nime eemaldamiseks süsteemipildi loomisel.
- Uus valik „—strip-ir” kompilaatori poolt vahepealse esitluse eemaldamiseks süsteemipildi koostamisel. Saadud pilt töötab ainult siis, kui kasutatakse „—compile=all” või kui kogu vajalik kood on eelnevalt kompileeritud.
- Kui failinime asemel on märgitud sümbol „-“, siis loetakse täituv kood standardse sisendvoo kaudu.
- Mitmevoo tuge muutused
- Threads.@threads kasutab vaikimisi uut ajastuse parameetrit :dynamic, mis erineb eelmise režiimi omadest, kuna iteratsioonid plaanitakse dünaamiliselt saadaolevatele töövoogudele, mitte ei kinnitata igale voogule. See režiim võimaldab paremini jaotada sissehelistatud silmuseid @spawn ja @threads.
- Uued raamatukogu funktsioonid
- eachsplit(str) mitmekordseks split(str) täitmiseks.
- allequal(itr) kontrollib, kas kõik elemendid iteraatoris on võrdsed.
- hardlink(src, dst) saab kasutada kõvaksiidide loomiseks.
- setcpuaffinity(cmd, cpus) paneb protsessid CPU tuumadega vastavusse.
- diskstat(path=pwd()) diskistatistika saamiseks.
- Uus makro @showtime, et kuvada nii hinnatud string kui ka @time aruanne.
- LazyString ja makro lazy"str" on lisatud, et toetada tõhustatud vigade teate ehitamist vea teede korral.
- Parandatud probleem paralleelse juurdepääsuga Dict ja muudes tuletatud objektides, nagu keys(::Dict), values(::Dict) ja Set. Iteratsiooni meetodeid saab nüüd kutsuda välja sõnaraamatule või kogule, kui pole kutseid, mis muudavad sõnaraamatut või kogu.
- @time ja @timev toetavad nüüd valikulist kirjeldust, mis võimaldab märkida ajaaruannete allikaid, näiteks @time "Evaluating foo" foo().
- range võtab üheainsa argumentidena kas stop või length.
- precision ja setprecision võtan nüüd base'i kui võtmeoleku.
- TCP-pesa objektid pakuvad nüüd closewrite meetodit ja toetavad osaliselt avatud režiimi kasutamist.
- extrema võtab nüüd init argument.
- Iterators.countfrom võtab nüüd mis tahes tüübi, mis määratleb meetodi +.
- @time eraldab nüüd % ajast, mis kulus meetodite ümberkompileerimisele, mille tüüp on muutunud.
- Standardraamatukogu muudatused
- Võtmed, mille väärtus on Nothing, eemaldatakse nüüd keskkonnast addenv.
- Iterators.reverse (ja seega last) toetab eachline'i.
- Teatud tüüpi vahemike length funktsioon ei kontrolli enam täisarvu ülevoolu. On saadaval uus funktsioon checked_length, mis sisaldab ülevoolu kontrolli loogikat. Vajadusel kasutage SaferIntegers.jl, et luua vahemiku tüüpi.
- Iteraator Iterators.Reverse rakendab eachindex'i pööramist, kui see on võimalik.
- Pakkide haldaja
- Uued indikaatorid ⌃ ja ⌅ pakettide kõrval olekus "pkg>", mille jaoks on saadaval uued versioonid. ⌅ näitab, et uusi versioone ei saa installida.
- Uus argument outdated::Bool Pkg.status jaoks (—outdated või -o REPL režiimis), et näidata teavet eelneva versiooni paketide kohta.
- Uus argument compat::Bool Pkg.status jaoks (—compat või -c REPL režiimis), et näidata kõiki [compat] kirjeid Project.toml failis.
- Uus režiim "pkg> compat" (ja Pkg.compat) projekti ühilduvuskirjete seadistamiseks. Pakub interaktiivset redigeerijat kaudu "pkg> compat" või otsest kontrolli kirje üle "pkg> Foo 0.4,0.5", mis suudab laadida olemasolevaid kirjeid autocomplete tagant. Näiteks "pkg> compat Fo" täiendatakse automaatselt "pkg> Foo 0.4,0.5", et oleks võimalik olemasolevat kirjet redigeerida.
- Nüüd Pkg proovib laadida pakette serverile pakette ainult juhul, kui server jälgib registrit, mis sisaldab paketti.
- Pkg.instantiate kuvab nüüd hoiatust, kui Project.toml ei ole Manifest.toml-iga sünkroniseeritud. See teeb seda projekti deps ja compat sissekannete hash-kirjete põhjal, ignoreerides teisi välju, kui see lahendab manifesti, et tuvastada kõik muudatused Project.toml-i deps või compat-kirjetes ilma lahendamiseta uuesti.
- Kui «pkg> add» ei leia paketti määratud nimega, pakutakse nüüd sarnaste nimedega pakette, mida saab lisada.
- Manifestis hoitav julia versioon ei hõlma enam versiooninumbrit, s.t. master salvestatakse nüüd kui 1.9.0-DEV.
- Katsel «pkg>» katkestamine tuvastatakse nüüd usaldusväärsemalt ja tagastatakse õigesti REPL-i.
- InteractiveUtils
- Uus makro @time_imports, et teatada ajast, mis kulub pakettide ja nende sõltuvuste importimiseks, rõhutades kompileerimise ja ümberkompileerimise aega protsentides impordis.
- Lineaarne algebra
- BLAS alammodul toetab nüüd level-2 BLAS funktsiooni spr!.
- LinearAlgebra.jl standardbiblioteek on nüüd täielikult sõltumatu SparseArrays.jl-st, nii lähtekoodi kui ka moodulitestimise osas. Seetõttu ei naaseta harilikud massiivid (kaudselt) LinearAlgebra meetodite kaudu Base'i või LinearAlgebra objektidele. See toob kaasa järgmised kriitilised muudatused:
- Konkreetse "harilikult" matriitsi (nt diagonaal) abil konkateneerimine tagastab nüüd tihedad matriitsid; Seetõttu on D1 ja D2 väljad SVD objektides, mis loodi getproperty kutsete käigus, nüüd tihedad matriitsid.
- Meetod similar(::SpecialSparseMatrix, ::Type, ::Dims) tagastab tiheda nullmatriitsi. Seetõttu viib kahe-, kolme- ja sümmeetriliste kolme diagonaali matriitide korrutamine üksteisega tiheda matriitsi tekkeni. Lisaks ei õnnestu sarnaste matriitside loomine kolmes argumendis spetsiaalsetest "harilikest" matriitidest (mitte staatilistest) matriitsidest "zero(::Type{Matrix{T}})" tõttu.
- Printf
- Nüüd kasutatakse formaadi laiuse %s ja %c jaoks argumenti textwidth.
- Profile
- Protsessori koormuse profileering salvestab nüüd metaandmeid, sealhulgas teemasid ja ülesandeid. Profile.print() funktsioonil on uus rühmitamisargument groupby, mis võimaldab rühmitada teemasid, ülesandeid või pesatud teemasid/ülesandeid, ülesandeid/teemasid, samuti argumente threads ja tasks filtrite määramiseks. Lisaks edastatakse kasutusprotsent nüüd kas kogusena või teemade kaupa, sõltuvalt sellest, kas teema on igav või mitte igas valimis. Profile.fetch() sisaldab vaikimisi uusi metaandmeid. Tagasitehtavuse säilitamiseks väljaspoolt profiilimisandmete tarbijaid saab seda välja jätta, edastades include_meta=false.
- Uus moodul Profile.Allocs võimaldab mälu eraldamise profileerimist. Salvestatakse stack trace, iga mälu eraldise tüüp ja suurus, ning argument sample_rate võimaldab vahele jätta kohandatavat arvu jaotusi, vähendades jõudluse koormust.
- Protsessori profileerimine, mille kestus on fikseeritud, võib nüüd käivitada kasutaja tööde käigus ilma profiili eelneva laadimiseta, ja aruanne kuvatakse tööde ajal. MacOS ja FreeBSD puhul vajutage ctrl-t või kasutage SIGINFO signaali. Teistel platvormidel aktiveerige SIGUSR1, st % kill -USR1 $julia_pid. Windowsis see pole saadaval.
- REPL
- RadioMenu toetab nüüd täiendavaid klaviatuuri kombinatsioone otse valikute tegemiseks.
- Jada «?(x, y», millele järgneb TAB klahvi vajutamine, kuvab kõik meetodid, mida saab kutsuda argumentidega x, y, …. (Tühik alguses ei võimalda abi režiimi sisenemist). «MyModule.?(x, y» piirab otsingut «MyModule» kohta. TAB vajutamine nõuab, et vähemalt ühel argumendil oleks tüüp, mis on konkreetsem kui Any. Alternatiivselt kasutage SHIFT-TAB’i, et lubada mistahes ühilduvaid meetodeid.
- Uus globaalne muutuja err võimaldab saada viimase erandi, sarnanedes käitusele ans viimase vastuse puhul. Err sisestamine kordab erandi teavet.
- SparseArrays
- SparseArrays kood on kantud Julia hoidlast välistesse hoidlatesse SparseArrays.jl.
- Uued sparse_hcat, sparse_vcat ja sparse_hvcat concat-funktsioonid tagastavad SparseMatrixCSC tüübi sõltumata sisendargumentide tüübist. See oli vajalik, et ühtlustada maatriksite liitmise mehhanismi pärast LinearAlgebra.jl ja SparseArrays.jl koodi eraldamist.
- Logging
- Standardse logitasemed BelowMinLevel, Debug, Info, Warn, Error ja AboveMaxLevel on nüüd eksportitud standardse Logging teegist.
- Unicode
- Lisatud on funktsioon isequal_normalized, et kontrollida Unicode'i ekvivalentsust ilma normaliseeritud stringide selgelt loomata.
- Funktsioon Unicode.normalize võtab nüüd vastu võtmesõna chartransform, mida saab kasutada kohandatud sümbolite vastete esitamiseks, samuti on saadaval funktsioon Unicode.julia_chartransform, et taasluua vastet, mida kasutatakse identifikaatorite normaliseerimisel Julia süntaksanalüsaatoris.
- Test
- ‘@test_throws «some message» triggers_error()’ on nüüd võimalik kasutada selleks, et kontrollida, kas veateates kuvatav tekst sisaldab «some message», sõltumata konkreetsest erandi tüübist. Toetatakse ka regulaaravaldisi, stringide loendeid ja vastete funktsioone.
- @testset foo() on nüüd saadaval, et luua testikomplekt antud funktsioonist. Testikomplekti nimi on kutsutud funktsiooni nimi. Kutsutud funktsioon võib sisaldada @test ja teisi @testset määratlusi, sealhulgas teiste funktsioonide kutseid, salvestades samal ajal kõik vahepealsed testimise tulemused.
- TestLogger ja LogRecord on nüüd eksporditud standardtesti raamatukogust.
- Jaotatud
- SSHManager toetab nüüd töötavate protsesside käivitamise tagaukse csh/tcsh kaudu meetodi addprocs() ja parameetri shell=:csh abil.
- Muud muudatused
- GC.enable_logging(true) saab kasutada iga prügikogumise operatsiooni registreerimiseks, märkides aja ja kogutud mälu suuruse.
Allikas: opennet.ru
