Julia 1.8 -ohjelmointikielen julkaisu

Julia 1.8 -ohjelmointikielen julkaisu on saatavilla, ja siinä yhdistyvät sellaiset ominaisuudet kuin korkea suorituskyky, tuki dynaamiselle kirjoittamiselle ja sisäänrakennetut työkalut rinnakkaisohjelmointiin. Julian syntaksi on lähellä MATLABia, lainaten joitakin elementtejä Rubysta ja Lispistä. Merkkijonojen käsittelymenetelmä muistuttaa Perliä. Projektikoodia jaetaan MIT-lisenssillä.

Kielen tärkeimmät ominaisuudet:

  • Korkea suorituskyky: yksi projektin keskeisistä tavoitteista on saavuttaa suorituskykyä lähellä C-ohjelmia. Julia-kääntäjä perustuu LLVM-projektin työhön ja tuottaa tehokkaan alkuperäisen konekoodin useille kohdealustoille;
  • Tukee erilaisia ​​ohjelmointiparadigmoja, mukaan lukien olio- ja toiminnallisen ohjelmoinnin elementit. Vakiokirjasto tarjoaa mm. toimintoja asynkroniselle I/O:lle, prosessin ohjaukselle, lokikirjaukselle, profiloinnille ja pakettien hallintaan.
  • Dynaaminen kirjoittaminen: kieli ei vaadi nimenomaista tyyppimäärittelyä muuttujille, kuten komentosarjaohjelmointikielet. Tuettu interaktiivinen tila;
  • Valinnainen kyky nimenomaisesti määrittää tyypit;
  • Syntaksi, joka on ihanteellinen numeeriseen laskemiseen, tieteelliseen laskemiseen, koneoppimiseen ja tietojen visualisointiin. Tuki monille numeerisille tietotyypeille ja työkaluille laskelmien rinnakkaisuun.
  • Mahdollisuus kutsua toimintoja suoraan C-kirjastoista ilman lisäkerroksia.

Suuret muutokset Julia 1.8:ssa:

  • Uusia kieliominaisuuksia
    • Muuttuvan rakenteen kentät voidaan nyt merkitä vakioiksi niiden muuttamisen estämiseksi ja optimoinnin mahdollistamiseksi.
    • Yleisiin muuttujiin voidaan lisätä tyyppimerkintöjä.
    • Tyhjät n-ulotteiset taulukot voidaan luoda käyttämällä useita puolipisteitä hakasulkeissa, esimerkiksi "[;;;]" luo 0x0x0 taulukon.
    • Try-lohkoissa voi nyt valinnaisesti olla else-lohko, joka suoritetaan välittömästi päärungon jälkeen, jos virheitä ei ole heitetty.
    • @inline ja @noinline voidaan sijoittaa funktion runkoon, jolloin voit merkitä anonyymin funktion.
    • @inline ja @noinline voidaan nyt soveltaa funktioon puhelusivustossa tai lohkossa pakottaaksesi vastaavat funktiokutsut sisällyttämään (tai jättämään ne).
    • ∀, ∃ ja ∄ ovat sallittuja tunnistemerkeinä.
    • Lisätty tuki Unicode 14.0.0 -spesifikaatiolle.
    • Metodilla Module(:name, false, false) voidaan luoda moduuli, joka ei sisällä nimiä, ei tuo Basea tai Corea eikä sisällä viittausta itseensä.
  • Muutoksia kielessä
    • Äskettäin luoduissa Task-objekteissa (@spawn, @async jne.) on nyt world_age emotehtävän menetelmille, kun ne on luotu, mikä mahdollistaa optimoidun suorituksen. Edellinen aktivointivaihtoehto on käytettävissä Base.invokelatest-menetelmällä.
    • Unicode-balansoidut kaksisuuntaiset muotoiluohjeet ovat nyt kiellettyjä merkkijonoissa ja kommenteissa lisäysten välttämiseksi.
    • Base.ifelse on nyt määritelty yleiseksi funktioksi eikä sisäänrakennetuksi, mikä mahdollistaa pakettien laajentamisen sen määritelmään.
    • Jokainen globaalin muuttujan määritys käy nyt ensin läpi muunnoskutsun (Any, x) tai convert(T, x), jos globaalin muuttujan on ilmoitettu olevan tyyppiä T. Ennen kuin käytät globaaleja muuttujia, varmista, että invariantti convert(Any , x) === x on aina tosi, muuten se voi johtaa odottamattomaan toimintaan.
    • Sisäänrakennetut funktiot ovat nyt samanlaisia ​​kuin yleiset funktiot, ja ne voidaan ohjelmoida menetelmien avulla.
  • Kääntäjän/ajonaikaisen parannukset
    • Käynnistysaika lyheni noin 25 %.
    • LLVM-pohjainen kääntäjä on erotettu ajonaikaisesta kirjastosta uudeksi kirjastoksi, libjulia-codegen. Se ladataan oletusarvoisesti, joten normaalikäytön aikana ei pitäisi tapahtua muutoksia. Käyttöönotuksissa, joissa ei tarvita kääntäjää (esimerkiksi järjestelmäotokset, joissa kaikki tarvittava koodi on esikäännetty), tämä kirjasto (ja sen LLVM-riippuvuus) voidaan yksinkertaisesti jättää pois.
    • Ehdollisen tyypin päättely on nyt mahdollista välittämällä argumentti menetelmälle. Esimerkiksi Base.ifelse(isa(x, Int) x, 0) palauttaa ::Int, vaikka x:n tyyppi olisi tuntematon.
    • SROA (Scalar Replacement of Aggregates) on parannettu: eliminoi getfield-kutsut pysyvillä globaaleilla kentillä, eliminoi muuttuvat rakenteet alustamattomilla kentillä, parantaa sisäkkäisten getfield-kutsujen suorituskykyä ja käsittelyä.
    • Tyyppipäätelmä seuraa erilaisia ​​vaikutuksia – sivuvaikutuksia ja ei-pudottamista. Jatkuva eteneminen otetaan huomioon, mikä parantaa merkittävästi käännösaikaista suorituskykyä. Joissakin tapauksissa, esimerkiksi kutsut funktioille, joita ei voida sisällyttää, mutta jotka eivät vaikuta tulokseen, hylätään suorituksen aikana. Tehostesäännöt voidaan korvata manuaalisesti Base.@assume_effects-makron avulla.
    • Esikäännös (selkeillä esikäännöskäskyillä tai määritetyillä työkuormilla) säästää nyt enemmän tyyppimääriteltyä koodia, mikä nopeuttaa ensimmäistä suoritusta. Kaikki pakettisi tarvitsemat uudet menetelmä-/tyyppiyhdistelmät, riippumatta siitä, missä menetelmät on määritetty, voidaan nyt tallentaa välimuistiin esikäännöstiedostoon, jos pakettiisi kuuluva menetelmä kutsuu niitä.
  • Muutokset komentorivin asetuksiin
    • @inbounds-ilmoitusten valvonnan oletuskäyttäytyminen on nyt automaattinen vaihtoehto kohdassa "--check-bounds=yes|no|auto".
    • Uusi "--strip-metadata" -vaihtoehto, jolla poistetaan dokumenttimerkkijonot, lähteen sijaintitiedot ja paikallisten muuttujien nimet järjestelmäkuvaa luotaessa.
    • Uusi vaihtoehto "--strip-ir", jonka avulla kääntäjä voi poistaa lähdekoodin väliesityksen järjestelmäkuvaa rakennettaessa. Tuloksena oleva kuva toimii vain, jos "--compile=all" on käytössä tai jos kaikki vaadittu koodi on esikäännetty.
    • Jos "-"-merkki määritetään tiedoston nimen sijaan, suoritettava koodi luetaan vakiosyöttövirrasta.
  • Monisäikeisen tuen muutokset
    • Threads.@threads käyttää oletusarvoisesti uutta ajoitusvaihtoehtoa :dynamic, joka eroaa edellisestä tilasta siinä, että iteraatiot ajoitetaan dynaamisesti käytettävissä olevien työsäikeiden kesken sen sijaan, että niitä määritettäisiin jokaiselle säikeelle. Tämä tila mahdollistaa sisäkkäisten silmukoiden paremman jakautumisen @spawn- ja @-säikeillä.
  • Kirjaston uudet toiminnot
    • everysplit(str) suorittaa split(str) useita kertoja.
    • allequal(itr) testaamaan, ovatko iteraattorin kaikki elementit samanarvoisia.
    • hardlink(src, dst) avulla voidaan luoda kovia linkkejä.
    • setcpuaffinity(cmd, cpus) asettaaksesi suorittimen ytimen affiniteetin käynnistetyille prosesseille.
    • diskstat(polku=pwd()) saadaksesi levytilastot.
    • Uusi @showtime-makro näyttää sekä arvioitavan rivin että @time-raportin.
    • LazyString ja lazy"str" Makro on lisätty tukemaan virheilmoitusten laiskaa rakentamista virhepoluille.
    • Korjattu samanaikaisuusongelma Dictissä ja muissa johdetuissa objekteissa, kuten avaimet (::Dict), arvot (::Dict) ja Set. Iterointimenetelmiä voidaan nyt kutsua sanakirjassa tai joukossa, kunhan ei ole kutsuja, jotka muokkaavat sanakirjaa tai joukkoa.
    • @timella ja @timev:llä on nyt valinnainen kuvaus, jonka avulla voit esimerkiksi merkitä aikaraporttien lähteen. @time "Arvioidaan foo" foo().
    • alue ottaa joko stopin tai pituuden ainoana avainsanaargumenttina.
    • tarkkuus ja setprecision hyväksyvät nyt perustan avainsanaksi
    • TCP-socket-objektit tarjoavat nyt closewrite-menetelmän ja tukevat puoliavoimen tilan käyttöä.
    • extrema hyväksyy nyt init-argumentin.
    • Iterators.countfrom hyväksyy nyt minkä tahansa tyypin, joka määrittää +-menetelmän.
    • @time nyt varaa % ajasta, joka kuluu menetelmien uudelleenkääntämiseen muuttuneilla tyypeillä.
  • Tavalliset kirjastomuutokset
    • Avaimet arvolla Mitään ei ole nyt poistettu ympäristöstä addenv.
    • Iterators.reverse (ja siksi last) tukee jokaista riviä.
    • Tiettyjen tyyppisten alueiden pituusfunktio ei enää tarkista kokonaislukujen ylivuotoa. Saatavilla on uusi toiminto, checked_length, joka sisältää bitinsiirron ohjauslogiikan. Muodosta aluetyyppi tarvittaessa käyttämällä SaferIntegers.jl-tiedostoa.
    • Iterators.Reverse-iteraattori toteuttaa jokaisen indeksin käännöksen, jos mahdollista.
  • Paketinhallinta
    • Uudet ⌃- ja ⌅-ilmaisimet "pkg>"-tilassa olevien pakettien vieressä, joille on saatavilla uusia versioita. ⌅ osoittaa, että uusia versioita ei voi asentaa.
    • Uusi vanhentunut::Bool-argumentti Pkg.status (--vanhentunut tai -o REPL-tilassa) näyttää tietoja aiempien versioiden paketeista.
    • Uusi compat::Bool-argumentti parametriin Pkg.status (--compat tai -c REPL-tilassa) näyttääksesi kaikki [compat]-merkinnät Project.toml-tiedostossa.
    • Uusi "pkg>compat" (ja Pkg.compat) -tila projektin yhteensopivuusmerkintöjen asettamiseen. Tarjoaa interaktiivisen editorin "pkg>compat":n kautta tai suoran tietueen ohjauksen "pkg>Foo 0.4,0.5" -sovelluksen kautta, joka voi ladata nykyiset tietueet välilehden avulla. Toisin sanoen "pkg> compat Foo" päivitetään automaattisesti muotoon "pkg> Foo 0.4,0.5", jotta olemassa olevaa merkintää voidaan muokata.
    • Pkg yrittää nyt ladata paketteja pakettipalvelimelta vain, jos palvelin valvoo paketin sisältävää rekisteriä.
    • Pkg.instantiate antaa nyt varoituksen, kun Project.toml ei ole synkronoitu Manifest.toml:n kanssa. Se tekee tämän projektin deps- ja compat-tietueiden tiivisteen perusteella (muut kentät jätetään huomioimatta) luettelossa sitä ratkaiseessaan, jotta kaikki Project.toml-deps- tai compat-tietueisiin tehdyt muutokset voidaan havaita ilman uudelleenratkaisua.
    • Jos "pkg>add" ei löydä pakettia tietyllä nimellä, se ehdottaa nyt samannimistä paketteja, jotka voidaan lisätä.
    • Luetteloon tallennettu julia-versio ei enää sisällä koontiversion numeroa, mikä tarkoittaa, että master kirjoitetaan nyt nimellä 1.9.0-DEV.
    • Testin keskeytys "pkg>" havaitaan nyt johdonmukaisemmin ja palautetaan oikein REPL:ään.
  • InteractiveUtils
    • Uusi @time_imports-makro raportoimaan pakettien ja niiden riippuvuuksien tuontiin käytetyn ajan, korostaen käännös- ja uudelleenkäännösaikaa prosenttiosuutena tuonnista.
  • Lineaarialgebra
    • BLAS-alimoduuli tukee nyt tason 2 BLAS spr!-toimintoja.
    • LinearAlgebra.jl-standardikirjasto on nyt täysin riippumaton SparseArrays.jl:stä sekä lähdekoodin että yksikkötestauksen näkökulmasta. Tämän seurauksena harvat taulukot eivät enää palauteta (implisiittisesti) LinearAlgebran menetelmillä, joita sovelletaan Base- tai LinearAlgebra-objekteihin. Tämä johtaa erityisesti seuraaviin murtaviin muutoksiin:
      • Konkatenaatiot, joissa käytetään erityisiä "harvoja" matriiseja (esim. diagonaali), palauttavat nyt tiheitä matriiseja; Tämän seurauksena getproperty-kutsujen luomien SVD-objektien D1- ja D2-kentät ovat nyt tiheitä matriiseja.
      • Samanlainen (::SpecialSparseMatrix, ::Type, ::Dims) -menetelmä palauttaa tiheän nollamatriisin. Tämän seurauksena kahden, kolmen ja symmetristen kolmikulmaisten matriisien tulot keskenään johtavat tiheän matriisin muodostumiseen. Lisäksi samankaltaisten matriisien rakentaminen kolmella argumentilla erityisistä "harvoista" matriiseista (ei-staattisista) matriiseista epäonnistuu nyt "zero(::Type{Matriisi{T}})" vuoksi.
  • Printf
    • %s ja %c käyttävät nyt textwidth-argumenttia leveyden muotoiluun.
  • Profiili
    • Suorittimen kuormituksen profilointi tallentaa nyt metatiedot, mukaan lukien säikeet ja tehtävät. Profile.print() sisältää uuden groupby-argumentin, jonka avulla voit ryhmitellä säikeitä, tehtäviä tai aliketjuja/tehtäviä, tehtäviä/säikeitä sekä säikeitä ja tehtäväargumentteja suodatuksen aikaansaamiseksi. Lisäksi käyttöprosentti raportoidaan nyt joko kokonaisuutena tai säiettä kohden riippuen siitä, onko säie vapaa vai ei kussakin näytteessä. Profile.fetch() sisältää uudet metatiedot oletuksena. Taaksepäin yhteensopivuuden varmistamiseksi profilointidatan ulkoisten kuluttajien kanssa se voidaan sulkea pois antamalla include_meta=false.
    • Uuden Profile.Allocs-moduulin avulla voit profiloida muistivarauksia. Kunkin muistivarauksen tyypistä ja koosta tallennetaan pinojäljitys, ja sample_rate -argumentti mahdollistaa määritettävän määrän varauksia ohituksen, mikä vähentää suorituskyvyn lisäkustannuksia.
    • Käyttäjä voi nyt suorittaa kiinteän keston CPU-profiloinnin tehtävien ollessa käynnissä lataamatta ensin profiilia, ja raportti näytetään suorituksen aikana. MacOS:ssa ja FreeBSD:ssä paina ctrl-t tai soita SIGINFO. Muille alustoille aktivoi SIGUSR1, ts. % kill -USR1 $julia_pid. Tämä ei ole käytettävissä Windowsissa.
  • VASTAA
    • RadioMenu tukee nyt muita pikanäppäimiä vaihtoehtojen suoraa valintaa varten.
    • Jakso "?(x, y" ja sen jälkeen SARKAIN-näppäin näyttää kaikki menetelmät, jotka voidaan kutsua argumenteilla x, y, .... (Etuvälilyönti estää sinua siirtymästä ohjetilaan.) "MyModule.?(x, y " rajoittaa haun "Omaan moduuliin". SARKAIN-näppäimen painaminen edellyttää, että vähintään yhden argumentin tyyppi on tarkempi kuin Any. Tai käytä SHIFT-TABia SARKAIMEN sijaan salliaksesi yhteensopivat menetelmät.
    • Uuden globaalin muuttujan err avulla voit saada uusimman poikkeuksen, joka on samanlainen kuin ans, jolla on viimeinen vastaus. Virheen syöttäminen tulostaa poikkeustiedot uudelleen.
  • SparseArrays
    • Siirrettiin SparseArrays-koodi Julia-arkistosta ulkoiseen SparseArrays.jl-tietovarastoon.
    • Uudet ketjutusfunktiot sparse_hcat, sparse_vcat ja sparse_hvcat palauttavat SparseMatrixCSC-tyypin riippumatta syöttöargumenttien tyypeistä. Tämä tuli tarpeelliseksi matriisien liimausmekanismin yhtenäistämiseksi LinearAlgebra.jl- ja SparseArrays.jl-koodien erottamisen jälkeen.
  • Hakkuu
    • Vakiokirjaustasot BelowMinLevel, Debug, Info, Warn, Error ja AboveMaxLevel viedään nyt tavallisesta lokikirjastosta.
  • Unicode
    • Lisätty isequal_normalized-funktio, jolla tarkistetaan Unicode-ekvivalenssi ilman, että normalisoituja merkkijonoja ei erikseen rakenneta.
    • Funktio Unicode.normalize hyväksyy nyt charttransform-avainsanan, jota voidaan käyttää mukautettujen merkkien kartoittamiseen, ja Unicode.julia_chartransform-funktiolla on myös toiminto, joka toistaa kuvauksen, jota käytetään, kun Julia-jäsentäjä normalisoi tunnisteita.
  • Testi
    • '@test_throws "joku viesti" triggers_error()' voidaan nyt käyttää testaamaan, sisältääkö näytettävä virheteksti "jokin viesti" -virheen, riippumatta poikkeuksen tyypistä. Myös säännöllisiä lausekkeita, merkkijonoluetteloita ja vastaavia toimintoja tuetaan.
    • @testset foo() voidaan nyt käyttää testijoukon luomiseen tietystä funktiosta. Testitapauksen nimi on kutsuttavan funktion nimi. Kutsuttu funktio voi sisältää @test ja muita @testset-määritelmiä, mukaan lukien kutsuja muille funktioille, samalla kun se tallentaa kaikki välitestitulokset.
    • TestLogger ja LogRecord on nyt viety vakiotestikirjastosta.
  • hajautettu
    • SSHManager tukee nyt työsäikeitä, joissa on csh/tcsh-kääre addprocs()-metodin ja shell=:csh-parametrin kautta.
  • Muut muutokset
    • GC.enable_logging(true) voidaan käyttää kirjaamaan jokainen roskankeräystoiminto kerätyn muistin ajan ja määrän mukaan.

Lähde: opennet.ru

Lisää kommentti