Ohjelmointikieli Julia 1.9 saatavilla

Julia 1.9 -ohjelmointikielen julkaisu on julkaistu, 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.9:ssä:

  • Uusia kieliominaisuuksia
    • Salli tehtävien tekeminen toisessa moduulissa käyttämällä "setproperty!(::Module, ::Symbol, x)".
    • Useat tehtävät, jotka eivät ole lopullisessa asemassa, ovat sallittuja. Esimerkiksi merkkijono "a, b…, c = 1, 2, 3, 4" käsitellään muodossa "a = 1; b…, = 2, 3; c = 4". Tämä käsitellään Base.split_rest-ohjelman kautta.
    • Yksimerkkiset literaalit tukevat nyt samaa syntaksia kuin merkkijonoliteraalit; nuo. Syntaksi voi edustaa virheellisiä UTF-8-sekvenssejä Char-tyypin sallimalla tavalla.
    • Lisätty tuki Unicode 15 -spesifikaatiolle.
    • Sisäkkäisiä monikoiden ja nimettyjen merkkijonojen yhdistelmiä voidaan nyt käyttää tyyppiparametreina.
    • Uudet sisäänrakennetut funktiot "getglobal(::Module, ::Symbol[, order])" ja "setglobal!(::Module, ::Symbol, x[, order])" yksinomaan globaalien muuttujien lukemiseen ja kirjoittamiseen. Getglobal-menetelmää tulisi nyt suosia getfield-menetelmään verrattuna globaaleihin muuttujiin pääsyssä.
  • Muutoksia kielessä
    • Versiossa 1.7 käyttöön otettu "@invoke" -makro on nyt viety ja käytettävissä. Lisäksi se käyttää nyt "Core.Typeof(x)"-menetelmää "Any":n sijaan siinä tapauksessa, että tyyppimerkintä jätetään pois argumentista "x". Tämä on tarpeen sen varmistamiseksi, että argumentteina välitetyt tyypit käsitellään oikein.
    • "invokelatest"-funktion ja "@invokelatest"-makron vienti on otettu käyttöön versiossa 1.7.
  • Kääntäjän/ajonaikaisen parannukset
    • Merkittävästi lyhentynyt aika ensimmäiseen suoritukseen (TTFX - Aika ensimmäiseen suoritukseen). Paketin esikääntäminen tallentaa nyt alkuperäisen koodin "pkgimageen", mikä tarkoittaa, että esikäännösprosessin luomaa koodia ei tarvitse kääntää uudelleen paketin lataamisen jälkeen. Pkgimages-tilan käyttö voidaan poistaa käytöstä "--pkgimages=no"-vaihtoehdolla.
    • Tyyppipäätelmän tunnettu neliöllisen monimutkaisuuden ongelma on korjattu, ja päättely kuluttaa vähemmän muistia. Jotkut reunatapaukset, joissa on automaattisesti luotuja pitkiä funktioita (kuten ModelingToolkit.jl, jossa on osittaisdifferentiaaliyhtälöt ja suuret kausaaliset mallit), käännetään paljon nopeammin.
    • Puhelut, joissa on argumentteja ilman konkreettisia tyyppejä, voivat nyt olla liitosjakoa varten optimoituja injektiota tai staattista resoluutiota varten, vaikka lähetettäväksi olisi useita erityyppisiä ehdokkaita. Tämä voi parantaa suorituskykyä tietyissä tilanteissa, joissa objektityypit eivät ole täysin staattisesti ratkaistu, ratkaisemalla staattisesti @nospecialize-d-kutsusivustot ja välttämällä uudelleenkääntämisen.
    • Kaikki @pure-makron käyttötavat Base-moduulissa on korvattu Base.@assume_effectsillä.
    • Kutsut invoke(f, invokesig, args...), joiden tyypit ovat vähemmän tarkkoja kuin tavallisesti f(args...):lle, eivät enää aiheuta paketin uudelleenkääntämistä.
  • Muutokset komentorivin asetuksiin
    • Linuxissa ja Windowsissa "--threads=auto" -vaihtoehto yrittää nyt määrittää käytettävissä olevan prosessorien määrän suorittimen affiniteetin perusteella, joka on tavallisesti HPC- ja pilviympäristöissä asetettu maski.
    • Parametri “--math-mode=fast” on poissa käytöstä, minkä sijaan on suositeltavaa käyttää “@fastmath”-makroa, jossa on selkeä semantiikka.
    • Vaihtoehto "--threads" on nyt muodossa "auto | N[,auto|M]", jossa M osoittaa luotavien interaktiivisten säikeiden lukumäärän (tällä hetkellä automaattinen tarkoittaa 1:tä).
    • Lisätty vaihtoehto "—heap-size-hint=" ", joka asettaa kynnyksen, jonka jälkeen aktiivinen roskienkeruu alkaa. Koko voidaan määrittää tavuina, kilotavuina (1000 kt), megatavuina (300 MB) tai gigatavuina (1,5 Gt).
  • Muutoksia monisäikeisyydessä
    • "Threads.@spawn" sisältää nyt valinnaisen ensimmäisen argumentin, jonka arvo on ":default" tai ":interactive". Interaktiivinen tehtävä vaatii alhaisen vasteviiveen, ja se on suunniteltu lyhyeksi tai suoritettavaksi usein. Interaktiiviset tehtävät suoritetaan interaktiivisissa säikeissä, jos ne on määritetty Juliaa käynnistettäessä.
    • Julia-ajonajan ulkopuolella (kuten C:stä tai Javasta) käynnissä olevat säikeet voivat nyt kutsua Julia-koodia käyttämällä "jl_adopt_thread". Tämä tapahtuu automaattisesti, kun syötät Julia-koodin "cfunction"- tai "@ccallable"-tulopisteen kautta. Tämän seurauksena säikeiden määrä voi nyt muuttua suorituksen aikana.
  • Kirjaston uudet toiminnot
    • Uusi toiminto "Iterators.flatmap".
    • Uusi funktio "pkgversion(m::Module)" saadaksesi paketin version, joka latasi tietyn moduulin, samanlainen kuin "pkgdir(m::Module)".
    • Uusi funktio "pino(x)", joka yleistää "reduce(hcat, x::Vector{<:Vector})" mihin tahansa ulottuvuuteen ja sallii minkä tahansa iteraattorien iteraattorin. "Stack(f, x)"-menetelmä yleistää "mapreduce(f, hcat, x)" ja on tehokkaampi.
    • Uusi makro allokoidun muistin "@allocations" analysointiin, joka on samanlainen kuin "@allocated", paitsi että se palauttaa muistin varausten määrän varatun muistin kokonaiskoon sijaan.
  • Kirjaston uusia ominaisuuksia
    • "RoundFromZero" toimii nyt muissa tyypeissä kuin "BigFloat".
    • "Dict" voidaan nyt pienentää manuaalisesti käyttämällä "sizehint!"
    • "@time" määrittää nyt erikseen virheellisten menetelmien uudelleenkääntämiseen käytetyn ajan prosenttiosuuden.
  • Muutoksia vakiokirjastoon
    • Korjattu Dictin ja muiden johdettujen objektien, kuten avainten (::Dict), arvojen (::Dict) ja Setin, iterointimenetelmien samanaikaisuusongelma. Näitä iterointimenetelmiä voidaan nyt kutsua Dictissä tai Setissä rinnakkain rajoittamattomalla määrällä säikeitä, kunhan sanakirjaa tai joukkoa ei muuteta.
    • Predikaattifunktion "!f" kieltäminen palauttaa nyt yhdistelmäfunktion "(!) ∘ f" anonyymin funktion sijaan.
    • Dimension slice -funktiot toimivat nyt useissa ulottuvuuksissa: "eachslice", "eachrow" ja "eachcol" palauttavat "Slices"-objektin, joka mahdollistaa lähettämisen tehokkaampien menetelmien tarjoamiseksi.
    • Lisätty "@kwdef" -makro julkiseen sovellusliittymään.
    • Korjattu "fld1"-toimintojen järjestyksen ongelma.
    • Lajittelu on nyt aina aikavakaa (QuickSort on suunniteltu uudelleen).
    • "Base.splat" on nyt viety. Paluuarvo on "Base.Splat"-tyyppinen mieluummin kuin anonyymi funktio, joten se voidaan tulostaa hienosti.
  • Paketinhallinta
    • "Paketin laajennukset": Tuki koodinpätkän lataamiseen muista Julia-istunnossa ladatuista paketeista. Sovellus on samanlainen kuin "Requires.jl"-paketti, mutta esikäännös ja asetusten yhteensopivuus ovat tuettuja.
  • LinearAlgebra-kirjasto
    • Sekaannusvaaran vuoksi elementtikohtaisen jaon kanssa poistettiin "a/b" ja "b\a" menetelmät skalaarilla "a" ja vektorilla "b", jotka vastasivat "a * pinv(b)".
    • BLAS- ja LAPACK-soitto käyttää nyt "libblastrampolinea (LBT)". OpenBLAS on oletuksena, mutta järjestelmäkuvan rakentamista muiden BLAS/LAPACK-kirjastojen kanssa ei tueta. Sen sijaan on suositeltavaa käyttää LBT-mekanismia korvaamaan BLAS/LAPACK toisella olemassa olevalla kirjastojoukolla.
    • "lu" tukee uutta matriisin rotaatiostrategiaa "RowNonZero()", joka valitsee ensimmäisen nollasta poikkeavan kiertoelementin käytettäväksi uusien aritmeettisten tyyppien kanssa ja koulutustarkoituksiin.
    • "normalisoi(x, p=2)" tukee nyt mitä tahansa normalisoitua vektoriavaruutta "x", mukaan lukien skalaarit.
    • BLAS-säikeiden oletusmäärä on nyt yhtä suuri kuin CPU-säikeiden lukumäärä ARM-arkkitehtuureissa ja puolet CPU-säikeiden lukumäärästä muissa arkkitehtuureissa.
  • Printf: Muokatut virheilmoitukset väärin muotoilluille merkkijonoille luettavuuden parantamiseksi.
  • Profiili: Uusi toiminto "Profile.take_heap_snapshot(file)", joka kirjoittaa tiedoston JSON-pohjaisessa ".heapsnapshot"-muodossa, jota Chrome tukee.
  • Satunnainen: randn ja randexp toimivat nyt kaikilla AbstractFloat-tyypeillä, jotka määrittelevät randin.
  • VASTAA
    • "Alt-e"-näppäinyhdistelmän painaminen avaa nyt editorin nykyisen syötteen. Sisältö (jos sitä on muokattu) suoritetaan, kun poistut editorista.
    • Nykyistä REPL:ssä aktiivista moduulikontekstia voidaan muuttaa (oletusarvoisesti Main) käyttämällä toimintoa "REPL.activate(::Module)" tai syöttämällä moduuli REPL:ään ja painamalla näppäinyhdistelmää "Alt-m".
    • "Numeroitu kehote" -tila, joka tulostaa numerot jokaiselle tulolle ja ulostulolle ja tallentaa pisteytetyt tulokset Out-kenttään, voidaan aktivoida käyttämällä "REPL.numbered_prompt!()".
    • Välilehden viimeistely näyttää käytettävissä olevat avainsanaargumentit.
  • SuiteSparse: "SuiteSparse"-ratkaisijan koodi siirretty kohteeseen "SparseArrays.jl". "SuiteSparse.jl" vie nyt ratkaisijat uudelleen.
  • SparseArrays
    • "SuiteSparse"-ratkaisijat ovat nyt saatavilla "SparseArrays"-alimoduuleina.
    • UMFPACK- ja CHOLMOD-kierteiden suojaustiloja on parannettu poistamalla globaaleja muuttujia ja käyttämällä lukkoja. Monisäikeinen "ldiv!" UMFPACK-objektit voidaan nyt suorittaa turvallisesti.
    • Kokeellisen funktion "SparseArrays.allowscalar(::Bool)" avulla voit poistaa käytöstä tai ottaa käyttöön harvan taulukon skalaari-indeksoinnin. Tämä toiminto on suunniteltu havaitsemaan "SparseMatrixCSC"-objektien satunnainen skalaariindeksointi, joka on yleinen suorituskykyongelmien lähde.
  • Uusi vikasietotila testiohjelmille, joka keskeyttää testiajon ennenaikaisesti vian tai virheen sattuessa. Aseta joko "@testset kwarg failfast=true" tai "export JULIA_TEST_FAILFAST=true". Tämä on joskus tarpeen CI-ajoissa, jotta virheilmoitukset saadaan aikaisin.
  • Päivämäärät: Tyhjiä merkkijonoja ei jäsennetä enää väärin kelvollisiksi "DateTime", "Dates" tai "Times"-arvoiksi, ja sen sijaan ne heittävät "ArgumentError"-ilmoituksen rakentajiin ja jäsennykseen, kun taas "tryparse" ei palauta mitään.
  • Paketti jaettu
    • Paketin kokoonpano (aktiivinen projekti, "LOAD_PATH", "DEPOT_PATH") levitetään nyt lisättäessä paikallisia työprosesseja (esim. käyttämällä "addprocs(N::Int)" tai komentorivin lippua "--procs=N").
    • "addprocs" paikallisille työntekijäprosesseille hyväksyy nyt "env"-nimisen argumentin välittääkseen ympäristömuuttujat työntekijäprosesseille.
  • Unicode: "graphemes(s, m:n)" palauttaa alimerkkijonon m:nnestä n:nneksi grafeemiin "s":ssä.
  • DelimtedFiles-paketti on poistettu järjestelmäkirjastoista, ja se jaetaan nyt erillisenä pakettina, joka on erikseen asennettava, jotta sitä voidaan käyttää.
  • Ulkoiset riippuvuudet
    • Linuxissa libstdc++-järjestelmäkirjaston versio tunnistetaan automaattisesti, ja jos se on uudempi, se ladataan. Vanha libstdc++ sisäänrakennettu latauskäyttäytyminen järjestelmäversiosta riippumatta voidaan palauttaa asettamalla ympäristömuuttuja "JULIA_PROBE_LIBSTDCXX=0".
    • Poistettu "RPATH" julia-binaarista, joka voi rikkoa Linuxin kirjastot, jotka eivät pysty määrittelemään "RUNPATH"-muuttujaa.
    • Työkalun parannukset: "MethodError" ja menetelmät (esimerkiksi "methods(my_func)") on nyt muotoiltu ja väritetty menetelmien tulostuksen periaatteen mukaisesti pinojäljissä.

    Lähde: opennet.ru

Lisää kommentti