Izdaja programskega jezika Julia 1.8

Na voljo je izdaja programskega jezika Julia 1.8, ki združuje lastnosti, kot so visoka zmogljivost, podpora za dinamično tipkanje in vgrajena orodja za vzporedno programiranje. Julijina sintaksa je blizu MATLAB-u, nekaj elementov pa si je sposodil od Rubyja in Lispa. Metoda manipulacije nizov spominja na Perl. Koda projekta se distribuira pod licenco MIT.

Glavne značilnosti jezika:

  • Visoka zmogljivost: eden ključnih ciljev projekta je doseči zmogljivost, ki je blizu C programom. Prevajalnik Julia temelji na delu projekta LLVM in ustvarja učinkovito domačo strojno kodo za številne ciljne platforme;
  • Podpira različne paradigme programiranja, vključno z elementi objektno usmerjenega in funkcionalnega programiranja. Standardna knjižnica med drugim zagotavlja funkcije za asinhroni V/I, nadzor procesa, beleženje, profiliranje in upravljanje paketov;
  • Dinamično tipkanje: jezik ne zahteva eksplicitne definicije tipov za spremenljivke, podobno kot skriptni programski jeziki. Podprt interaktivni način;
  • Izbirna zmožnost eksplicitnega določanja tipov;
  • Idealna sintaksa za numerično računalništvo, znanstveno računalništvo, strojno učenje in vizualizacijo podatkov. Podpora za številne tipe numeričnih podatkov in orodja za paralelizacijo izračunov.
  • Možnost neposrednega klicanja funkcij iz knjižnic C brez dodatnih slojev.

Večje spremembe v Julii 1.8:

  • Nove jezikovne funkcije
    • Polja spremenljive strukture je zdaj mogoče označiti kot konstante, da preprečite njihovo spreminjanje in omogočite optimizacijo.
    • Opombe tipa je mogoče dodati globalnim spremenljivkam.
    • Prazne n-dimenzionalne nize je mogoče ustvariti z uporabo več podpičja znotraj oglatih oklepajev, na primer "[;;;]" ustvari niz 0x0x0.
    • Bloki Try lahko zdaj po želji vsebujejo blok else, ki se izvede takoj za glavnim delom, če ni prišlo do napak.
    • @inline in @noinline lahko postavite v telo funkcije, kar vam omogoča, da anonimno funkcijo označite.
    • @inline in @noinline je zdaj mogoče uporabiti za funkcijo na klicnem mestu ali bloku, da vsilite vključitev (ali nevključitev) ustreznih funkcijskih klicev.
    • ∀, ∃ in ∄ so dovoljeni kot identifikacijski znaki.
    • Dodana podpora za specifikacijo Unicode 14.0.0.
    • Metodo Module(:name, false, false) lahko uporabite za ustvarjanje modula, ki ne vsebuje imen, ne uvaža Base ali Core in ne vsebuje sklicevanja na samega sebe.
  • Spremembe v jeziku
    • Na novo ustvarjeni objekti opravila (@spawn, @async itd.) imajo zdaj world_age za metode iz nadrejenega opravila, ko so ustvarjeni, kar omogoča optimizirano izvajanje. Prejšnja možnost aktivacije je na voljo z uporabo metode Base.invokelatest.
    • Direktive za neuravnoteženo dvosmerno oblikovanje Unicode so zdaj prepovedane v nizih in komentarjih, da bi se izognili vbrizgavanju.
    • Base.ifelse je zdaj definiran kot generična funkcija in ne vgrajena, kar paketom omogoča razširitev njene definicije.
    • Vsaka dodelitev globalni spremenljivki gre zdaj najprej skozi klic za convert(Any, x) ali convert(T, x), če je bila globalna spremenljivka deklarirana kot tip T. Pred uporabo globalnih spremenljivk zagotovite, da je invariant convert(Any , x) === x je vedno res, sicer lahko povzroči nepričakovano vedenje.
    • Vgrajene funkcije so zdaj podobne generičnim funkcijam in jih je mogoče programsko oštevilčiti z uporabo metod.
  • Izboljšave prevajalnika/izvajalnega okolja
    • Čas zagona se zmanjša za približno 25 %.
    • Prevajalnik, ki temelji na LLVM, je bil ločen od knjižnice izvajalnega okolja v novo knjižnico, libjulia-codegen. Naložen je privzeto, zato med običajno uporabo ne bi smelo biti sprememb. Pri razmestitvah, ki ne potrebujejo prevajalnika (na primer slike sistema, v katerih je vsa potrebna koda vnaprej prevedena), lahko to knjižnico (in njeno odvisnost od LLVM) preprosto izpustite.
    • Sklepanje pogojnega tipa je zdaj možno s posredovanjem argumenta metodi. Na primer, za Base.ifelse(isa(x, Int), x, 0) vrne ::Int, tudi če je vrsta x neznana.
    • SROA (skalarna zamenjava agregatov) je bila izboljšana: odpravlja klice getfield s trajnimi globalnimi polji, odpravlja spremenljive strukture z neinicializiranimi polji, izboljšuje zmogljivost in obravnavanje ugnezdenih klicev getfield.
    • Sklepanje o vrsti spremlja različne učinke – stranske učinke in nespuščanje. Upošteva se konstantno razmnoževanje, kar bistveno izboljša zmogljivost med prevajanjem. V nekaterih primerih bodo na primer klici funkcij, ki jih ni mogoče vstaviti, vendar ne vplivajo na rezultat, med izvajanjem zavrženi. Pravila za učinke je mogoče ročno prepisati z uporabo makra Base.@assume_effects.
    • Vnaprejšnje prevajanje (z izrecnimi direktivami predprevajanja ali določenimi delovnimi obremenitvami) zdaj shrani več tipsko definirane kode, kar ima za posledico hitrejšo prvo izvedbo. Vse nove kombinacije metode/vrste, ki jih potrebuje vaš paket, ne glede na to, kje so bile te metode definirane, je zdaj mogoče predpomniti v datoteko za predprevajanje, če jih pokliče metoda, ki pripada vašemu paketu.
  • Spremembe možnosti ukazne vrstice
    • Privzeto vedenje za spremljanje deklaracij @inbounds je zdaj samodejna možnost v "--check-bounds=yes|no|auto".
    • Nova možnost »--strip-metadata« za odstranitev nizov dokumentov, informacij o izvorni lokaciji in imen lokalnih spremenljivk pri ustvarjanju sistemske slike.
    • Nova možnost "--strip-ir", ki omogoča prevajalniku, da odstrani vmesno predstavitev izvorne kode pri gradnji sistemske slike. Dobljena slika bo delovala samo, če je uporabljen "--compile=all" ali če je vsa zahtevana koda vnaprej prevedena.
    • Če je namesto imena datoteke podan znak "-", se izvršljiva koda prebere iz standardnega vhodnega toka.
  • Spremembe podpore za večnitnost
    • Threads.@threads privzeto uporablja novo možnost razporejanja :dynamic, ki se od prejšnjega načina razlikuje po tem, da bodo iteracije dinamično razporejene po razpoložljivih delovnih nitih, namesto da bi bile dodeljene vsaki niti. Ta način omogoča boljšo porazdelitev ugnezdenih zank z @spawn in @threads.
  • Nove knjižnične funkcije
    • eachsplit(str) za večkratno izvedbo split(str).
    • allequal(itr), da preizkusite, ali so vsi elementi v iteratorju enaki.
    • hardlink(src, dst) lahko uporabite za ustvarjanje trdih povezav.
    • setcpuaffinity(cmd, cpus) za nastavitev afinitete jedra procesorja do zagnanih procesov.
    • diskstat(path=pwd()), da dobite statistiko diska.
    • Nov makro @showtime za prikaz vrstice, ki se ocenjuje, in poročila @time.
    • LazyString in lazy"str" ​​​​makro sta bila dodana za podporo lene konstrukcije sporočil o napakah v poteh napak.
    • Odpravljena težava s sočasnostjo v Dictu in drugih izpeljanih predmetih, kot so ključi(::Dict), vrednosti(::Dict) in Set. Iteracijske metode je zdaj mogoče klicati v slovarju ali nizu, če ni nobenih klicev, ki spreminjajo slovar ali niz.
    • @time in @timev imata zdaj neobvezen opis, ki vam omogoča, da na primer označite vir časovnih poročil. @time "Vrednotenje foo" foo().
    • obseg kot edini argument ključne besede sprejme stop ali dolžino.
    • precision in setprecision zdaj sprejemata base kot ključno besedo
    • Objekti vtičnice TCP zdaj zagotavljajo metodo closewrite in podpirajo uporabo polodprtega načina.
    • extrema zdaj sprejme init argument.
    • Iterators.countfrom zdaj sprejema vse vrste, ki definirajo metodo +.
    • @time zdaj dodeli % časa, porabljenega za ponovno prevajanje metod s spremenjenimi vrstami.
  • Standardne spremembe knjižnice
    • Ključi z vrednostjo Nothing zdaj niso odstranjeni iz okolja v addenv.
    • Iterators.reverse (in torej zadnji) podpira vsako vrstico.
    • Funkcija dolžine za obsege določenih vrst ne preverja več prekoračitve celega števila. Na voljo je nova funkcija, checked_length, ki vsebuje logiko nadzora prenosa bitov. Po potrebi uporabite SaferIntegers.jl za sestavo vrste obsega.
    • Iterator Iterators.Reverse izvaja obračanje vsakega indeksa, če je to mogoče.
  • Upravitelj paketov
    • Nova indikatorja ⌃ in ⌅ poleg paketov v statusu “pkg>”, za katere so na voljo nove različice. ⌅ označuje, da novih različic ni mogoče namestiti.
    • Nov argument outdated::Bool za Pkg.status (--outdated ali -o v načinu REPL) za prikaz informacij o paketih iz prejšnjih različic.
    • Nov argument compat::Bool za Pkg.status (--compat ali -c v načinu REPL) za prikaz vseh vnosov [compat] v Project.toml.
    • Nov način "pkg>compat" (in Pkg.compat) za nastavitev vnosov združljivosti projekta. Zagotavlja interaktivni urejevalnik prek »pkg>compat« ali neposrednega nadzora zapisov prek »pkg>Foo 0.4,0.5«, ki lahko naloži trenutne zapise prek dokončanja zavihkov. To pomeni, da se "pkg> compat Fo" samodejno posodobi na "pkg> Foo 0.4,0.5", tako da je mogoče urejati obstoječi vnos.
    • Pkg zdaj samo poskuša prenesti pakete s strežnika paketov, če strežnik spremlja register, ki vsebuje paket.
    • Pkg.instantiate bo zdaj izdal opozorilo, ko Project.toml ni sinhroniziran z Manifest.toml. To naredi na podlagi razpršitve deps in compat zapisov projekta (druga polja so prezrta) v manifestu pri njegovem razreševanju, tako da je mogoče kakršno koli spremembo Project.toml deps ali compat zapisov zaznati brez ponovnega razreševanja.
    • Če "pkg>add" ne najde paketa z danim imenom, bo zdaj predlagal pakete s podobnimi imeni, ki jih je mogoče dodati.
    • Različica julia, shranjena v manifestu, ne vključuje več številke gradnje, kar pomeni, da bo master zdaj napisan kot 1.9.0-DEV.
    • Prekinitev preizkusa "pkg>" bo zdaj zaznana bolj dosledno in bo pravilno vrnjena v REPL.
  • InteractiveUtils
    • Nov makro @time_imports za poročanje o času, porabljenem za uvoz paketov in njihovih odvisnosti, s poudarkom na času prevajanja in ponovnega prevajanja kot odstotek uvozov.
  • Linearna algebra
    • Podmodul BLAS zdaj podpira funkcije BLAS spr! na ravni 2.
    • Standardna knjižnica LinearAlgebra.jl je zdaj popolnoma neodvisna od SparseArrays.jl, tako z vidika izvorne kode kot z vidika testiranja enote. Posledično redkih nizov ne vrnejo več (implicitno) metode iz LinearAlgebra, ki se uporabljajo za objekte Base ali LinearAlgebra. To zlasti vodi do naslednjih prelomnih sprememb:
      • Združevanja z uporabo posebnih "redkih" matrik (npr. diagonalnih) zdaj vračajo goste matrike; Posledično sta polji D1 in D2 objektov SVD, ki jih ustvarijo klici getproperty, zdaj goste matrike.
      • Metoda similar(::SpecialSparseMatrix, ::Type, ::Dims) vrne gosto ničelno matriko. Posledično produkti dvo-, tri- in simetričnih tridiagonalnih matrik med seboj vodijo do generiranja goste matrike. Poleg tega konstruiranje podobnih matrik s tremi argumenti iz posebnih "redkih" matrik iz (nestatičnih) matrik zdaj ne uspe zaradi "nič(::Type{Matrix{T}})".
  • Printf
    • %s in %c zdaj uporabljata argument textwidth za oblikovanje širine.
  • profil
    • Profiliranje obremenitve procesorja zdaj beleži metapodatke, vključno z nitmi in opravili. Profile.print() ima nov argument groupby, ki vam omogoča združevanje niti, opravil ali podniti/opravil, opravil/niti ter argumentov niti in opravil za zagotavljanje filtriranja. Poleg tega se odstotek izkoriščenosti zdaj poroča bodisi kot celota bodisi na nit, odvisno od tega, ali je nit v vsakem vzorcu nedejavna ali ne. Profile.fetch() privzeto vključuje nove metapodatke. Za združljivost za nazaj z zunanjimi porabniki profilnih podatkov jih je mogoče izključiti s posredovanjem include_meta=false.
    • Novi modul Profile.Allocs vam omogoča profiliranje dodelitev pomnilnika. Zabeleži se sled sklada o vrsti in velikosti vsake dodelitve pomnilnika, argument sample_rate pa omogoča preskok nastavljivega števila dodelitev, kar zmanjša obremenitev zmogljivosti.
    • Profiliranje CPE s fiksnim trajanjem lahko zdaj uporabnik zažene med izvajanjem nalog, ne da bi predhodno naložil profil, poročilo pa bo prikazano med izvajanjem. V MacOS in FreeBSD pritisnite ctrl-t ali pokličite SIGINFO. Za druge platforme aktivirajte SIGUSR1, tj. % uniči -USR1 $julia_pid. To ni na voljo v sistemu Windows.
  • ODGOVOR
    • RadioMenu zdaj podpira dodatne bližnjice na tipkovnici za neposredno izbiro možnosti.
    • Zaporedje "?(x, y", ki mu sledi pritisk na TAB, prikaže vse metode, ki jih je mogoče poklicati z argumenti x, y, .... (Začetni presledek vam preprečuje vstop v način pomoči.) "MyModule.?(x, y " omeji iskanje na "MyModule". Če pritisnete TAB, mora biti vsaj en argument vrste, ki je bolj specifična od Any. Ali uporabite SHIFT-TAB namesto TAB, da omogočite vse združljive metode.
    • Nova globalna spremenljivka err vam omogoča, da dobite zadnjo izjemo, podobno kot vedenje ans z zadnjim odgovorom. Če vnesete napako, se informacije o izjemi znova natisnejo.
  • SparseArrays
    • Premaknili kodo SparseArrays iz repozitorija Julia v zunanji repozitorij SparseArrays.jl.
    • Nove verižne funkcije sparse_hcat, sparse_vcat in sparse_hvcat vrnejo tip SparseMatrixCSC ne glede na tipe vhodnih argumentov. To je postalo potrebno za poenotenje mehanizma za lepljenje matrik po ločitvi kode LinearAlgebra.jl in SparseArrays.jl.
  • Beleženje
    • Standardne ravni beleženja BelowMinLevel, Debug, Info, Warn, Error in AboveMaxLevel so zdaj izvožene iz standardne knjižnice beleženja.
  • Unicode
    • Dodana funkcija isequal_normalized za preverjanje enakovrednosti Unicode brez izrecne konstrukcije normaliziranih nizov.
    • Funkcija Unicode.normalize zdaj sprejema ključno besedo charttransform, ki jo je mogoče uporabiti za zagotavljanje preslikav znakov po meri, na voljo pa je tudi funkcija Unicode.julia_chartransform za reprodukcijo preslikave, uporabljene, ko razčlenjevalnik Julia normalizira identifikatorje.
  • Test
    • '@test_throws "nekaj sporočila" triggers_error()' je zdaj mogoče uporabiti za preizkus, ali prikazano besedilo napake vsebuje napako "nekaj sporočila", ne glede na določeno vrsto izjeme. Podprti so tudi regularni izrazi, seznami nizov in funkcije za ujemanje.
    • @testset foo() je zdaj mogoče uporabiti za ustvarjanje testnega niza iz dane funkcije. Ime testnega primera je ime klicane funkcije. Klicana funkcija lahko vsebuje @test in druge definicije @testset, vključno s klici drugih funkcij, medtem ko beleži vse vmesne rezultate testa.
    • TestLogger in LogRecord sta zdaj izvožena iz standardne testne knjižnice.
  • Porazdeljeno
    • SSHManager zdaj podpira delovne niti z ovojom csh/tcsh prek metode addprocs() in parametra shell=:csh.
  • Druge spremembe
    • GC.enable_logging(true) lahko uporabite za beleženje vsake operacije zbiranja smeti s časom in količino zbranega pomnilnika.

Vir: opennet.ru

Dodaj komentar