Izdanje programskog jezika Julia 1.8

Dostupno je izdanje programskog jezika Julia 1.8, koji kombinira kvalitete kao što su visoka izvedba, podrška za dinamičko tipkanje i ugrađeni alati za paralelno programiranje. Julijina sintaksa je bliska MATLAB-u, posuđujući neke elemente iz Rubyja i Lispa. Metoda manipulacije stringovima podsjeća na Perl. Kod projekta se distribuira pod licencom MIT-a.

Ključne značajke jezika:

  • Visoke performanse: jedan od ključnih ciljeva projekta je postizanje performansi bliskih C programima. Kompajler Julia temelji se na projektu LLVM i generira učinkovit izvorni strojni kod za mnoge ciljne platforme;
  • Podrška za različite programske paradigme, uključujući elemente objektno orijentiranog i funkcionalnog programiranja. Standardna biblioteka nudi funkcije za asinkroni I/O, upravljanje procesima, bilježenje, profiliranje i upravljanje paketima, između ostalog;
  • Dinamičko tipkanje: jezik ne zahtijeva eksplicitnu definiciju tipova za varijable, analogno skriptnim programskim jezicima. Podržava interaktivni način rada;
  • Neobavezna mogućnost eksplicitnog određivanja tipova;
  • Sintaksa koja je izvrsna za numeričke izračune, znanstvene izračune, sustave strojnog učenja i vizualizaciju podataka. Podrška za mnoge tipove numeričkih podataka i alate za paraleliziranje izračuna.
  • Mogućnost izravnog pozivanja funkcija iz C knjižnica bez dodatnih slojeva.

Glavne promjene u Juliji 1.8:

  • Nove jezične značajke
    • Polja promjenjive strukture sada se mogu označiti kao konstante kako bi se spriječilo njihovo mijenjanje i omogućila optimizacija.
    • Oznake tipa mogu se dodati globalnim varijablama.
    • Prazni n-dimenzionalni nizovi mogu se stvoriti pomoću više točaka i zareza unutar uglatih zagrada, na primjer "[;;;]" stvara niz 0x0x0.
    • Blokovi Try sada po izboru mogu imati else blok, koji se izvršava odmah nakon glavnog tijela ako nije došlo do pogreške.
    • @inline i @noinline mogu se smjestiti unutar tijela funkcije, omogućujući vam da označite anonimnu funkciju.
    • @inline i @noinline sada se mogu primijeniti na funkciju u pozivnom mjestu ili bloku kako bi se natjeralo da se odgovarajući pozivi funkcija uključe (ili ne uključe).
    • ∀, ∃ i ∄ dopušteni su kao identifikatorski znakovi.
    • Dodana podrška za specifikaciju Unicode 14.0.0.
    • Metoda Module(:name, false, false) može se koristiti za stvaranje modula koji ne sadrži imena, ne uvozi Base ili Core i ne sadrži referencu na sebe.
  • Jezične promjene
    • Novostvoreni objekti zadatka (@spawn, @async, itd.) sada imaju world_age za metode iz nadređenog zadatka kada su stvoreni, što omogućuje optimizirano izvršenje. Prethodna opcija aktivacije dostupna je pomoću metode Base.invokelatest.
    • Unicode neuravnotežene direktive za dvosmjerno oblikovanje sada su zabranjene u nizovima i komentarima kako bi se izbjegle injekcije.
    • Base.ifelse sada je definiran kao generička funkcija, a ne ugrađena, što omogućuje paketima da prošire svoju definiciju.
    • Svaka dodjela globalnoj varijabli sada prvo prolazi kroz poziv za convert(Any, x) ili convert(T, x) ako je globalna varijabla deklarirana kao tip T. Prije upotrebe globalnih varijabli, osigurajte da nepromjenjiva convert(Any , x) === x je uvijek istina, inače može dovesti do neočekivanog ponašanja.
    • Ugrađene funkcije sada su slične generičkim funkcijama i mogu se programski nabrojati pomoću metoda.
  • Poboljšanja kompilatora/vremena izvođenja
    • Vrijeme pokretanja smanjeno za približno 25%.
    • Prevodilac temeljen na LLVM-u odvojen je od biblioteke vremena izvođenja u novu biblioteku, libjulia-codegen. Učitava se prema zadanim postavkama, tako da ne bi trebalo biti promjena tijekom normalne upotrebe. U implementacijama koje ne trebaju kompajler (na primjer, slike sustava u kojima je sav potreban kod unaprijed kompajliran), ova se biblioteka (i njezina LLVM ovisnost) može jednostavno izostaviti.
    • Zaključivanje uvjetnog tipa sada je moguće prosljeđivanjem argumenta metodi. Na primjer, za Base.ifelse(isa(x, Int), x, 0) vraća ::Int čak i ako je tip x nepoznat.
    • SROA (skalarna zamjena agregata) je poboljšana: eliminira getfield pozive s trajnim globalnim poljima, eliminira promjenjive strukture s neinicijaliziranim poljima, poboljšava performanse i rukovanje ugniježđenim getfield pozivima.
    • Zaključivanje tipa prati različite učinke—nuspojave i neispuštanje. Konstantno širenje se uzima u obzir, što značajno poboljšava performanse u vrijeme prevođenja. U nekim slučajevima, na primjer, pozivi funkcija koje se ne mogu umetnuti, ali ne utječu na rezultat bit će odbačeni tijekom izvođenja. Pravila za efekte mogu se ručno prebrisati pomoću makronaredbe Base.@assume_effects.
    • Predkompilacija (s izričitim direktivama predkompilacije ili određenim radnim opterećenjima) sada sprema više koda definiranog tipom, što rezultira bržim prvim izvršavanjem. Sve nove kombinacije metoda/vrsta koje su potrebne vašem paketu, bez obzira na to gdje su te metode definirane, sada se mogu pohraniti u predmemorijsku datoteku ako ih pozove metoda koja pripada vašem paketu.
  • Promjene parametara naredbenog retka
    • Zadano ponašanje za praćenje @inbounds deklaracija sada je auto opcija u "--check-bounds=yes|no|auto".
    • Nova opcija "--strip-metadata" za uklanjanje nizova dokumenata, informacija o izvornoj lokaciji i naziva lokalnih varijabli prilikom stvaranja slike sustava.
    • Nova opcija "--strip-ir" koja omogućava kompajleru da ukloni srednji prikaz izvornog koda prilikom izgradnje slike sustava. Rezultirajuća slika će raditi samo ako se koristi "--compile=all" ili ako je sav potreban kod unaprijed kompajliran.
    • Ako je znak "-" naveden umjesto naziva datoteke, tada se izvršni kod čita iz standardnog ulaznog toka.
  • Promjene u podršci za višenitnost
    • Threads.@threads prema zadanim postavkama koristi novu opciju raspoređivanja :dynamic, koja se razlikuje od prethodnog načina po tome što će se iteracije dinamički raspoređivati ​​u dostupnim radnim nitima umjesto da se dodjeljuju svakoj niti. Ovaj način rada omogućuje bolju distribuciju ugniježđenih petlji s @spawn i @threads.
  • Nove funkcije knjižnice
    • eachsplit(str) za izvršavanje split(str) više puta.
    • allequal(itr) za testiranje jesu li svi elementi u iteratoru jednaki.
    • hardlink(src, dst) može se koristiti za stvaranje tvrdih veza.
    • setcpuaffinity(cmd, cpus) za postavljanje afiniteta jezgre procesora prema pokrenutim procesima.
    • diskstat(path=pwd()) za dobivanje statistike diska.
    • Nova makronaredba @showtime za prikaz linije koja se procjenjuje i izvješća @time.
    • LazyString i lazy"str" ​​​​makro dodani su za podršku lijenoj konstrukciji poruka o pogrešci u stazama pogreške.
    • Riješen je problem paralelnosti u Dictu i drugim izvedenim objektima kao što su ključevi(::Dict), vrijednosti(::Dict) i Set. Metode ponavljanja sada se mogu pozivati ​​na rječniku ili skupu, sve dok nema poziva koji modificiraju rječnik ili skup.
    • @time i @timev sada imaju izborni opis, što vam omogućuje da na primjer označite izvor izvješća o vremenu. @time "Procjena foo" foo().
    • raspon uzima ili stop ili duljinu kao jedini argument ključne riječi.
    • precision i setprecision sada prihvaćaju base kao ključnu riječ
    • Objekti TCP utičnica sada pružaju metodu closewrite i podržavaju korištenje poluotvorenog načina.
    • extrema sada prihvaća init argument.
    • Iterators.countfrom sada prihvaća bilo koji tip koji definira + metodu.
    • @time sada dodjeljuje % vremena utrošenog na ponovno kompajliranje metoda s promijenjenim tipovima.
  • Promjene standardne biblioteke
    • Ključevi s vrijednošću Ništa se sada ne uklanjaju iz okruženja u addenv.
    • Iterators.reverse (i stoga zadnji) podržava svaki redak.
    • Funkcija duljine za raspone određenih vrsta više ne provjerava prekoračenje cijelog broja. Dostupna je nova funkcija, checked_length, koja sadrži logiku kontrole prijenosa bitova. Ako je potrebno, upotrijebite SaferIntegers.jl za konstrukciju tipa raspona.
    • Iterators.Reverse iterator implementira reverziju svakog indeksa ako je moguće.
  • Upravitelj paketa
    • Novi indikatori ⌃ i ⌅ pored paketa u statusu “pkg>” za koje su dostupne nove verzije. ⌅ označava da se nove verzije ne mogu instalirati.
    • Novi zastarjeli::Bool argument za Pkg.status (--zastarjelo ili -o u REPL načinu) za prikaz informacija o paketima iz prethodnih verzija.
    • Novi argument compat::Bool za Pkg.status (--compat ili -c u REPL modu) za prikaz [compat] unosa u Project.toml.
    • Novi način rada "pkg>compat" (i Pkg.compat) za postavljanje unosa kompatibilnosti projekta. Omogućuje interaktivni uređivač putem "pkg>compat" ili izravnu kontrolu zapisa putem "pkg>Foo 0.4,0.5", koji može učitati trenutne zapise putem dovršetka kartice. To jest, "pkg> compat Fo" automatski se ažurira na "pkg> Foo 0.4,0.5" tako da se postojeći unos može uređivati.
    • Pkg sada samo pokušava preuzeti pakete s poslužitelja paketa ako poslužitelj nadzire registar koji sadrži paket.
    • Pkg.instantiate sada će izdati upozorenje kada Project.toml nije sinkroniziran s Manifest.toml. To čini na temelju raspršivanja deps i compat zapisa projekta (druga polja se zanemaruju) u manifestu prilikom rješavanja, tako da se svaka promjena Project.toml deps ili compat zapisa može otkriti bez ponovnog rješavanja.
    • Ako "pkg>add" ne može pronaći paket s danim imenom, sada će predložiti pakete sa sličnim nazivima koji se mogu dodati.
    • Verzija julia pohranjena u manifestu više ne uključuje broj međugradnje, što znači da će master sada biti napisan kao 1.9.0-DEV.
    • Prekid testa "pkg>" sada će se dosljednije otkrivati ​​i ispravno vraćati u REPL.
  • InteractiveUtils
    • Nova makronaredba @time_imports za izvješćivanje o vremenu utrošenom na uvoz paketa i njihovih ovisnosti, ističući vrijeme kompajliranja i ponovnog kompajliranja kao postotak uvoza.
  • Linearna algebra
    • Podmodul BLAS sada podržava funkcije BLAS spr! razine 2.
    • Standardna biblioteka LinearAlgebra.jl sada je potpuno neovisna o SparseArrays.jl, kako iz perspektive izvornog koda tako i iz perspektive testiranja jedinica. Kao posljedica toga, prorijeđene nizove više ne vraćaju (implicitno) metode iz LinearAlgebre primijenjene na objekte Base ili LinearAlgebra. Konkretno, to dovodi do sljedećih prijelomnih promjena:
      • Ulančavanje pomoću posebnih "rijetkih" matrica (npr. dijagonalnih) sada vraća guste matrice; Kao posljedica toga, polja D1 i D2 SVD objekata stvorenih pozivima getproperty sada su guste matrice.
      • Metoda similar(::SpecialSparseMatrix, ::Type, ::Dims) vraća gustu nultu matricu. Kao posljedica toga, produkti dvo-, tro- i simetričnih trodijagonalnih matrica međusobno dovode do stvaranja guste matrice. Dodatno, konstruiranje sličnih matrica s tri argumenta iz posebnih "rijetkih" matrica iz (nestatičnih) matrica sada ne uspijeva zbog "nula(::Tip{Matrix{T}})".
  • Printf
    • %s i %c sada koriste argument textwidth za formatiranje širine.
  • Profil
    • Profiliranje CPU opterećenja sada bilježi metapodatke uključujući niti i zadatke. Profile.print() ima novi argument groupby koji vam omogućuje grupiranje niti, zadataka ili podniti/zadataka, zadataka/niti te argumenata niti i zadataka kako biste omogućili filtriranje. Dodatno, postotak iskorištenosti sada se prijavljuje ili kao ukupni ili po niti, ovisno o tome je li nit u stanju mirovanja ili ne u svakom uzorku. Profile.fetch() prema zadanim postavkama uključuje nove metapodatke. Za kompatibilnost unazad s vanjskim potrošačima podataka profiliranja, može se isključiti prosljeđivanjem include_meta=false.
    • Novi modul Profile.Allocs omogućuje profiliranje dodjele memorije. Bilježi se praćenje hrpe vrste i veličine svake dodjele memorije, a argument sample_rate omogućuje preskakanje podesivog broja dodjela, smanjujući opterećenje performansi.
    • Korisnik sada može pokrenuti CPU profiliranje s fiksnim trajanjem dok se zadaci izvode bez prethodnog učitavanja profila, a izvješće će se prikazivati ​​tijekom izvođenja. Na MacOS-u i FreeBSD-u pritisnite ctrl-t ili pozovite SIGINFO. Za ostale platforme aktivirajte SIGUSR1, tj. % ubij -USR1 $julia_pid. Ovo nije dostupno u sustavu Windows.
  • ZAMJENA
    • RadioMenu sada podržava dodatne tipkovničke prečace za izravan odabir opcija.
    • Niz "?(x, y" nakon kojeg slijedi pritisak na TAB prikazuje sve metode koje se mogu pozvati s argumentima x, y, .... (Razmak na početku sprječava vas da uđete u način rada za pomoć.) "MyModule.?(x, y " ograničava pretraživanje na "MyModule". Pritiskom na TAB potrebno je da barem jedan argument bude specifične vrste od bilo kojeg. Ili upotrijebite SHIFT-TAB umjesto TAB kako biste omogućili bilo koju kompatibilnu metodu.
    • Nova globalna varijabla err omogućuje vam da dobijete najnoviju iznimku, slično ponašanju ans sa zadnjim odgovorom. Unosom pogreške ponovno se ispisuju informacije o iznimci.
  • Rijetki nizovi
    • Premješten kod SparseArrays iz repozitorija Julia u vanjski repozitorij SparseArrays.jl.
    • Nove funkcije ulančavanja sparse_hcat, sparse_vcat i sparse_hvcat vraćaju tip SparseMatrixCSC bez obzira na tipove ulaznih argumenata. Ovo je postalo neophodno za objedinjavanje mehanizma za lijepljenje matrica nakon odvajanja koda LinearAlgebra.jl i SparseArrays.jl.
  • Sječa drveta
    • Standardne razine zapisivanja BelowMinLevel, Debug, Info, Warn, Error i AboveMaxLevel sada se izvoze iz standardne biblioteke zapisivanja.
  • unicode
    • Dodana isequal_normalized funkcija za provjeru Unicode ekvivalentnosti bez eksplicitne konstrukcije normaliziranih nizova.
    • Funkcija Unicode.normalize sada prihvaća ključnu riječ charttransform, koja se može koristiti za pružanje prilagođenih mapiranja znakova, a funkcija Unicode.julia_chartransform također je dostupna za reprodukciju mapiranja koje se koristi kada Julia parser normalizira identifikatore.
  • test
    • '@test_throws "neka poruka" triggers_error()' sada se može koristiti za testiranje sadrži li prikazani tekst pogreške pogrešku "neka poruka", bez obzira na određenu vrstu iznimke. Također su podržani regularni izrazi, popisi nizova i funkcije podudaranja.
    • @testset foo() sada se može koristiti za stvaranje testnog skupa iz zadane funkcije. Naziv testnog slučaja je naziv funkcije koja se poziva. Pozvana funkcija može sadržavati @test i druge @testset definicije, uključujući za pozive drugih funkcija, dok bilježi sve međurezultate testa.
    • TestLogger i LogRecord sada se izvoze iz standardne testne biblioteke.
  • distribuiran
    • SSHManager sada podržava radne niti s omotom csh/tcsh putem metode addprocs() i parametra shell=:csh.
  • Ostale promjene
    • GC.enable_logging(true) može se koristiti za zapisivanje svake operacije skupljanja smeća s vremenom i količinom prikupljene memorije.

Izvor: opennet.ru

Dodajte komentar