Lëshimi i gjuhës së programimit Julia 1.12

Është publikuar versioni i gjuhës së programimit Julia 1.12, që bashkon cilësi si performanca e lartë, mbështetje për tipizimin dinamik dhe mjete të integruara për programimin paralel. Sintaksa e Julia është e ngjashme me MATLAB, me disa elemente të huazuara nga Ruby dhe Lisp. Metoda e manipulimit të vargjeve i ngjan Perl.

Veçoritë kyçe të gjuhës:

  • Performancë e lartë: Një nga qëllimet kryesore të projektit është arritja e performancës afër programeve në gjuhën C. Kompilatori i Julia-s bazohet në punët e projektit LLVM dhe gjeneron kod të efektshëm të makinës natyrore për shumë platforma të synuara;
  • Mbështetje për paradigmat të ndryshme të programimit, duke përfshirë elemente të programimit objekt-orientuar dhe funksional. Biblioteka standarde ofron gjithashtu funksione për hyrje/dalje asinkrone, menaxhimin e proceseve, regjistrimin, profilimin dhe menaxhimin e pakot;
  • Tipizimi dinamik: gjuha nuk kërkon përcaktimin e qartë të tipave për variablat, ngjashëm me gjuhët e programimit të skriptimit. Mbështetet një mod i ndërveprueshëm;
  • Mundësi opsionale për të specifikuar qartë tipet;
  • Sintaksa, e cila përshtatet shkëlqyeshëm për llogaritjet numerike, llogaritjet shkencore, sistemet e mësimit të makinerive dhe vizualizimin e të dhënave. Mbështetje për shumë lloje të të dhënave numerike dhe mjete për paralelizimin e llogaritjeve.
  • Mundësia për të thirrur drejtpërdrejt funksionet nga bibliotekat në gjuhën C pa shtresa të tjera.

Ndryshimet kryesore në Julia 1.12:

  • Mundësi të reja të gjuhës
    • Një parametr experimental «—trim», që lejon krijimin e skedarëve binarë më kompaktë duke hequr kodin e padisponueshëm nga pikët e hyrjes të caktuara. Pikët e hyrjes mund të shënohen duke përdorur «Base.Experimental.entrypoint». Të gjitha kodet nuk mund të funksionojnë me këtë opsion.
    • Riklasifikimi i konstanteve tani përcaktohet qartë dhe ndiqet nga semantika «mosha e botës». Rrekllifikimet e tjera (për shembull, të tipave) janë të lejuara.
    • Funksionit «names» i është shtuar një parametr i ri «usings::Bool», i cili e bën funksionin të kthejë të gjitha emrat e dukshëm përmes «using».
    • Familja e makros «@atomic» tani mbështet sintaksën e caktimit të referencave, për shembull: «@atomic :monotonic v[3] += 4», e cila ndryshon atomikisht «v[3]» me semantikën e rendit monotonic. Sintaksa e mbështetur përfshin:
      • leximi atomik («x = @atomic v[3]»),
      • caktimi atomik («@atomic v[3] = 4»),
      • ndryshimi atomik («@atomic v[3] += 2»),
      • caktimi atomik një herë («@atomiconce v[3] = 2»),
      • ndërrimi atomik («x = @atomicswap v[3] = 2»),
      • zëvendësimi atomik («x = @atomicreplace v[3] 2=>5»).
    • Një parametr i ri «—task-metrics=yes», që përfshin mbledhjen e informacionit për kohën e ekzekutimit të çdo detyre, e cila mund të aktivizohet/çaktivizohet edhe gjatë ekzekutimit përmes «Base.Experimental.task_metrics(::Bool)». Metrikat e disponueshme:
      • koha faktike e ekzekutimit të detyrës, duke përfshirë kompilim dhe mbledhje mbeturinash («Base.Experimental.task_running_time_ns»),
      • koha nga momenti kur detyra fillon të ekzekutohet deri në përfundim («Base.Experimental.task_wall_time_ns»).
    • Mbështetje për Unicode 16.
    • «Threads.@spawn» tani pranon argumentin «:samepool» për të specifikuar të njëjtin lumë thjesht si kodi thirrës. «Threads.@spawn :samepool foo()» është një shkurtim për «Threads.@spawn Threads.threadpool() foo()».
    • Makroja «@ccall» tani mund të pranojë argumentin «gc_safe». Nëse është e vërtetë, atëherë gjatë thirrjes «ccall» runtime mund të kryejë mbledhje mbeturinash paralelisht.
  • Ndryshimet e gjuhës
    • Kur zëvendësohet një metodë me një të barabartë sipas nënshkrimit, metoda ekzistuese nuk hiqet. Në vend të kësaj, metoda e re bëhet prioritet. Nëse metoda e re hiqet, metoda e vjetër do të rifillojë punën. Kjo është e dobishme, për shembull, në kornizat e testimit me ndërrim (SparseArrays, Pluto, Mocking etj.), pasi nuk është e nevojshme të rikuperoni qartë metodën e vjetër. Aktualisht, për këtë situatë kërkohet kompilim i ri, por ndoshta në të ardhmen do të jetë e mundur të ri-shfrytëzohen rezultatet e vjetra.
    • Zhvillimi i makrove nuk do të hynë menjëherë recursive në shprehjet «Expr(:toplevel)» nga makros. Në vend të kësaj, zhvillimi i «:toplevel» do të vonohet deri në kohën e ekzekutimit. Kjo lejon shprehjet më të vonshme në të njëjtin «:toplevel» të përdorin makros që janë përcaktuar më parë.
    • Ciklet triviale të pafund (si «while true; end») tani nuk konsiderohen sjellje të paartikuluar. Ciklet e pafund, në të cilat ndodhin diçka (për shembull, me efekte të anashkalueshme ose sleep), asnjëherë nuk kanë qenë dhe nuk janë sjellje të paartikuluar.
    • Shënimi i një identifikuesi si «public» dhe «export» tani është një gabim.
    • Gabimet gjatë ekzekutimit të «getfield» tani shkaktojnë një tip të ri përjashtimi «FieldError» në vend të të përgjithshmit «ErrorException».
    • Makroja në pozitat e shpalljes së funksioneve tani nuk kërkojnë kllapa të rrethuar. Për shembull, është e lejuar «function @main(args) … end», ndërsa më parë kërkohej «function (@main)(args) … end».
    • Thirrja e «using» me emrin e paketës brenda paketës vetë (veçanërisht e rëndësishme për modulet e ngulitura) tani përdor saktësisht këtë paketë pa kontrollimin e Manifest dhe ambientit, ashtu si «..Name». Kjo i përshtatet më mirë sjelljes së pritur.
  • Përmirësime të kompajlerit/rundirers
    • Kodi ndërmjetës LLVM i gjeneruar (IR) tani përdor llojet e pointerëve në vend që të kalojë pointerët në formën e numrave të plotë. Kjo lidhet me «llvmcall»: IR i ndërtuar LLVM duhet të përditësohet duke zëvendësuar «i32″/»i64» me «i8*» ose «ptr» dhe duke hequr konvertimet e panevojshme «ptrtoint»/»inttoptr». Për të mbajtur IR kompatibil me pointerët e plotë ende mbështetet, por jep një paralajmërim.
  • Ndryshimet në parametrat e komandës
    • Flamuri «-m/—module» mund të dërgohet për të ekzekutuar funksionin «main» brenda paketës me një grup argumentesh. Kjo funksion duhet të shpallet përmes «@main», duke treguar se kjo është pika e hyrjes.
    • Aktivizimi/çaktivizimi i daljes me ngjyra në Julia tani mund të kontrollohet përmes variablave të ambientit «NO_COLOR» dhe «FORCE_COLOR». Këto variabla gjithashtu merren parasysh nga sistemi i ndërtimit të Julia.
    • «—project=@temp» запускаj Julia me ambient të përkohshën.
    • Parametri i ri «—trace-compile-timing» tregon kohën e kompilimit për çdo metodë të nxjerrë nga «—trace-compile», në milisekonda.
    • «—trace-compile» tani nxjerr metodat e ri-komplikuara me ngjyrë të verdhë ose shton një koment nëse ngjyra nuk është e disponueshme.
    • Parametri i ri «—trace-dispatch» tregon metodat që shpërndahen dinamikisht.
  • Ndryshime në shumëprona
    • Julia tani nga default përdor 1 rrjedhë «interaktive», përveç 1 rrjedhe kryesore «punuese», dmth. «-t1,1». Kjo do të thotë se detyra kryesore dhe REPL (në mënyrën interaktive), të cilat funksionojnë të dy në rrjedhën 1, tani ekzekutohen në një pool interaktive. Cikli i hyrjes-daljes libuv gjithashtu punon në rrjedhën 1, i cili siguron një përdorim efikas të pool-it të punës që përdoret nga «Threads.@spawn». Kërkesa për saktësisht 1 rrjedhë («-t1″/»JULIA_NUM_THREADS=1») ose 0 rrjedha interaktive çon në krijimin e një rrjedhe interaktive: «-t1,0», «JULIA_NUM_THREADS=1,0» ose «-tauto,0». Kërkesa për më shumë se 1 rrjedhë përfshin rrjedhën interaktive; për shembull, «-t2» është ekuivalente me «-t2,1». Kujdes: buferat nuk duhet të lidhen me «threadid()».
    • Janë përcaktuar lloje të reja për modelin e kodit që duhet ekzekutuar një herë për proces - tipi «OncePerProcess{T}» lejon përcaktimin e një funksioni që do të ekzekutohet pikërisht një herë kur thirret për herë të parë, dhe pastaj do të kthejë gjithmonë të njëjtin vlerë të tipit «T» në thirrjet e mëvonshme. Ka gjithashtu lloje «OncePerThread{T}» dhe «OncePerTask{T}» për përdorim të ngjashëm me rrjedhat ose detyrat.
  • Ndryshimet në sistemin e ndërtimit
    • Shtohen skedarë të rinj Makefile për ndërtimin e Julia dhe LLVM duke përdorur BOLT (Binary Optimization and Layout Tool). Shihni «contrib/bolt» dhe «contrib/pgo-lto-bolt».
  • Funksionet e reja të bibliotekës
    • «logrange(start, stop; length)» krijon një diapazon me një koeficient të qëndrueshëm (ratio), ndërsa jo me një hap të qëndrueshëm.
    • Funksioni i ri «isfull(c::Channel)» kontrollon nëse do të bllokohet «put!(c, some_value)».
    • «waitany(tasks; throw=false)» dhe «waitall(tasks; failfast=false, throw=false)» presin për përfundimin e disa detyrave në mënyrë të njëkohshme.
    • «uuid7()» krijon UUID versioni 7, në përputhje me RFC 9562.
    • «insertdims(array; dims)» fut një dimensional të një elementi në array – operacioni i kundërt i «dropdims».
    • Tipi i ri «Fix» generalizon «Fix1/Fix2» për ngathtësimin e një argumenti.
    • «Sys.detectwsl()» kontrollon nëse Julia po ekzekutohet brenda WSL gjatë minutës së ekzekutimit.
  • Funksionalitete të reja të bibliotekave
    • «escape_string» pranon parametra të tjerë «ascii=true» (për të eskaluar të gjitha karakteret që nuk janë ASCII) dhe «fullhex=true» (për të përdorur formatin e plotë 4/8-cifror në u/U-eskalimin, për shembull për përputhshmërinë me C).
    • «tempname» tani mund të pranojë një varg sufiksi, kështu që emri i skedarit përfshin këtë sufiks dhe merret parasysh në unikalitet.
    • Objektet «RegexMatch» tani mund të përdoren për të krijuar «NamedTuple» dhe «Dict».
    • «Lockable» tani publikohet.
    • «Base.require_one_based_indexing» dhe «Base.has_offset_axes» tani janë publike.
    • Shtohen funksione të reja «ltruncate», «rtruncate» dhe «ctruncate» për të shkurtruar vargjet në gjerësi të tekstit, duke marrë parasysh gjerësi e karaktereve.
    • Funksioni «isless» (dhe për këtë arsye «cmp», renditja etj.) tani mbështetet për Array-në e abstraktëve zero.
    • «invoke» tani lejon kalimin e «Method» në vend të nënshkrimit të llojit.
    • «invoke» tani pranon «CodeInstance» në vend të tipit, që mund të përshpejtojë disa procese të punës së plugin-ve të kompilatorit.
    • «Timer(f, …)» tani trashëgon «ngjitshin» (stickiness) e detyrës prindërore gjatë krijimit të detyrave të timer-it, që mund të tejkalon me argumentin e ri «spawn». Kjo zgjidh problemin kur detyrat e trashëguara «@async» e bën prindin ngjitës.
    • «Timer» tani ka pasuri të lexueshme «timeout» dhe «interval», si dhe një metodë më të përshkruese «show».
    • «sort» tani mbështet tuples «NTuple».
    • «map!(f, A)» tani ruan rezultatet në «A», si «map!(f, A, A)» ose «A .= f.(A)».
    • «setprecision» me argument-funksion (zakonisht përmes bllokut «do») tani është e sigurt për rrjedhat. Formate të tjera duhet të shmangen, dhe llojet duhet të kalojnë në zbatimin që përdor «ScopedValue».
  • Ndryshime në bibliotekën estándar
    • «gcdx(0, 0)» tani kthen «(0, 0, 0)» në vend të «(0, 1, 0)».
    • «fd» kthen «RawFD» në vend të «Int».
    • Paketë për JuliaSyntaxHighlighting
      • Paketë standarde e re për aplikimin e përmirësimit të sintaksës për kodin Julia, duke përdorur «JuliaSyntax» dhe «StyledStrings» për zbatimin e funksionit «highlight», i cili krijon «AnnotatedString» me përmirësimin e aplikuar.
    • Paketë LinearAlgebra.
      • «rank» tani mund të pranojë matricën «QRPivoted» për vlerësimin e rendit përmes QR-dekompozimit.
      • Shtohet parametrin kyç «alg» për «eigen», «eigen!», «eigvals» dhe «eigvals!» për lloje të matricave të vetë-zëvendësuara (bashkimi i tipave «RealHermSymComplexHerm»), i cili lejon kalimin midis algoritmeve të ndryshme të nxjerrjes së vlerave të vetë-ta.
      • Janë bërë një version i përgjithshëm i dekompozimit të Cholskyt të pakllitur me zgjidhje këndore (thirret përmes «cholesky[!](A, RowMaximum())»).
      • Numri i kodave BLAS të shumtë tani merr parasysh lidhjen e proceseve (process affinity), jo thjesht numrin e proceseve logjike në sistem.
      • Funksioni 'zeroslike' është shtuar, i cili kthen elemente zero për matrica me ruajtje në shirita. Tipet e personalizuara të array mund të specializojnë këtë funksion për të dhënë rezultatet e duhura.
      • Shumzimi i matriceve 'A * B' tani thërret 'matprod_dest(A, B, T::Type)' për të gjeneruar marrësin. Ky funksion tani është publik.
      • Funksioni 'haszero(T::Type)' përdoret për të kontrolluar nëse tipi 'T' ka një element unik zero, i përcaktuar si 'zero(T)'. Tani është publik.
      • Funksioni 'diagview' është shtuar, duke kthyer një pamje (view) në një diagonale të caktuar të matrices 'AbstractMatrix'.
    • Pakoja Profile
      • 'Profile.take_heap_snapshot' tani merr një parameter të ri 'redact_data::Bool', me vlerë të paracaktuar 'true'. Nëse është e lejuar, përmbajtja e objekteve Julia (siç janë vargjet) nuk përfshihet në snapshot-in e memorjes.
      • 'Profile.print()' tani ngjyros modulët Base/Core/Package ashtu si bëhet në gjurmën e stack-ut, dhe rrugët (edhe të shkurtra) tani janë të klikueshme në terminalet që mbështesin lidhjet URI dhe lejojnë hapjen e skedarit dhe linjës në redaktorin e caktuar 'JULIA_EDITOR'.
    • REPL
      • Duke përdorur mundësinë e re 'usings=true' në funksionin 'names()', autocompletimi në REPL mund të plotësojë emrat e dukshëm përmes 'using'.
      • Autocompletimi i REPL tani mund të përfundojë linjat e formatit '[import|using] Mod: xxx|', për shembull, përfundon 'using Base.Experimental: @op' në 'using Base.Experimental: @opaque'.
      • REPL tani jep një paralajmërim nëse emri i qaset përmes modulit që nuk e përcakton atë (dhe nuk ka ndonjë nënmodul që e përcakton), dhe emri nuk është publik në këtë modul. Për shembull, 'map' është e përcaktuar në Base, dhe ekzekutimi i 'LinearAlgebra.map' në REPL tani do të japë një paralajmërim në qoftë se ndodh për herë të parë.
      • Kur rezultati i inputit del në REPL, tani rezultati preket deri në 20 KiB. Kjo nuk ndikon në thirrjet manuale 'show', 'print' etj.
      • Autocompletimi për simbolin '\' tani tregon simbolin përkatës ose emoji pranë çdo fjale kyçe përputhëse.
    • Pakoja Test
      • Nëse grupi i testeve 'DefaultTestSet' përfundon me një gabim, ekrani tregon gjeneratorin e numrave të rastësishëm (RNG) të këtij grupi, për të ndihmuar për të riprodhuar gabimin stohastik, i varur vetëm nga gjendja e RNG. Gjithashtu mund të caktohet RNG për grupin e testeve duke kaluar parametrin 'rng' në makron '@testset': julia using Test, Random @testset rng=Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d70843e8bad6, 0xdbef927d150af80b, 0xdbf91ddf2534f850) begin @test rand() == 0.559472630416976 end
    • Pakoja InteractiveUtils
      • Makrotë e reja '@trace_compile' dhe '@trace_dispatch' për të ekzekutuar shprehje me parametrat '--trace-compile=stderr --trace-compile-timing' dhe '--trace-dispatch=stderr' përkatësisht.
  • Varësitë e jashtme
    • Baza e të dhënave për informacionin e terminalit ('terminfo') tani është përfshirë në shpërndarjen e Julia si default, duke përmirësuar funksionimin e REPL kur 'terminfo' nuk është e disponueshme në sistem. Julia mund të ndërtohet pa shtimin e bazës, duke përdorur parametrin e Makefile 'WITH_TERMINFO=0'.
  • Përmirësime të mjeteve
    • Profiluesi 'wall-time' është në dispozicion për përdoruesit që kërkojnë një profilues me mostrim që kap detyrat pavarësisht nga gjendja e tyre (planifikuar/përfunduar). Ky profilues lejon profilizimin e detyrave me përdorim të lartë të input-output dhe ndihmon në zbulimin e fushave të forta të konkurrencës në sistem.

Burimi: opennet.ru

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster