Programmeerimiskeele Julia 1.8 väljalase

Saadaval on Julia 1.8 programmeerimiskeele väljalase, mis ühendab endas sellised omadused nagu suur jõudlus, dünaamilise tippimise tugi ja paralleelse programmeerimise sisseehitatud tööriistad. Julia süntaks on lähedane MATLABile, laenates mõned elemendid Ruby ja Lisp. Stringidega manipuleerimise meetod meenutab Perli. Projekti koodi levitatakse MIT litsentsi all.

Keele põhiomadused:

  • Kõrge jõudlus: projekti üks peamisi eesmärke on saavutada C-programmidele lähedane jõudlus. Julia kompilaator põhineb LLVM projekti tööl ja genereerib tõhusat natiivset masinkoodi paljudele sihtplatvormidele;
  • Toetab erinevaid programmeerimisparadigmasid, sealhulgas objektorienteeritud ja funktsionaalse programmeerimise elemente. Standardteek pakub muuhulgas funktsioone asünkroonseks I/O-ks, protsesside juhtimiseks, logimiseks, profileerimiseks ja pakettide haldamiseks;
  • Dünaamiline tippimine: keel ei nõua muutujate jaoks selgesõnalist tüüpide määratlemist, sarnaselt skriptimiskeeltele. Toetatud interaktiivne režiim;
  • Valikuline võimalus tüüpe selgesõnaliselt määrata;
  • Süntaks, mis sobib ideaalselt arvuliseks andmetöötluseks, teaduslikuks andmetöötluseks, masinõppeks ja andmete visualiseerimiseks. Paljude numbriliste andmetüüpide tugi ja arvutuste paralleelseerimiseks mõeldud tööriistad.
  • Võimalus kutsuda funktsioone otse C-teegist ilma täiendavate kihtideta.

Peamised muudatused versioonis Julia 1.8:

  • Uued keelefunktsioonid
    • Muutuva struktuuri välju saab nüüd konstantidena märkida, et vältida nende muutmist ja võimaldada optimeerimist.
    • Globaalsetele muutujatele saab lisada tüübimärkusi.
    • Tühjad n-mõõtmelised massiivid saab luua mitme semikooloni abil nurksulgudes, näiteks "[;;;]" loob massiivi suurusega 0x0x0.
    • Prooviplokkidel võib nüüd valikuliselt olla else-plokk, mis käivitatakse kohe pärast põhiosa, kui vigu ei esinenud.
    • @inline ja @noinline saab paigutada funktsiooni kehasse, võimaldades anonüümsele funktsioonile märkusi lisada.
    • @inline ja @noinline saab nüüd rakendada funktsioonile kõnesaidil või -plokis, et sundida vastavaid funktsioonikutseid kaasama (või mitte kaasama).
    • Identifikaatoritena on lubatud kasutada ∀, ∃ ja ∄.
    • Lisatud tugi Unicode 14.0.0 spetsifikatsioonile.
    • Meetodit Module(:name, false, false) saab kasutada mooduli loomiseks, mis ei sisalda nimesid, ei impordi Base'i ega Core'i ega sisalda viidet iseendale.
  • Muutused keeles
    • Äsja loodud tegumiobjektidel (@spawn, @async jne) on nüüd loomisel lähteülesande meetodite jaoks world_age, mis võimaldab optimeeritud täitmist. Eelmine aktiveerimisvalik on saadaval meetodi Base.invokelatest abil.
    • Unicode'i tasakaalustamata kahesuunalise vormindamise direktiivid on nüüd stringides ja kommentaarides keelatud, et vältida süstimist.
    • Base.ifelse on nüüd määratletud pigem üldise funktsioonina kui sisseehitatud funktsioonina, mis võimaldab pakettidel selle määratlust laiendada.
    • Iga globaalse muutuja määramine läbib nüüd esmalt kutse konverteerida (Any, x) või teisendada (T, x), kui globaalne muutuja kuulutati tüüpiliseks T. Enne globaalsete muutujate kasutamist veenduge, et muutumatu muunduja (Any , x) === x on alati tõene, vastasel juhul võib see viia ootamatu käitumiseni.
    • Sisseehitatud funktsioonid on nüüd sarnased üldiste funktsioonidega ja neid saab meetodite abil programmiliselt loendada.
  • Kompilaatori/käitusaja täiustused
    • Alglaadimisaeg väheneb ligikaudu 25%.
    • LLVM-põhine kompilaator on käitusaja teegist eraldatud uueks teegiks libjulia-codegen. See laaditakse vaikimisi, nii et tavakasutuse ajal ei tohiks muudatusi toimuda. Juurutustes, mis ei vaja kompilaatorit (näiteks süsteemipildid, milles kogu vajalik kood on eelnevalt kompileeritud), võib selle teegi (ja selle LLVM-i sõltuvuse) lihtsalt ära jätta.
    • Tingimusliku tüübi järeldamine on nüüd võimalik meetodile argumendi edastamisega. Näiteks Base.ifelse(isa(x, Int) korral tagastab x, 0) ::Int, isegi kui x-i tüüp on teadmata.
    • SROA (Scalar Replacement of Aggregates) on täiustatud: välistab püsivate globaalsete väljadega getfieldi kõned, kõrvaldab initsialiseerimata väljadega muutuvad struktuurid, parandab pesastatud getfieldi kõnede jõudlust ja käsitlemist.
    • Tüübi järeldused jälgivad erinevaid efekte – kõrvalmõjusid ja mitte-kukkumist. Arvesse võetakse pidevat levikut, mis parandab oluliselt kompileerimisaja jõudlust. Mõnel juhul jäetakse näiteks käitusajal kõrvale kõned funktsioonidele, mida ei saa lisada, kuid mis tulemust ei mõjuta. Efektide reeglid saab käsitsi üle kirjutada, kasutades makro Base.@assume_effects.
    • Eelkompileerimine (selgesõnaliste eelkompileerimisjuhiste või määratud töökoormustega) salvestab nüüd rohkem tüübimääratletud koodi, mille tulemuseks on kiirem esmakordne käivitamine. Kõik uued meetodi/tüübi kombinatsioonid, mida teie pakett vajab, olenemata sellest, kus need meetodid määratleti, saab nüüd eelkompileerimisfaili vahemällu salvestada, kui neid kutsub teie paketti kuuluv meetod.
  • Muudatused käsurea suvandites
    • @inbounds deklaratsioonide jälgimise vaikekäitumine on nüüd "--check-bounds=yes|no|auto" automaatne suvand.
    • Uus suvand "--riba-metadata", et eemaldada süsteemipildi loomisel dokumendistringid, allika asukohateave ja kohalike muutujate nimed.
    • Uus valik "--strip-ir", mis võimaldab kompilaatoril eemaldada süsteemipildi loomisel lähtekoodi vahepealse esituse. Saadud pilt töötab ainult siis, kui kasutatakse "--compile=all" või kui kogu vajalik kood on eelnevalt kompileeritud.
    • Kui failinime asemel on määratud märk "-", loetakse käivitatav kood standardsest sisendvoost.
  • Muudatused mitme lõime toe jaoks
    • Threads.@threads kasutab vaikimisi uut ajastamissuvandit :dynamic, mis erineb eelmisest režiimist selle poolest, et iteratsioonid ajastatakse dünaamiliselt saadaolevate töölõimede vahel, mitte ei määrata igale lõimele. See režiim võimaldab paremini jaotada pesastatud silmuseid @spawn ja @threads.
  • Uued raamatukogu funktsioonid
    • everysplit(str), et käivitada split(str) mitu korda.
    • allequal(itr), et testida, kas kõik iteraatori elemendid on võrdsed.
    • kõvalinki (src, dst) saab kasutada kõvade linkide loomiseks.
    • setcpuaffinity(cmd, cpus), et määrata protsessori tuuma afiinsus käivitatud protsessidega.
    • diskstat(path=pwd()), et saada ketta statistikat.
    • Uus @showtime makro, et kuvada nii hinnatav rida kui ka @time aruanne.
    • LazyString ja laisa"str" makro on lisatud, et toetada veateadete laisat koostamist veateedel.
    • Parandatud samaaegsusprobleem Dictis ja muudes tuletatud objektides, nagu võtmed (::Dict), väärtused (::Dict) ja Set. Iteratsioonimeetodeid saab nüüd kutsuda sõnastikus või komplektis, kui puuduvad kõned, mis muudavad sõnastikku või komplekti.
    • @time ja @timev omavad nüüd valikulist kirjeldust, mis võimaldab teil näiteks ajaaruannete allikat märkida. @time "Foo hindamine" foo().
    • vahemik on ainsa märksõnaargumendina kas stopp või pikkus.
    • täpsus ja setprecision aktsepteerivad nüüd märksõnana baasi
    • TCP-sokliobjektid pakuvad nüüd sulgemismeetodit ja toetavad poolavatud režiimi kasutamist.
    • extrema aktsepteerib nüüd init argumenti.
    • Iterators.countfrom aktsepteerib nüüd mis tahes tüüpi, mis määratleb + meetodi.
    • @time jagab nüüd % muudetud tüüpidega meetodite ümberkompileerimiseks kulutatud ajast.
  • Standardsed raamatukogu muudatused
    • Võtmed väärtusega Mitte midagi eemaldatakse nüüd addenv keskkonnast.
    • Iterators.reverse (ja seega ka viimane) toetab iga rida.
    • Teatud tüüpi vahemike pikkusfunktsioon ei kontrolli enam täisarvude ületäitumist. Saadaval on uus funktsioon checked_length, mis sisaldab bitiülekande juhtimisloogikat. Vajadusel kasutage vahemiku tüübi loomiseks faili SaferIntegers.jl.
    • Iterators.Reverse iteraator rakendab võimalusel iga indeksi ümberpööramist.
  • Paketihaldur
    • Uued ⌃ ja ⌅ indikaatorid oleku „pkg>” pakettide kõrval, mille jaoks on saadaval uued versioonid. ⌅ näitab, et uusi versioone ei saa installida.
    • Uus aegunud::Bool argument Pkg.status (--aegunud või -o REPL-režiimis), et näidata teavet eelmiste versioonide pakettide kohta.
    • Uus compat::Bool argument Pkg.status (--compat või -c REPL režiimis), et näidata kõiki [compat] kirjeid failis Project.toml.
    • Uus "pkg>compat" (ja Pkg.compat) režiim projekti ühilduvuse kirjete seadistamiseks. Pakub interaktiivset redaktorit "pkg>compat" kaudu või otsest kirje juhtimist "pkg>Foo 0.4,0.5" kaudu, mis saab laadida praeguseid kirjeid vahekaardi täitmise kaudu. See tähendab, et "pkg> compat Foo" värskendatakse automaatselt väärtuseks "pkg> Foo 0.4,0.5", nii et olemasolevat kirjet saab redigeerida.
    • Pkg proovib nüüd pakette paketiserverist alla laadida ainult siis, kui server jälgib paketti sisaldavat registrit.
    • Pkg.instantiate annab nüüd hoiatuse, kui Project.toml ei ole sünkroonis failiga Manifest.toml. See põhineb manifesti lahendamisel projekti deps-kirjete ja ühilduvate kirjete (teisi välju ignoreeritakse) räsi põhjal, nii et projekti Project.toml deps- või ühilduvate kirjete muudatusi saab tuvastada ilma uuesti lahendamata.
    • Kui "pkg>add" ei leia antud nimega paketti, soovitab see nüüd sarnase nimega pakette, mida saab lisada.
    • Manifestis talletatud julia versioon ei sisalda enam järgunumbrit, mis tähendab, et põhiversioon kirjutatakse nüüd kui 1.9.0-DEV.
    • Testi katkestamine "pkg>" tuvastatakse nüüd järjepidevamalt ja see tagastatakse õigesti REPL-i.
  • InteractiveUtils
    • Uus makro @time_imports, mis annab aru pakettide importimisele kulunud ajast ja nende sõltuvustest, tuues esile kompileerimis- ja ümberkompileerimisaja protsendina impordist.
  • Lineaaralgebra
    • BLAS-i alammoodul toetab nüüd 2. taseme BLAS spr!-funktsioone.
    • LinearAlgebra.jl standardteek on nüüd SparseArrays.jl-st täiesti sõltumatu nii lähtekoodi kui ka üksuse testimise vaatenurgast. Selle tulemusena ei tagastata enam (kaudselt) hõredaid massiive LinearAlgebra meetoditega, mida rakendatakse baas- või LinearAlgebra objektidele. Eelkõige toob see kaasa järgmised murrangulised muudatused:
      • Spetsiaalsete "hõredate" maatriksite (nt diagonaal) abil konkatenatsioonid tagastavad nüüd tihedad maatriksid; Selle tulemusena on getproperty kutsetega loodud SVD-objektide D1 ja D2 väljad nüüd tihedad maatriksid.
      • Sarnane (::SpecialSparseMatrix, ::Type, ::Dims) meetod tagastab tiheda nullmaatriksi. Selle tulemusena toovad kahe-, kolme- ja sümmeetriliste kolmikmaatriksite korrutised omavahel kaasa tiheda maatriksi. Lisaks sellele nurjub (mittestaatilistest) maatriksitest kolme argumendiga sarnaste maatriksite loomine spetsiaalsetest "hõredatest" maatriksitest "null(::Type{Matrix{T}})" tõttu.
  • Printf
    • %s ja %c kasutavad nüüd laiuse vormindamiseks argumenti textwidth.
  • profiil
    • Protsessori koormuse profileerimine salvestab nüüd metaandmeid, sealhulgas lõime ja ülesandeid. Profile.print() sisaldab uut argumenti groupby, mis võimaldab filtreerimise tagamiseks rühmitada lõime, ülesandeid või alamlõime/ülesandeid, ülesandeid/lõime ning lõime ja ülesannete argumente. Lisaks esitatakse kasutusprotsent nüüd kas üldise või lõime kohta, olenevalt sellest, kas lõime on igas proovis jõude või mitte. Profile.fetch() sisaldab vaikimisi uusi metaandmeid. Tagasiühilduvuse tagamiseks profiiliandmete välistarbijatega saab selle välistada, sisestades käsu include_meta=false.
    • Uus moodul Profile.Allocs võimaldab teil profileerida mälueraldisi. Iga mälueraldise tüübi ja suuruse pinujälg salvestatakse ning argument sample_rate võimaldab konfigureeritava arvu jaotusi vahele jätta, vähendades jõudluse üldkulusid.
    • Fikseeritud kestusega CPU profileerimist saab kasutaja nüüd ülesannete täitmise ajal käivitada ilma profiili esmalt laadimata ja aruanne kuvatakse töötamise ajal. MacOS-is ja FreeBSD-s vajutage ctrl-t või helistage SIGINFO-le. Teiste platvormide puhul aktiveeri SIGUSR1, st. % kill -USR1 $julia_pid. See pole Windowsis saadaval.
  • VASTUS
    • RadioMenu toetab nüüd täiendavaid kiirklahve suvandite otseseks valimiseks.
    • Jada "?(x, y", millele järgneb TAB vajutamine kuvab kõik meetodid, mida saab kutsuda argumentidega x, y, .... (Ees olev tühik takistab abirežiimi sisenemist.) "MyModule.?(x, y " piirab otsingut ainult "MyModule". TAB vajutamine nõuab, et vähemalt üks argument oleks täpsemat tüüpi kui Any. Või kasutage ühilduvate meetodite lubamiseks TAB asemel SHIFT-TAB.
    • Uus globaalne muutuja err võimaldab teil saada uusima erandi, mis sarnaneb ans-i käitumisega viimase vastusega. Err sisestamisel prinditakse erandi teave uuesti.
  • SparseArrays
    • Teisaldas SparseArraysi koodi Julia hoidlast välisesse SparseArrays.jl hoidlasse.
    • Uued liitmisfunktsioonid sparse_hcat, sparse_vcat ja sparse_hvcat tagastavad SparseMatrixCSC tüübi olenemata sisendargumentide tüübist. See muutus vajalikuks maatriksite liimimise mehhanismi ühtlustamiseks pärast koodide LinearAlgebra.jl ja SparseArrays.jl eraldamist.
  • Raie
    • Standardsed logimistasemed BelowMinLevel, Silumine, Info, Hoiatus, Viga ja AboveMaxLevel eksporditakse nüüd standardsest logimise teegist.
  • Unikood
    • Lisatud on funktsioon isequal_normalized, et kontrollida Unicode'i samaväärsust ilma normaliseeritud stringe selgesõnaliselt konstrueerimata.
    • Funktsioon Unicode.normalize aktsepteerib nüüd märksõna charttransform, mida saab kasutada kohandatud märkide vastendamiseks, ja funktsioon Unicode.julia_chartransform on samuti ette nähtud vastenduse taasesitamiseks, mida kasutatakse Julia parser identifikaatorite normaliseerimiseks.
  • test
    • '@test_throws "some message" triggers_error()' abil saab nüüd testida, kas kuvatav veatekst sisaldab tõrget "mingi teade", olenemata konkreetsest erandi tüübist. Toetatud on ka regulaaravaldised, stringide loendid ja sobitusfunktsioonid.
    • @testset foo() saab nüüd kasutada antud funktsioonist testkomplekti loomiseks. Testjuhtumi nimi on kutsutava funktsiooni nimi. Väljakutsutav funktsioon võib sisaldada @test ja muid @testset määratlusi, sealhulgas muude funktsioonide kutsumiseks, salvestades samal ajal kõik vahetesti tulemused.
    • TestLogger ja LogRecord eksporditakse nüüd standardsest testiteegist.
  • Levitatakse
    • SSHManager toetab nüüd töölõime koos csh/tcsh-mähisega meetodi addprocs() ja parameetri shell=:csh kaudu.
  • Muud muudatused
    • GC.enable_logging(true) saab kasutada iga prügikoristustoimingu logimiseks kogutud mälu aja ja mahuga.

Allikas: opennet.ru

Lisa kommentaar