Programlingvo Julia 1.9 havebla

La eldono de la Julia 1.9 programlingvo estis publikigita, kombinante tiajn kvalitojn kiel alta rendimento, subteno por dinamika tajpado kaj enkonstruitaj iloj por paralela programado. La sintakso de Julia estas proksima al MATLAB, pruntante kelkajn elementojn de Ruby kaj Lisp. La metodo de manipulado de ŝnuroj memorigas pri Perl. La projektkodo estas distribuita sub la MIT-licenco.

Ĉefaj trajtoj de la lingvo:

  • Alta rendimento: unu el la ĉefaj celoj de la projekto estas atingi rendimenton proksime al C-programoj. La Julia kompililo baziĝas sur la laboro de la projekto LLVM kaj generas efikan indiĝenan maŝinkodon por multaj celplatformoj;
  • Subtenas diversajn programajn paradigmojn, inkluzive de elementoj de objektorientita kaj funkcia programado. La norma biblioteko disponigas, interalie, funkciojn por nesinkrona I/O, procezkontrolo, arbodehakado, profilado kaj pakadministrado;
  • Dinamika tajpado: la lingvo ne postulas eksplicitan difinon de tipoj por variabloj, simile al skriptaj programlingvoj. Interaga reĝimo subtenata;
  • Laŭvola kapablo eksplicite specifi tipojn;
  • Sintakso ideala por nombra komputiko, scienca komputiko, maŝinlernado kaj datumbildigo. Subteno por multaj nombraj datumtipoj kaj iloj por paraleligo de kalkuloj.
  • La kapablo rekte voki funkciojn de C-bibliotekoj sen pliaj tavoloj.

Gravaj ŝanĝoj en Julia 1.9:

  • Novaj lingvaj funkcioj
    • Permesu asignojn esti faritaj en alia modulo uzante "setproperty!(::Module, ::Symbol, x)".
    • Multoblaj taskoj ne en la fina pozicio estas permesitaj. Ekzemple, la ĉeno "a, b..., c = 1, 2, 3, 4" estos procesita kiel "a = 1; b…, = 2, 3; c = 4". Ĉi tio estas pritraktata per Base.split_rest.
    • Unuopaj literoj nun subtenas la saman sintakson kiel ĉenaj literoj; tiuj. La sintakso povas reprezenti malvalidajn UTF-8-sekvencojn, kiel permesite per la Char-tipo.
    • Aldonita subteno por Unikodo 15-specifo.
    • Nestitaj kombinaĵoj de opoj kaj nomitaj karakteropoj nun povas esti uzataj kiel tipparametroj.
    • Novaj enkonstruitaj funkcioj "getglobal(::Module, ::Symbol[, order])" kaj "setglobal!(::Module, ::Symbol, x[, order])" por legi kaj skribi ekskluzive al tutmondaj variabloj. La getglobal-metodo nun devus esti preferita super la getfield-metodo por aliri tutmondajn variablojn.
  • Ŝanĝoj en lingvo
    • La makroo "@invoke" enkondukita en versio 1.7 nun estas eksportita kaj uzebla. Aldone, ĝi nun uzas la metodon "Core.Typeof(x)" prefere ol "Any" en la kazo kie la tipanotado estas preterlasita por la "x" argumento. Ĉi tio estas necesa por certigi, ke tipoj pasigitaj kiel argumentoj estas ĝuste prilaboritaj.
    • Ebligita eksporto de la funkcio "invokelatest" kaj la makroo "@invokelatest", lanĉitaj en versio 1.7.
  • Kompililo/rultempaj plibonigoj
    • Signife reduktita tempo al unua ekzekuto (TTFX - Tempo al unua ekzekuto). Antaŭkompilado de pakaĵo nun stokas indiĝenan kodon en "pkgimage", signifante ke tiu kodo generita per la antaŭkompila procezo ne devos esti rekompilita post kiam la pakaĵo estas ŝarĝita. La uzo de pkgimages-reĝimo povas esti malŝaltita uzante la opcion "--pkgimages=no".
    • La konata kvadrata kompleksecproblemo de tipinferenco estis fiksita, kaj inferenco uzas malpli da memoro entute. Kelkaj randkazoj kun aŭtomate generitaj longaj funkcioj (kiel ekzemple ModelingToolkit.jl kun partaj diferencialaj ekvacioj kaj grandaj kaŭzaj modeloj) kompilas multe pli rapide.
    • Vokoj kun argumentoj sen konkretaj tipoj nun povas esti Sindikat-dividado optimumigita por injekto aŭ senmova rezolucio, eĉ se ekzistas pluraj malsamspecaj kandidatoj por sendo. Ĉi tio povas plibonigi rendimenton en certaj situacioj kie objektospecoj ne estas plene statike solvitaj, statike solvante "@nospecialize-d" alvokejojn kaj evitante rekompilon.
    • Ĉiuj uzoj de la makroo @pure en la Baza modulo estis anstataŭigitaj per Bazo.@assume_effects.
    • Vokoj alvoki(f, invokesig, args...) kun malpli specifaj tipoj ol kutime uzataj por f(args...) ne plu kaŭzas la pakaĵon esti rekompilita.
  • Ŝanĝoj al Komandliniaj Opcioj
    • En Linukso kaj Vindozo, la opcio "--threads=auto" nun provas determini la disponeblan nombron da procesoroj surbaze de CPU-afineco, masko kutime starigita en HPC kaj nubaj medioj.
    • La parametro “--math-mode=rapida” estas malŝaltita, anstataŭ kiu oni rekomendas uzi la makroon “@fastmath”, kiu havas klare difinitan semantikon.
    • La opcio "--fadenoj" nun estas en la formato "auto | N[,auto|M]", kie M indikas la nombron da interagaj fadenoj por krei (nuntempe aŭtomata signifas 1).
    • Aldonita opcio "—heap-size-hint=" ", kiu fiksas la sojlon post kiu komenciĝas aktiva rubkolekto. La grandeco povas esti precizigita en bajtoj, kilobajtoj (1000 KB), megabajtoj (300 MB), aŭ gigabajtoj (1,5 GB).
  • Ŝanĝoj en multifadenado
    • "Fadenoj.@spawn" nun havas laŭvolan unuan argumenton kun la valoro ":default" aŭ ":interactive". Interaga tasko postulas malaltan responda latentecon kaj estas dizajnita por esti mallonga aŭ farita ofte. Interagaj taskoj funkcios sur interagaj fadenoj se ili estas specifitaj kiam oni komencas Julian.
    • Fadenoj kurantaj ekster la Julia rultempo (kiel ekzemple de C aŭ Java) nun povas voki Julia kodon uzante "jl_adopt_thread". Ĉi tio okazas aŭtomate dum enigo de Julia kodo per "cfunction" aŭ la enirpunkto "@ccallable". Sekve, la nombro da fadenoj nun povas ŝanĝiĝi dum ekzekuto.
  • Novaj bibliotekaj funkcioj
    • Nova funkcio "Iterators.flatmap".
    • Nova funkcio "pkgversion(m::Module)" por ricevi la version de la pakaĵo, kiu ŝargis donitan modulon, simile al "pkgdir(m::Module)".
    • Nova funkcio "stack(x)" kiu ĝeneraligas "reduce(hcat, x::Vector{<:Vector})" al iu ajn dimensio kaj permesas ajnan ripetanton de iteratoroj. La "stack(f, x)" metodo ĝeneraligas "mapreduce(f, hcat, x)" kaj estas pli efika.
    • Nova makroo por analizado de asignita memoro "@allocations", simila al "@allocation", krom ke ĝi resendas la nombron da memorasignoj, prefere ol la totala grandeco de la asignita memoro.
  • Novaj bibliotekaj funkcioj
    • "RoundFromZero" nun funkcias por tipoj krom "BigFloat".
    • "Dict" nun povas esti mane reduktita uzante "sizehint!"
    • "@time" nun aparte specifas la procenton de tempo elspezita por rekompi nevalidajn metodojn.
  • Ŝanĝoj al la norma biblioteko
    • Riparis samtempan problemon en ripetadmetodoj por Dict kaj aliaj derivitaj objektoj kiel ŝlosiloj(::Dict), valoroj (::Dict) kaj Aro. Ĉi tiuj ripetaj metodoj nun povas esti vokitaj sur Dict aŭ Aro paralele por senlima nombro da fadenoj, kondiĉe ke ne ekzistas agoj kiuj modifas la vortaron aŭ aron.
    • Neante predikatan funkcion "!f" nun redonas kunmetitan funkcion "(!) ∘ f" anstataŭ anoniman funkcion.
    • Dimensio-tranĉfunkcioj nun funkcias trans multoblaj dimensioj: "eachslice", "eachrow" kaj "eachcol" resendas "Slices" objekton kiu permesas sendi pli efikajn metodojn.
    • Aldonis la makroon "@kwdef" al la publika API.
    • Korektis problemon pri la ordo de operacioj en "fld1".
    • Ordigo nun estas ĉiam stabila (QuickSort estis restrukturita).
    • "Base.splat" nun estas eksportita. La revena valoro estas "Base.Splat" tipo prefere ol anonima funkcio, permesante ĝin esti eligita bele.
  • Paka Administranto
    • "Pakaj etendaĵoj": Subteno por ŝarĝi kodpeceton de aliaj pakaĵoj ŝarĝitaj en Julia sesio. La aplikaĵo similas al la pakaĵo "Requires.jl", sed estas subtenataj antaŭkompilaj kaj agordaj kongruoj.
  • LinearAlgebra Biblioteko
    • Pro la risko de konfuzo kun element-saĝa divido, forigis la "a/b" kaj "b\a" metodoj kun skalara "a" kaj vektora "b", kiuj estis ekvivalentaj al "a * pinv(b)".
    • Voki BLAS kaj LAPACK nun uzas "libblastrampoline (LBT)". OpenBLAS estas provizita defaŭlte, sed konstrui la sistembildon kun aliaj BLAS/LAPACK-bibliotekoj ne estas subtenata. Anstataŭe, estas rekomendite uzi la LBT-mekanismon por anstataŭigi BLAS/LAPACK kun alia ekzistanta aro de bibliotekoj.
    • "lu" subtenas novan matrican rotacian strategion, "RowNonZero()", kiu elektas la unuan ne-nulan rotacian elementon por uzo kun novaj aritmetikaj tipoj kaj por trejnado.
    • "normalize(x, p=2)" nun subtenas ajnan normaligitan vektoran spacon "x", inkluzive de skalaroj.
    • La defaŭlta nombro da BLAS-fadenoj nun estas egala al la nombro da CPU-fadenoj sur ARM-arkitekturoj kaj duono de la nombro da CPU-fadenoj sur aliaj arkitekturoj.
  • Printf: Reverkitaj erarmesaĝoj por malĝuste formatitaj ĉenoj por pli bona legebleco.
  • Profilo: Nova funkcio "Profile.take_heap_snapshot(dosiero)", kiu skribas dosieron en la JSON-bazita ".heapsnapshot" formato subtenata en Chrome.
  • Hazarda: randn kaj randexp nun funkcias por iu ajn AbstractFloat-tipo kiu difinas rand.
  • REPL
    • Premante la klavkombinon "Alt-e" nun malfermas la nunan enigon en la redaktilo. La enhavo (se modifita) estos ekzekutita kiam vi eliras el la redaktilo.
    • La nuna modula kunteksto aktiva en la REPL povas esti ŝanĝita (Ĉefa defaŭlte) uzante la funkcion "REPL.activate(::Module)" aŭ enirante la modulon en la REPL kaj premante la klavkombinon "Alt-m".
    • La reĝimo "numerita prompto", kiu presas nombrojn por ĉiu enigo kaj eligo kaj konservas la gajnitajn rezultojn en Out, povas esti aktivigita per "REPL.numbered_prompt!()".
    • Klapeta kompletigo montras disponeblajn ŝlosilvortajn argumentojn.
  • SuiteSparse: Movis kodon por la solvilo "SuiteSparse" al "SparseArrays.jl". Solvantoj nun estas reeksportitaj de "SuiteSparse.jl".
  • SparseArrays
    • "SuiteSparse" solviloj nun haveblas kiel "SparseArrays" submoduloj.
    • UMFPACK kaj CHOLMOD-fadenprotektaj reĝimoj estis plibonigitaj forigante tutmondajn variablojn kaj uzante serurojn. Plurfadena "ldiv!" UMFPACK-objektoj nun povas esti ekzekutitaj sekure.
    • La eksperimenta funkcio "SparseArrays.allowscalar(::Bool)" permesas malebligi aŭ ebligi skalaran indeksadon de maldensaj tabeloj. Ĉi tiu funkcio estas dizajnita por detekti hazardan skalaran indeksadon de "SparseMatrixCSC" objektoj, kio estas ofta fonto de agadoproblemoj.
  • Nova sekura reĝimo por testaj serioj, kiu ĉesigas teston frue en kazo de malsukceso aŭ eraro. Agordu ĉu per "@testset kwarg failfast=true" aŭ "export JULIA_TEST_FAILFAST=true". Ĉi tio foje estas necesa en CI-kuroj por ricevi erarmesaĝojn frue.
  • Datoj: Malplenaj ĉenoj ne plu estas malĝuste analizitaj kiel validaj "DateTime", "Dates" aŭ "Times" valoroj kaj anstataŭe ĵetas "ArgumentError" en konstrukciistoj kaj analizado, dum "tryparse" resendas nenion.
  • Pako Distribuita
    • La paka agordo (aktiva projekto, "LOAD_PATH", "DEPOT_PATH") nun estas disvastigita aldonante lokajn laborprocezojn (ekz. uzante "addprocs(N::Int)" aŭ uzante la komandlinian flagon "--procs=N").
    • "addprocs" por lokaj laborprocezoj nun akceptas argumenton nomitan "env" por transdoni mediovariablojn al laborprocezoj.
  • Unikodo: "grafemoj(j, m:n)" resendas la subĉenon de la mth ĝis nth grafemoj en "s".
  • La pakaĵo DelimitedFiles estis forigita de la sistembibliotekoj kaj nun estas distribuita kiel aparta pakaĵo, kiu devas esti eksplicite instalita por esti uzata.
  • Eksteraj dependecoj
    • En Linukso, la versio de la libstdc++ sistembiblioteko estas aŭtomate detektita kaj, se ĝi estas pli nova, ĝi estas ŝarĝita. La malnova libstdc++ enkonstruita ŝarĝokonduto, sendepende de sistemversio, povas esti restarigita per agordo de la mediovariablo "JULIA_PROBE_LIBSTDCXX=0".
    • Forigita "RPATH" de la julia binaro, kiu povas rompi bibliotekojn en Linukso, kiuj ne sukcesas difini la variablon "RUNPATH".
    • Ilaj plibonigoj: La eligo de "MethodError" kaj metodoj (ekzemple de "methods(my_func)") nun estas formatita kaj kolorigita laŭ la principo de eligo de metodoj en stakspuro.

    fonto: opennet.ru

Aldoni komenton