Programmeerimiskeele Julia 1.12 väljaanne

Avalikustatud on programmeerimiskeele Julia versioon 1.12, mis ühendab endas selliseid omadusi nagu kõrge jõudlus, dünaamiline tüüpide tugi ja sisseehitatud tööriistad paralleelseks programmeerimiseks. Julia süntaks sarnaneb MATLAB-iga, laenates mõned elemendid 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.12-s:

  • Keele uued võimalused
    • Eksperimentaalne parameeter „—trim“, mis võimaldab luua kompaktsed binaarfailid, eemaldades koodi, mis ei ole kergesti kättesaadav määratud sisenemispunktidest. Sisenemispunkte saab tähistada, kasutades „Base.Experimental.entrypoint“. Sellega ei pruugi töötada kogu kood.
    • Konstandite ülevaatamine on nüüd selgelt määratletud ja järgib „maailma vanuse“ semantikat. Lisanduvad täiendavad ülevaatused (näiteks tüüpide puhul).
    • Funktsioonile „names“ on lisatud uus parameeter „usings::Bool“, mis sunnib funktsiooni tagastama kõik nimed, mis on nähtavad läbi „using“.
    • Macros of the "@atomic" family now support link assignment syntax, for example: "@atomic :monotonic v[3] += 4", which atomically modifies "v[3]" with monotonic ordering semantics. Supported syntax includes:
      • atomic read ("x = @atomic v[3]")
      • atomic assignment ("@atomic v[3] = 4")
      • atomic modification ("@atomic v[3] += 2")
      • atomic single assignment ("@atomiconce v[3] = 2")
      • atomic exchange ("x = @atomicswap v[3] = 2")
      • atomic replacement ("x = @atomicreplace v[3] 2=>5").
    • A new parameter "--task-metrics=yes", which enables collecting information about the execution time of each task, which can be toggled on/off during execution via "Base.Experimental.task_metrics(::Bool)". Available metrics:
      • actual task execution time, including compilation and garbage collection ("Base.Experimental.task_running_time_ns")
      • time from when the task started executing to completion ("Base.Experimental.task_wall_time_ns").
    • Support for Unicode 16.
    • "Threads.@spawn" now accepts the "samepool" argument to indicate using the same thread pool as the calling code. "Threads.@spawn :samepool foo()" is a shorthand for "Threads.@spawn Threads.threadpool() foo()".
    • Maksu „@ccall“ toetab nüüd argumenti „gc_safe“. Kui see on tõene, võib käivitusaeg „ccall“ käivitamise ajal paralleelselt prügikogumise teha.
  • Keeles tehtud muudatused
    • Kui meetod asendatakse allkirjaga sarnasega, ei kustutata olemasolevat meetodit. Uus meetod saab prioriteediks. Kui uus meetod kustutatakse, hakkab vana meetod taas tööle. See on näiteks kasulik testimissüsteemides, kus protseduure vajatakse (SparseArrays, Pluto, Mocking jne), kuna vana meetodi taastamine ei ole vajalik. Praegu on selleks vajalik uuesti kompileerimine, kuid tulevikus on võimalik, et vana tulemusi saab taaskasutada.
    • Maksude levitamine ei siseneda enam kohe rekursiivselt väljenditesse „Expr(:toplevel)“ makrotest. Selle asemel edasilükatud „:toplevel“ levitamine jääb täitmise ajaks. See võimaldab hilisematel väljenditel samas „:toplevelis“ kasutada varem määratud makro.
    • Triviaalne lõputu tsüklid (nt «while true; end») ei loeta enam määratlemata käitumiseks. Lõputud tsüklid, kus midagi toimub (näiteks kõrvalefektidega või sleep), ei ole kunagi olnud ega ole jätkuvalt määratlemata käitumine.
    • Identifikaatori samaaegne märkimine kui «public» ja «export» on nüüd viga.
    • Täitmisvead «getfield» korral toovad nüüd esile uue erandi tüübi «FieldError» üldise «ErrorException» asemel.
    • Makrod funktsiooni deklaratsiooni positsioonis ei vaja nüüd enam ümarate sulgude lisamist. Näiteks on lubatud «function @main(args) … end», samas kui varem nõuti «function (@main)(args) … end».
    • Kasutamine nimega paketti paketi sees (eriti asjakohane sisemoodulite jaoks) kasutab nüüd seda paketti otseselt, ilma Manifesti ja keskkonna vaatamiseta, nagu «..Name». See vastab paremini oodatud käitumisele.
  • Komplektori/ajaraami täiustused
    • Genereritud LLVM vahefail (IR) kasutab nüüd pointer-tüüpe, mitte täisarvudena edastatud pointer'e. See kehtib 'llvmcall' puhul: sisseehitatud LLVM IR tuleks uuendada, asendades 'i32'/'i64' 'i8*' või 'ptr'-iga ning eemaldades mitte vajalikud 'ptrtoint'/'inttoptr' konversioonid. IR-i sobitamiseks täisarvuliste pointer'itega toetatakse seda endiselt, kuid see annab hoiatuse.
  • Käsurea parameetrite muudatused
    • Lipp '-m/—module' saab edasi anda, et käivitada 'main' funktsioon paketi sees argumendiga. See funktsioon peab olema deklareeritud '@main', märgistades, et see on sisenemiskoht.
    • Julia värvilise väljundi sisse- ja väljalülitamist saab nüüd juhtida keskkonnamuutujate 'NO_COLOR' ja 'FORCE_COLOR' abil. Need muutujad arvestatakse ka Julia kogumissüsteemis.
    • ‘—project=@temp’ käivitab Julia ajutise keskkonna kasutamisega.
    • Uus parameeter '—trace-compile-timing' väljastab iga meetodi kompileerimise aja, mis on koos '—trace-compile' väljundiga, millisekundites.
    • ‘—trace-compile’ väljastab nüüd ülekodeeritud meetodeid kollase värviga või lisab kommentaari, kui värv pole saadaval.
    • Uus parameeter '—trace-dispatch' väljastab meetodid, mis jaotatakse dünaamiliselt.
  • Muudatused mitmeotsingus
    • Julia kasutab nüüd vaikimisi 1 "interaktiivset" vorgu lisaks 1 põhivõrgu jaoks, st "-t1,1". See tähendab, et põhitegevus ja REPL (interaktiivses režiimis), mis mõlemad töötavad võrgus 1, täidetakse nüüd interaktiivses puulis. Libuv sisendi- ja väljundi tsükkel töötab samuti võrgus 1, mis tagab tõhusa töötluse kasutamise töömoodulist, mida kasutatakse "Threads.@spawn". Täpselt 1 võrgutaotluse („-t1" / "JULIA_NUM_THREADS=1") või 0 interaktiivset võrku, keelab interaktiivse võrgu: „-t1,0“, „JULIA_NUM_THREADS=1,0“ või „-tauto,0“. Rohkem kui 1 võrgu taotlemine hõlmab interaktiivset võrku; näiteks „-t2“ on ekvivalentne „-t2,1“. Tuletame meelde: puhver ei tohiks olla seotud „threadid()“.
    • Uued tüübid on määratud koodimallile, mis peab tööle minema üks kord protsessori kohta - tüüp „OncePerProcess{T}“ võimaldab määrata funktsiooni, mis täidetakse täpselt üks kord, kui seda esmakordselt kutsutakse, ja seejärel tagastab alati sama tüüpi „T“ väärtuse järgmistele kutsungitele. Samuti on olemas tüübid „OncePerThread{T}“ ja „OncePerTask{T}“ sarnasteks kasutamiseks võrgu või ülesannete jaoks.
  • Kogumisseadme muudatused
    • Uued Makefile-failid on lisatud Julia ja LLVM kogumiseks BOLT-i (Binary Optimization and Layout Tool) abil. Vaata «contrib/bolt» ja «contrib/pgo-lto-bolt».
  • Uued raamatukogu funktsioonid
    • «logrange(start, stop; length)» loob pideva suhega (ratio) vahemiku, mitte pideva sammu.
    • Uus funktsioon «isfull(c::Channel)» kontrollib, kas «put!(c, some_value)» blokeerib.
    • «waitany(tasks; throw=false)» ja «waitall(tasks; failfast=false, throw=false)» ootavad mitme ülesande samaaegset lõpetamist.
    • «uuid7()» loob UUID versiooni 7, mis vastab RFC 9562-le.
    • «insertdims(array; dims)» sisestab üheelemendilised mõõtmed massiivi — vastupidine tehing «dropdims».
    • Uus tüüp «Fix» ühtlustab «Fix1/Fix2» ühe argumendi fikseerimiseks.
    • «Sys.detectwsl()» kontrollib, kas Julia töötab WSL-is runtime'is.
  • Uued teegivõimalused
    • «escape_string» võtab nüüd lisaparametreid «ascii=true» (kõik mitte-ASCII sümbolid) ja «fullhex=true» (täieliku 4/8-kohalise hex-formaadiga u/U-eeskirjade jaoks, näiteks C-ga ühilduvuse tagamiseks).
    • «tempname» võib nüüd vastu võtta sufiksi stringi, et faili nimi sisaldaks seda sufiksit ja see arvestataks unikaalsuses.
    • «RegexMatch» objekte saab nüüd kasutada «NamedTuple» ja «Dict» loomisel.
    • «Lockable» eksporditakse nüüd.
    • «Base.require_one_based_indexing» ja «Base.has_offset_axes» on nüüd avalikud.
    • Uued funktsioonid «ltruncate», «rtruncate» ja «ctruncate» on lisatud tekstiridade pikkuse lõikamiseks, arvestades sümbolite laius.
    • Funktsioon «isless» (seega ka «cmp», sorteerimine jne) toetab nüüd nullmõõtmelisi «AbstractArray».
    • «invoke» võimaldab nüüd edastada «Method» tüübi asemel.
    • «invoke» võtab nüüd vastu «CodeInstance» tüübi asemel, mis võib kiirendada teatud kompilaatori pistikprogrammide töövooge.
    • «Timer(f, …)» pärib nüüd põhitegevuse «liimimise» (stickiness) loomisel ajastust, mida saab uue argumendiga «spawn» üle kirjutada. See lahendab probleemi, kus liimimisprotsessis olevad lasteülesanded («@async») muutsid põhitegevuse liplikuks.
    • «Timer» omab nüüd loetavaid omadusi «timeout» ja «interval», samuti sisukamat meetodit «show».
    • «sort» toetab nüüd «NTuple» algväärtuseid.
    • «map!(f, A)» salvestab nüüd tulemused «A» ja toimib nagu «map!(f, A, A)» või «A .= f.(A)».
    • Funktsiooniga «setprecision» (tavaliselt läbi ploki «do») on nüüd voogude turvaline. Muud vormid tuleks vältida ning tüübid peaksid liikuma rakenduse suunas, mis kasutab «ScopedValue».
  • Standardraamatukogu muudatused
    • «gcdx(0, 0)» tagastab nüüd «(0, 0, 0)» asemel «(0, 1, 0)».
    • «fd» tagastab «RawFD» asemel «Int».
    • Paket JuliaSyntaxHighlighting
      • Uus standardpakett, mis rakendab süntaksi esiletõstmist Julia koodile. See kasutab «JuliaSyntax» ja «StyledStrings» funktsiooni «highlight», mis loob «AnnotatedString» koos rakendatud esiletõstmist.
    • Paket LinearAlgebra.
      • «rank» võib nüüd võtta «QRPivoted» maatriksi, et hinnata järjestust QR-dekompositsiooni kaudu.
      • Lisatud võtmeparameeter «alg» funktsioonidele «eigen», «eigen!», «eigvals» ja «eigvals!» iseeneslikult samasuguste maatriksitüüpide (tüübiühend «RealHermSymComplexHerm») jaoks, et lubada erinevate omavääringute väljalugemise algoritmide vahetamine.
      • Lisatud üldine mitteblokkeeritud Cholesky dekompositsioon pöörangute valimisega (kutsutakse välja «cholesky[!](A, RowMaximum())» kaudu).
      • BLAS-i lõimede arv vaikimisi arvestab nüüd protsesside sidumist (process affinity), mitte ainult süsteemi loogiliste lõimede arvu.
      • Lisatud funktsiooni «zeroslike», mis tagastab null-elemente riba salvestamisega maatriksi jaoks. Kasutajaliigid saavad seda funktsiooni spetsialiseerida õige tulemuse saamiseks.
      • Maatrikside korrutamine «A * B» kutsub nüüd üles «matprod_dest(A, B, T::Type)», et genereerida vastuvõtja. See funktsioon on nüüd avalik.
      • Funktsioon «haszero(T::Type)» kasutatakse selle kontrollimiseks, kas tüübil «T» on ainulaadne null-element, defineeritud kui «zero(T)». Nüüd on see avalik.
      • Lisatud funktsioon «diagview», mis tagastab vaate (view) konkreetsele diagonaalile maatriksis «AbstractMatrix».
    • Pakett Profile
      • «Profile.take_heap_snapshot» võtab nüüd uue parameetri «redact_data::Bool», vaikimisi «true». Kui lubatud, siis Julia objektide sisu (näiteks stringid) ei lisata mälu kuvamisele.
      • «Profile.print()» värvib nüüd mooduleid Base/Core/Package samamoodi nagu see toimub mälus jälgimisega, ja teed (isegi kärbitud) on nüüd klikatavad terminalides, mis toetavad URI-linke ja võimaldavad avada määratud faili ja rida toimetajas, mille on määranud «JULIA_EDITOR».
    • REPL
      • Uue omaduse «usings=true» kasutamine funktsioonis «names()» võimaldab REPL-i automaatse täiendamise täiendamist, et lisada nimesid, mis on nähtavad läbi «using».
      • REPL-i automaatne täiendamine suudab nüüd lõpetada nimetusi nagu «[import|using] Mod: xxx|», näiteks lõpetada «using Base.Experimental: @op» kuni «using Base.Experimental: @opaque».
      • REPL annab nüüd hoiatuse, kui nimi kutsutakse välja moodulist, mis ei defineeri seda (ja tal ei ole alamoodulit, mis selle defineerib), ning nimi ei ole selles moodulis avalik. Näiteks "map" on defineeritud Base'is ja REPL-is vea kohta, kui esmakordselt kutsutakse "LinearAlgebra.map".
      • REPL-i sisendi väljund kärbitakse nüüd 20 KiB-ni. See ei mõjuta käsitsi tehtud väljakutseid, nagu "show", "print" jne.
      • Sümboli "\" automaatne täiendamine kuvab nüüd igaks vastavaks koodisõnaks sobiva sümboli või emotikoni.
    • Pakett Test
      • Kui testikomplekt "DefaultTestSet" ebaõnnestub, kuvatakse ekraanile selle komplekti juhuslik numbritootja (RNG), et aidata kopeerida juhuslikku viga, mis sõltub ainult RNG seisundist. Samuti saab testikomplekti RNG-d määrata, edastades parameetri "rng" makrole "@testset": julia using Test, Random @testset rng=Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d70843e8bad6, 0xdbef927d150af80b, 0xdbf91ddf2534f850) begin @test rand() == 0.559472630416976 end
    • Pakett InteractiveUtils
      • Uued makrod „@trace_compile“ ja „@trace_dispatch“ võimaldavad väljendeid, mille parameetrid on „—trace-compile=stderr —trace-compile-timing“ ja „—trace-dispatch=stderr“ vastavalt.
  • Välist sõltuvust
    • Terminali info andmebaas („terminfo“) on nüüd vaikimisi Julia pakkumises, mis parandab REPL-i toimimist, kui „terminfo“ pole süsteemis saadaval. Julia saab üles ehitada ilma andmebaasi kaasamata, kasutades Makefile'i parameetrit „WITH_TERMINFO=0“.
  • Tööriistade täiustused
    • Kasutajatele, kes vajavad ülesannete propageerimiseks tähistamist sõltumata nende seisundist (plaaneeritud/täidetud), on saadaval „seinaaja“ propageerija. Selline propageerija võimaldab propageerida intensiivse sisendi-väljundi ülesandeid ja aitab leida süsteemis tugeva konkurentsi alasid.

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster