Programmeerimiskeel Julia 1.9 saadaval

Avaldatud on Julia 1.9 programmeerimiskeele väljalase, mis ühendab endas sellised omadused nagu kõrge 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.9:

  • Uued keelefunktsioonid
    • Lubage ülesandeid teha teises moodulis, kasutades "setproperty!(::Module, ::Symbol, x)".
    • Lubatud on mitu ülesannet, mis ei ole lõpppositsioonil. Näiteks stringi "a, b…, c = 1, 2, 3, 4" töödeldakse kui "a = 1; b…, = 2, 3; c = 4". Seda käsitletakse Base.split_rest kaudu.
    • Ühemärgilised literaalid toetavad nüüd sama süntaksit kui stringiliteraalid; need. Süntaks võib esindada kehtetuid UTF-8 jadasid, nagu seda lubab Char-tüüp.
    • Lisatud tugi Unicode 15 spetsifikatsioonile.
    • Tüübiparameetritena saab nüüd kasutada pesastatud kortereid ja nimega kortereid.
    • Uued sisseehitatud funktsioonid "getglobal(::Module, ::Symbol[, order])" ja "setglobal!(::Module, ::Symbol, x[, order])" ainult globaalsete muutujate lugemiseks ja kirjutamiseks. Globaalsetele muutujatele juurdepääsuks tuleks nüüd eelistada getglobali meetodit getfieldi meetodile.
  • Muutused keeles
    • Versioonis 1.7 kasutusele võetud "@invoke" makro on nüüd eksporditud ja kasutamiseks saadaval. Lisaks kasutab see nüüd meetodit "Core.Typeof(x)" mitte "Any" juhul, kui tüübimärkus jäetakse argumendi "x" jaoks välja. See on vajalik, et tagada argumentidena edastatud tüüpide korrektne töötlemine.
    • Versioonis 1.7 kasutusele võetud funktsiooni "invokelatest" ja makro "@invokelatest" eksport on lubatud.
  • Kompilaatori/käitusaja täiustused
    • Oluliselt vähenenud aeg esimese käivitamiseni (TTFX – aeg esimese täitmiseni). Paketi eelkompileerimine salvestab nüüd algkoodi "pkgimage", mis tähendab, et eelkompileerimise käigus genereeritud koodi ei pea pärast paketi laadimist uuesti kompileerima. Pkgimages režiimi kasutamise saab keelata, kasutades valikut "--pkgimages=no".
    • Tüübi järeldamise teadaolev ruutkeskmise keerukuse probleem on lahendatud ja järeldused kasutavad üldiselt vähem mälu. Mõned automaatselt genereeritud pikkade funktsioonidega servajuhtumid (nt ModelingToolkit.jl osaliste diferentsiaalvõrrandite ja suurte põhjuslike mudelitega) kompileeritakse palju kiiremini.
    • Konkreetsete tüüpideta argumentidega kõnesid saab nüüd liidu poolitamiseks optimeerida süstimise või staatilise eraldusvõime jaoks, isegi kui lähetamiseks on mitu erinevat tüüpi kandidaati. See võib parandada jõudlust teatud olukordades, kus objektitüübid pole staatiliselt täielikult lahendatud, lahendades staatiliselt @nospecialize-d kõnesaidid ja vältides uuesti kompileerimist.
    • Kõik @pure makro kasutusalad Base moodulis on asendatud Base.@ssume_effectsiga.
    • Väljakutsed invoke(f, invokesig, args...) jaoks vähem spetsiifiliste tüüpidega, kui tavaliselt kasutatakse f(args...) puhul, ei põhjusta enam paketi ümberkompileerimist.
  • Muudatused käsurea suvandites
    • Linuxis ja Windowsis püüab suvand "--threads=auto" nüüd määrata saadaoleva protsessorite arvu CPU afiinsuse põhjal, mis on tavaliselt HPC- ja pilvekeskkondades seatud mask.
    • Parameeter “--math-mode=fast” on keelatud, selle asemel on soovitatav kasutada makrot “@fastmath”, millel on selgelt määratletud semantika.
    • Valik "--threads" on nüüd vormingus "auto | N[,auto|M]", kus M tähistab loodavate interaktiivsete lõimede arvu (praegu tähendab automaatne 1).
    • Lisatud valik "—heap-size-hint=" ", mis määrab läve, millest alates algab aktiivne prügivedu. Suurust saab määrata baitides, kilobaitides (1000 KB), megabaitides (300 MB) või gigabaitides (1,5 GB).
  • Muutused mitmelõimenduses
    • "Threads.@spawn" sisaldab nüüd valikulist esimest argumenti väärtusega ":default" või ":interactive". Interaktiivne ülesanne nõuab madalat reageerimise latentsust ja see on kavandatud olema lühike või teostatav sageli. Interaktiivsed ülesanded töötavad interaktiivsetel lõimedel, kui need on Julia käivitamisel määratud.
    • Väljaspool Julia käitusaega töötavad lõimed (nt C-st või Javast) saavad nüüd kutsuda Julia koodi, kasutades "jl_adopt_thread". See juhtub automaatselt, kui sisestate Julia koodi "cfunction" või "@ccallable" sisestuspunkti kaudu. Selle tulemusena võib lõimede arv nüüd täitmise ajal muutuda.
  • Uued raamatukogu funktsioonid
    • Uus funktsioon "Iterators.flatmap".
    • Uus funktsioon "pkgversion(m::Module)", et saada antud mooduli laadinud paketi versioon, mis sarnaneb funktsiooniga "pkgdir(m::Module)".
    • Uus funktsioon "stack(x)", mis üldistab "redutse(hcat, x::Vector{<:Vector})" mis tahes dimensiooniks ja võimaldab mis tahes iteraatorite iteraatorit. "Stack(f, x)" meetod üldistab "mapreduce(f, hcat, x)" ja on tõhusam.
    • Uus makro eraldatud mälu analüüsimiseks "@allocations", mis on sarnane "@eraldistatud", välja arvatud see, et see tagastab eraldatud mälu kogumahu asemel mälueraldiste arvu.
  • Uued raamatukogu funktsioonid
    • "RoundFromZero" töötab nüüd muude kui "BigFloat" tüüpide jaoks.
    • "Dict" saab nüüd käsitsi vähendada, kasutades "sizehint!"
    • "@time" määrab nüüd eraldi kehtetute meetodite ümberkompileerimise aja protsendi.
  • Muudatused standardses teegis
    • Parandatud samaaegsusprobleem Dicti ja muude tuletatud objektide iteratsioonimeetodites, nagu võtmed (::Dict), väärtused (::Dict) ja Set. Neid iteratsioonimeetodeid saab nüüd kutsuda Dict või Set paralleelselt piiramatu arvu lõimede jaoks, kui puuduvad toimingud, mis muudavad sõnastikku või komplekti.
    • Predikaatfunktsiooni "!f" eitamine tagastab nüüd anonüümse funktsiooni asemel liitfunktsiooni "(!) ∘ f".
    • Dimensioonilõigu funktsioonid töötavad nüüd mitmes dimensioonis: "eachslice", "eachrow" ja "eachcol" tagastavad objekti "Slices", mis võimaldab tõhusamate meetodite pakkumiseks saata.
    • Lisati avalikule API-le makro "@kwdef".
    • Lahendatud on "fld1" toimingute järjekorra probleem.
    • Sorteerimine on nüüd alati ajaliselt stabiilne (QuickSort on ümber kujundatud).
    • "Base.splat" on nüüd eksporditud. Tagastusväärtus on pigem "Base.Splat" tüüpi kui anonüümne funktsioon, mis võimaldab seda kenasti väljastada.
  • Paketihaldur
    • "Pakilaiendid": toetus koodilõigu laadimiseks muudest Julia seansi ajal laaditud pakettidest. Rakendus sarnaneb paketiga "Requires.jl", kuid toetatakse eelkompileerimist ja seadete ühilduvust.
  • Lineaaralgebra raamatukogu
    • Segiajamise ohu tõttu elemendipõhise jagamisega eemaldati meetodid "a/b" ja "b\a" skalaariga "a" ja vektoriga "b", mis olid samaväärsed "a * pinv(b)".
    • BLAS-i ja LAPACK-i helistamine kasutab nüüd "libblastrampoline (LBT)". Vaikimisi pakutakse OpenBLAS-i, kuid süsteemipildi loomist teiste BLAS/LAPACK-teekidega ei toetata. Selle asemel on soovitatav kasutada LBT-mehhanismi, et asendada BLAS/LAPACK mõne muu olemasoleva teekikomplektiga.
    • "lu" toetab uut maatriksi pööramise strateegiat "RowNonZero()", mis valib esimese nullist erineva pööramise elemendi, mida kasutatakse uute aritmeetikatüüpidega ja treeningutel.
    • "normalize(x, p=2)" toetab nüüd mis tahes normaliseeritud vektorruumi "x", sealhulgas skalaare.
    • BLAS-lõimede vaikearv on nüüd võrdne ARM-arhitektuuride CPU-lõimede arvuga ja teiste arhitektuuride puhul poole CPU-lõimede arvuga.
  • Printf: valesti vormindatud stringide jaoks ümbertöödeldud veateated parema loetavuse tagamiseks.
  • Profiil: uus funktsioon "Profile.take_heap_snapshot(file)", mis kirjutab faili JSON-põhises ".heapsnapshot"-vormingus, mida Chrome toetab.
  • Juhuslik: randn ja randexp töötavad nüüd mis tahes AbstractFloat tüüpi jaoks, mis defineerib randi.
  • VASTUS
    • Klahvikombinatsiooni "Alt-e" vajutamine avab redaktoris praeguse sisendi. Sisu (kui seda on muudetud) käivitatakse redaktorist väljumisel.
    • Praegust REPL-is aktiivset mooduli konteksti saab muuta (vaikimisi Main) kasutades funktsiooni "REPL.activate(::Module)" või sisestades mooduli REPL-i ja vajutades klahvikombinatsiooni "Alt-m".
    • Režiimi "Nummerdatud viip", mis prindib iga sisendi ja väljundi jaoks numbrid ning salvestab hinnatud tulemused väljale Out, saab aktiveerida "REPL.numbered_prompt!()" abil.
    • Vahekaardi lõpetamine kuvab saadaolevad märksõnaargumendid.
  • SuiteSparse: teisaldati lahenduse "SuiteSparse" kood saidile "SparseArrays.jl". "SuiteSparse.jl" ekspordib nüüd lahendajad uuesti.
  • SparseArrays
    • "SuiteSparse" lahendajad on nüüd saadaval "SparseArrays" alammoodulitena.
    • Keermekaitserežiime UMFPACK ja CHOLMOD on täiustatud, kõrvaldades globaalsed muutujad ja kasutades lukke. Mitme lõimega "ldiv!" UMFPACK-objekte saab nüüd turvaliselt käivitada.
    • Eksperimentaalne funktsioon "SparseArrays.allowscalar(::Bool)" võimaldab teil keelata või lubada hõredate massiivide skalaarse indekseerimise. See funktsioon on loodud "SparseMatrixCSC" objektide juhusliku skalaarse indekseerimise tuvastamiseks, mis on jõudlusprobleemide tavaline allikas.
  • Uus tõrkekindel režiim testkomplektide jaoks, mis katkestab tõrke või vea korral testimise varakult. Määrake kas "@testset kwarg failfast=true" või "export JULIA_TEST_FAILFAST=true" kaudu. See on mõnikord vajalik CI-käibes, et veateateid varakult kätte saada.
  • Kuupäevad: tühje stringe ei sõeluta enam valesti kehtivate "DateTime", "Dates" või "Times" väärtustena ja selle asemel visatakse konstruktoritesse ja sõelumisse "ArgumentError", samas kui "tryparse" ei tagasta midagi.
  • Pakett jaotatud
    • Paketi konfiguratsiooni (aktiivne projekt, "LOAD_PATH", "DEPOT_PATH") levitatakse nüüd kohalike tööprotsesside lisamisel (nt "addprocs(N::Int)" või käsurea lipu abil "--procs=N").
    • Kohalike tööprotsesside "addprocs" aktsepteerib nüüd argumendi nimega "env", et edastada keskkonnamuutujad töötaja protsessidele.
  • Unicode: "graphemes(s, m:n)" tagastab alamstringi m-ndast n-ndani grafeemideni "s".
  • Pakett DelimitedFiles on süsteemiteegidest eemaldatud ja seda levitatakse nüüd eraldi paketina, mis tuleb kasutamiseks selgesõnaliselt installida.
  • Välised sõltuvused
    • Linuxis tuvastatakse süsteemiteegi libstdc++ versioon automaatselt ja kui see on uuem, siis see laaditakse. Vana libstdc++ sisseehitatud laadimiskäitumist, olenemata süsteemi versioonist, saab taastada keskkonnamuutuja "JULIA_PROBE_LIBSTDCXX=0" määramisega.
    • Julia kahendfailist eemaldati "RPATH", mis võib Linuxis rikkuda teeke, mis ei suuda määratleda muutujat "RUNPATH".
    • Tööriista täiustused: "MethodError" ja meetodite väljund (näiteks "methods(my_func)") on nüüd vormindatud ja värvitud vastavalt meetodite väljundi virnajälje põhimõttele.

    Allikas: opennet.ru

Lisa kommentaar