Eldono de la Julia 1.8 programlingvo

La eldono de la Julia 1.8 programlingvo estas disponebla, 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.8:

  • Novaj lingvaj funkcioj
    • Kampoj de ŝanĝebla strukturo nun povas esti komentitaj kiel konstantoj por malhelpi ilin esti ŝanĝitaj kaj permesi optimumigo.
    • Tipokotadoj povas esti aldonitaj al tutmondaj variabloj.
    • Malplenaj n-dimensiaj tabeloj povas esti kreitaj uzante plurajn punktokomojn ene de kvadrataj krampoj, ekzemple "[;;;]" kreas 0x0x0 tabelon.
    • Provo-blokoj nun povas laŭvole havi else-blokon, kiu estas efektivigita tuj post la ĉefa korpo se neniuj eraroj estis ĵetitaj.
    • @inline kaj @noinline povas esti metitaj ene de funkciokorpo, permesante al vi komentari anoniman funkcion.
    • @inline kaj @noinline nun povas esti aplikitaj al funkcio en voka retejo aŭ bloko por devigi la respondajn funkciovokojn esti inkluzivitaj (aŭ ne inkluditaj).
    • ∀, ∃ kaj ∄ estas permesitaj kiel identigaj signoj.
    • Aldonita subteno por Unikodo 14.0.0-specifo.
    • La metodo Module(:name, false, false) povas esti uzata por krei modulon kiu ne enhavas nomojn, ne importas Bazon aŭ Kernon, kaj ne enhavas referencon al si mem.
  • Ŝanĝoj en lingvo
    • Lastatempe kreitaj Task-objektoj (@spawn, @async, ktp.) nun havas world_age por metodoj de la gepatra Tasko kiam kreitaj, ebligante optimumigitan ekzekuton. La antaŭa aktiviga opcio disponeblas per la metodo Base.invokelatest.
    • Unikodaj malekvilibraj dudirektaj formataj direktivoj nun estas malpermesitaj en ĉenoj kaj komentoj por eviti injektojn.
    • Base.ifelse nun estas difinita kiel senmarka funkcio prefere ol enkonstruita, permesante al pakaĵoj etendi ĝian difinon.
    • Ĉiu tasko al tutmonda variablo nun unue trapasas vokon por konverti (Iu ajn, x) aŭ konverti (T, x) se la tutmonda variablo estis deklarita kiel de tipo T. Antaŭ ol uzi tutmondajn variablojn, certigu, ke la senvariaĵo konverti (Iu ajn). , x) === x estas ĉiam vera, alie ĝi povas konduki al neatendita konduto.
    • Enkonstruitaj funkcioj nun estas similaj al senmarkaj funkcioj kaj povas esti programe listigitaj uzante metodojn.
  • Kompililo/rultempaj plibonigoj
    • Lanĉtempo reduktita je proksimume 25%.
    • La LLVM-bazita kompililo estis apartigita de la rultempa biblioteko en novan bibliotekon, libjulia-codegen. Ĝi estas ŝarĝita defaŭlte, do ne devus esti ŝanĝoj dum normala uzo. En deplojoj kiuj ne bezonas kompililon (ekzemple, sistembildoj en kiuj la tuta necesa kodo estas antaŭkompilita), ĉi tiu biblioteko (kaj ĝia LLVM-dependeco) povas simple esti preterlasita.
    • Kondiĉa tipa inferenco nun eblas per pasado de argumento al metodo. Ekzemple, por Base.ifelse(isa(x, Int), x, 0) redonas ::Int eĉ se la tipo de x estas nekonata.
    • SROA (Skala Anstataŭigo de Agregatoj) estis plibonigita: forigas getfield-vokojn kun persistaj tutmondaj kampoj, forigas ŝanĝeblajn strukturojn kun neinicialigitajn kampojn, plibonigas rendimenton kaj uzadon de nestitaj getfield-vokoj.
    • Tipo-inferenco spuras diversajn efikojn - kromefikoj kaj ne-falantaj. Konstanta disvastigo estas konsiderata, kio signife plibonigas kompiltempan rendimenton. En kelkaj kazoj, ekzemple, vokoj al funkcioj kiuj ne povas esti enliniitaj sed ne influas la rezulton estos forĵetitaj ĉe rultempo. Reguloj por efikoj povas esti anstataŭitaj permane uzante la makroon Base.@assume_effects.
    • Antaŭkompilado (kun eksplicitaj antaŭkompilaj direktivoj aŭ specifitaj laborkvantoj) nun ŝparas pli tip-difinitan kodon, rezultigante pli rapidan unuafojan ekzekuton. Ĉiuj novaj metodoj/tipaj kombinaĵoj bezonataj de via pakaĵo, sendepende de kie tiuj metodoj estis difinitaj, nun povas esti konservitaj en la antaŭkompila dosiero se ili estas vokataj de metodo apartenanta al via pakaĵo.
  • Ŝanĝoj al Komandliniaj Opcioj
    • La defaŭlta konduto por monitorado de @inbounds-deklaroj nun estas la aŭtomata opcio en "--check-bounds=yes|no|auto".
    • Nova "--strip-metadata" opcio por forigi docstrings, fontlokajn informojn kaj lokajn variablonomojn dum kreado de sistema bildo.
    • Nova opcio "--strip-ir" por permesi al la kompililo forigi la mezan fontkodan reprezenton dum konstruado de la sistembildo. La rezulta bildo funkcios nur se "--compile=all" estas uzata aŭ se la tuta bezonata kodo estas antaŭkompilita.
    • Se la signo "-" estas specifita anstataŭ la dosiernomo, tiam la plenumebla kodo estas legita el la norma eniga fluo.
  • Multfadenaj subtenaj ŝanĝoj
    • Threads.@threads defaŭlte uzas la novan programan opcion :dynamic, kiu diferencas de la antaŭa reĝimo, ke ripetoj estos planitaj dinamike tra disponeblaj laborfadenoj prefere ol esti asignitaj al ĉiu fadeno. Ĉi tiu reĝimo permesas pli bonan distribuadon de nestitaj bukloj kun @spawn kaj @threads.
  • Novaj bibliotekaj funkcioj
    • eachsplit(str) por ekzekuti split(str) plurfoje.
    • allequal(itr) por testi ĉu ĉiuj elementoj en iteratoro estas egalaj.
    • hardlink(src, dst) povas esti uzata por krei malmolajn ligilojn.
    • setcpuaffinity(cmd, cpus) por agordi la afinecon de la procesorkerno al la lanĉitaj procezoj.
    • diskstat(path=pwd()) por akiri diskostatistikojn.
    • Nova makroo @showtime por montri kaj la taksitan linion kaj la raporton @time.
    • LazyString kaj lazy"str" ​​​​makro estis aldonitaj por subteni maldiligentan konstruadon de erarmesaĝoj en erarvojoj.
    • Riparis samtempan problemon en Dict kaj aliaj derivitaj objektoj kiel ŝlosiloj(::Dict), valoroj(::Dict) kaj Aro. Ripetmetodoj nun povas esti vokitaj sur vortaro aŭ aro, kondiĉe ke ne ekzistas vokoj kiuj modifas la vortaron aŭ aron.
    • @time kaj @timev nun havas laŭvolan priskribon, permesante al vi komentari la fonton de temporaportoj, ekzemple. @time "Taksante foo" foo().
    • intervalo prenas aŭ halton aŭ longon kiel sian nuran ŝlosilvorton.
    • precizeco kaj setprecision nun akceptas bazon kiel ŝlosilvorton
    • TCP-ingaj objektoj nun provizas proksiman skribmetodon kaj subtenas la uzon de duonmalferma reĝimo.
    • extrema nun akceptas init-argumenton.
    • Iterators.countfrom nun akceptas ajnan tipon, kiu difinas +-metodon.
    • @time nun asignas la % de tempo elspezita rekompilanta metodojn kun ŝanĝitaj tipoj.
  • Normaj Biblioteko Ŝanĝoj
    • Ŝlosiloj kun valoro Nenio nun estas forigita de la medio en addenv.
    • Iteratoroj.reverse (kaj do lasta) subtenas ĉiun linion.
    • La longofunkcio por intervaloj de certaj tipoj ne plu kontrolas entjeran superfluon. Nova funkcio, checked_length, estas havebla; ĝi enhavas bita-transigan kontrollogikon. Se necese, uzu SaferIntegers.jl por konstrui la gamon.
    • La Iterator.Reverse iterator efektivigas ĉiun indeksan inversigon se eble.
  • Paka Administranto
    • Novaj indikiloj ⌃ kaj ⌅ apud pakaĵoj en la stato “pkg>” por kiuj novaj versioj estas disponeblaj. ⌅ indikas, ke novaj versioj ne povas esti instalitaj.
    • Nova malmoderna::Bool argumento al Pkg.status (--malmoderna aŭ -o en REPL-reĝimo) por montri informojn pri pakaĵoj de antaŭaj versioj.
    • Nova argumento compat::Bool al Pkg.status (--compat aŭ -c en REPL-reĝimo) por montri iujn ajn [compat] enirojn en Project.toml.
    • Nova "pkg>compat" (kaj Pkg.compat) reĝimo por agordi projektajn kongruecajn enskribojn. Disponigas interagan redaktilon per "pkg>compat" aŭ rekta kontrolo de registro per "pkg>Foo 0.4,0.5", kiu povas ŝarĝi aktualajn rekordojn per klapeta kompletigo. Tio estas, "pkg> compat Fo " estas aŭtomate ĝisdatigita al "pkg>Foo 0.4,0.5" por permesi redaktadon de ekzistanta enskribo.
    • Pkg nun nur provas elŝuti pakaĵojn de pakaĵservilo se la servilo kontrolas la registron enhavantan la pakaĵon.
    • Pkg.instantiate nun eligos averton kiam Project.toml estas malsinkronigita kun Manifest.toml. Ĝi faras tion surbaze de hash de la deps kaj kompat-rekordoj de la projekto (aliaj kampoj estas ignoritaj) en la manifesto dum solvado de ĝi, tiel ke ajna ŝanĝo al la Project.toml deps aŭ kompat-rekordoj povas esti detektita sen re-solvado.
    • Se "pkg>add" ne povas trovi pakaĵon kun la persona nomo, ĝi nun proponos pakojn kun similaj nomoj aldoneblaj.
    • La versio de julia konservita en la manifesto ne plu inkluzivas la konstruan numeron, tio signifas, ke majstro nun estos skribita kiel 1.9.0-DEV.
    • Testa interrompo "pkg>" nun estos detektita pli konsekvence, kaj estos ĝuste resendita al la REPL.
  • InteractiveUtils
    • Nova @time_imports makroo por raporti tempon pasigitan por importado de pakaĵoj kaj iliaj dependecoj, elstarigante kompilon kaj rekompiltempon kiel procento de importado.
  • Lineara algebro
    • La BLAS-submodulo nun subtenas nivel-2 BLAS spr!-funkciojn.
    • La norma biblioteko LinearAlgebra.jl nun estas tute sendependa de SparseArrays.jl, kaj de fontkodo kaj unutesta perspektivo. Kiel sekvo, malabundaj tabeloj ne plu estas resenditaj (implicite) per metodoj de LinearAlgebra aplikita al Bazo aŭ LinearAlgebra objektoj. Aparte, ĉi tio kondukas al la sekvaj rompiĝaj ŝanĝoj:
      • Kunkatenoj uzantaj specialajn "maldensajn" matricojn (ekz. diagonalo) nun redonas densajn matricojn; Kiel sekvo, la D1 kaj D2-kampoj de SVD-objektoj kreitaj per getproperty-vokoj nun estas densaj matricoj.
      • La simila (::SpecialSparseMatrix, ::Type, ::Dims) metodo liveras densan nulan matricon. Kiel sekvo, produktoj de du-, tri-, kaj simetriaj tridiagonalaj matricoj kun unu la alian kondukas al la generacio de densa matrico. Aldone, konstrui similajn matricojn kun tri argumentoj el specialaj "maldensaj" matricoj de (ne-senmovaj) matricoj nun malsukcesas pro "nul(::Tipo{Matrico{T}})".
  • Printf
    • %s kaj %c nun uzas la argumenton textwidth por formi la larĝon.
  • Profilo
    • CPU-ŝarĝoprofilado nun registras metadatenojn inkluzive de fadenoj kaj taskoj. Profile.print() havas novan grupan argumenton, kiu ebligas al vi grupigi fadenojn, taskojn aŭ subfadenojn/taskojn, taskojn/fadenojn, kaj fadenojn kaj taskojn por provizi filtradon. Plie, utiliga procento nun estas raportita aŭ kiel entute aŭ per fadeno, depende de ĉu la fadeno estas neaktiva aŭ ne en ĉiu provaĵo. Profile.fetch() inkluzivas la novajn metadatenojn defaŭlte. Por retrokongruo kun eksteraj konsumantoj de profilaj datumoj, ĝi povas esti ekskludita pasante include_meta=false.
    • La nova modulo Profile.Allocs permesas profili memorajn atribuojn. Stakspuro de la tipo kaj grandeco de ĉiu memorasigno estas registrita, kaj la sample_rate argumento permesas agordeblan nombron da asignoj esti preterlasita, reduktante efikecon.
    • Fiksa daŭro CPU-profilado nun povas esti rulita de la uzanto dum taskoj funkcias sen unue ŝarĝi la profilon, kaj la raporto estos montrita dum funkciado. Sur MacOS kaj FreeBSD, premu ctrl-t aŭ voku SIGINFO. Por aliaj platformoj, aktivigu SIGUSR1, t.e. % kill -USR1 $julia_pid. Ĉi tio ne disponeblas en Vindozo.
  • REPL
    • RadioMenu nun subtenas kromajn klavarajn ŝparvojojn por rekta elekto de opcioj.
    • La sinsekvo "?(x, y" sekvata de premado de TAB montras ĉiujn metodojn, kiujn oni povas voki per argumentoj x, y, .... (Gvida spaco malhelpas vin eniri helpreĝimon.) "Mia Modulo.?(x, y " limigas la serĉon al "Mia Modulo". Premante TAB postulas ke almenaŭ unu argumento estu de tipo pli specifa ol Any. Aŭ uzu MAJJ-TAB anstataŭ TAB por permesi iujn ajn kongruajn metodojn.
    • La nova tutmonda variablo err permesas al vi ricevi la lastan escepton, simile al la konduto de ans kun la lasta respondo. Enigi eraron represas la esceptajn informojn.
  • SparseArrays
    • Movis la SparseArrays-kodon de la Julia deponejo al la ekstera SparseArrays.jl deponejo.
    • La novaj kunligaj funkcioj sparse_hcat, sparse_vcat kaj sparse_hvcat resendas SparseMatrixCSC tipon sendepende de la specoj de la enigargumentoj. Tio iĝis necesa unuigi la mekanismon por gluado de matricoj post apartigado de la LinearAlgebra.jl kaj SparseArrays.jl-kodo.
  • tala
    • La normaj registradaj niveloj BelowMinLevel, Debug, Info, Warn, Error kaj AboveMaxLevel nun estas eksportitaj el la norma Logging-biblioteko.
  • Unikodo
    • Aldonita isequal_normalized-funkcio por kontroli Unikodan ekvivalenton sen eksplicite konstrui normaligitajn ĉenojn.
    • La Unicode.normalize-funkcio nun akceptas la charttransform-ŝlosilvorton, kiu povas esti uzata por disponigi kutimajn signajn mapojn, kaj la Unicode.julia_chartransform-funkcio ankaŭ estas disponigita por reprodukti la mapadon uzatan kiam la Julia analizilo normaligas identigilojn.
  • testo
    • '@test_throws "iu mesaĝo" triggers_error()' nun povas esti uzata por testi ĉu la montrata erarteksto enhavas eraron "iu mesaĝo", sendepende de la specifa esceptotipo. Regulaj esprimoj, kordlistoj kaj kongruaj funkcioj ankaŭ estas subtenataj.
    • @testset foo() nun povas esti uzata por krei testaron el donita funkcio. La testkaza nomo estas la nomo de la funkcio vokita. La nomita funkcio povas enhavi @test kaj aliajn @testset-difinojn, inkluzive por vokoj al aliaj funkcioj, dum registrante ĉiujn mezajn testrezultojn.
    • TestLogger kaj LogRecord nun estas eksportitaj el la norma Test-biblioteko.
  • distribuita
    • SSHManager nun subtenas laborfadenojn kun csh/tcsh envolvaĵo per la addprocs() metodo kaj la shell=:csh parametro.
  • Aliaj ŝanĝoj
    • GC.enable_logging(true) povas esti uzata por registri ĉiun rubkolektan operacion kun la tempo kaj kvanto de memoro kolektita.

fonto: opennet.ru

Aldoni komenton