Utgivelse av programmeringsspråket Julia 1.8

Utgivelsen av programmeringsspråket Julia 1.8 er tilgjengelig, og kombinerer slike egenskaper som høy ytelse, støtte for dynamisk skriving og innebygde verktøy for parallell programmering. Julias syntaks er nær MATLAB, og låner noen elementer fra Ruby og Lisp. Strengemanipulasjonsmetoden minner om Perl. Prosjektkoden distribueres under MIT-lisensen.

Hovedtrekk ved språket:

  • Høy ytelse: et av hovedmålene for prosjektet er å oppnå ytelse nær C-programmer. Julia-kompilatoren er basert på arbeidet til LLVM-prosjektet og genererer effektiv innebygd maskinkode for mange målplattformer;
  • Støtter ulike programmeringsparadigmer, inkludert elementer av objektorientert og funksjonell programmering. Standardbiblioteket gir blant annet funksjoner for asynkron I/O, prosesskontroll, logging, profilering og pakkehåndtering;
  • Dynamisk skriving: Språket krever ikke eksplisitt definisjon av typer for variabler, som ligner på skriptprogrammeringsspråk. Interaktiv modus støttes;
  • Valgfri mulighet til å spesifisere typer eksplisitt;
  • En syntaks ideell for numerisk databehandling, vitenskapelig databehandling, maskinlæring og datavisualisering. Støtte for mange numeriske datatyper og verktøy for parallellisering av beregninger.
  • Muligheten til å ringe funksjoner direkte fra C-biblioteker uten ekstra lag.

Store endringer i Julia 1.8:

  • Nye språkfunksjoner
    • Felter av en mutbar struktur kan nå annoteres som konstanter for å forhindre at de endres og tillate optimalisering.
    • Typekommentarer kan legges til globale variabler.
    • Tomme n-dimensjonale arrays kan opprettes ved å bruke flere semikolon innenfor firkantede parenteser, for eksempel "[;;;]" oppretter en 0x0x0 array.
    • Prøv-blokker kan nå valgfritt ha en else-blokk, som utføres umiddelbart etter hoveddelen hvis ingen feil ble kastet.
    • @inline og @noinline kan plasseres inne i en funksjonstekst, slik at du kan kommentere en anonym funksjon.
    • @inline og @noinline kan nå brukes på en funksjon i et anropssted eller blokk for å tvinge de tilsvarende funksjonskallene til å bli inkludert (eller ikke inkludert).
    • ∀, ∃ og ∄ er tillatt som identifikasjonstegn.
    • Lagt til støtte for Unicode 14.0.0-spesifikasjonen.
    • Metoden Module(:name, false, false) kan brukes til å lage en modul som ikke inneholder navn, som ikke importerer Base eller Core, og som ikke inneholder en referanse til seg selv.
  • Endringer i språket
    • Nyopprettede oppgaveobjekter (@spawn, @async, etc.) har nå world_age for metoder fra den overordnede oppgaven når de er opprettet, noe som muliggjør optimalisert utførelse. Det forrige aktiveringsalternativet er tilgjengelig ved å bruke Base.invokelatest-metoden.
    • Unicode ubalanserte toveis formateringsdirektiver er nå forbudt i strenger og kommentarer for å unngå injeksjoner.
    • Base.ifelse er nå definert som en generisk funksjon i stedet for en innebygd funksjon, slik at pakker kan utvide definisjonen.
    • Hver tilordning til en global variabel går nå først gjennom et kall for å konvertere(Any, x) eller convert(T, x) hvis den globale variabelen ble erklært å være av typen T. Før du bruker globale variabler, sørg for at den invariante konverter(Any) , x) === x er alltid sant, ellers kan det føre til uventet oppførsel.
    • Innebygde funksjoner ligner nå på generiske funksjoner og kan programmeres opplistet ved hjelp av metoder.
  • Forbedringer av kompilator/runtime
    • Oppstartstid redusert med omtrent 25 %.
    • Den LLVM-baserte kompilatoren har blitt separert fra kjøretidsbiblioteket til et nytt bibliotek, libjulia-codegen. Den er lastet inn som standard, så det skal ikke være noen endringer under normal bruk. I distribusjoner som ikke trenger en kompilator (for eksempel systembilder der all nødvendig kode er forhåndskompilert), kan dette biblioteket (og dets LLVM-avhengighet) ganske enkelt utelates.
    • Betinget type slutning er nå mulig ved å sende et argument til en metode. For eksempel, for Base.ifelse(isa(x, Int), x, 0) returnerer ::Int selv om typen x er ukjent.
    • SROA (Scalar Replacement of Aggregates) har blitt forbedret: eliminerer getfield-kall med vedvarende globale felt, eliminerer mutable strukturer med uinitialiserte felt, forbedrer ytelse og håndtering av nestede getfield-anrop.
    • Typeslutning sporer ulike effekter – bivirkninger og ikke-slipp. Konstant forplantning tas i betraktning, noe som forbedrer kompileringstidsytelsen betydelig. I noen tilfeller, for eksempel, vil kall til funksjoner som ikke kan legges inn, men som ikke påvirker resultatet, forkastes under kjøring. Regler for effekter kan overskrives manuelt ved å bruke makroen Base.@assume_effects.
    • Prekompilering (med eksplisitte prekompileringsdirektiver eller spesifiserte arbeidsbelastninger) lagrer nå mer typedefinert kode, noe som resulterer i raskere førstegangskjøring. Eventuelle nye metode/type-kombinasjoner som trengs av pakken din, uavhengig av hvor disse metodene ble definert, kan nå bufres i forhåndskompileringsfilen hvis de kalles opp av en metode som tilhører pakken din.
  • Endringer i kommandolinjealternativer
    • Standardoppførselen for å overvåke @inbounds-deklarasjoner er nå autoalternativet i "--check-bounds=yes|no|auto".
    • Nytt "--strip-metadata"-alternativ for å fjerne docstrings, kildeplasseringsinformasjon og lokale variabelnavn når du oppretter et systembilde.
    • Nytt alternativ "--strip-ir" for å tillate kompilatoren å fjerne den mellomliggende kildekoderepresentasjonen når systembildet bygges. Det resulterende bildet vil bare fungere hvis "--compile=all" brukes eller hvis all nødvendig kode er forhåndskompilert.
    • Hvis tegnet "-" er spesifisert i stedet for filnavnet, leses den kjørbare koden fra standardinndatastrømmen.
  • Endringer i støtte for flere tråder
    • Threads.@threads bruker som standard det nye planleggingsalternativet :dynamisk, som skiller seg fra forrige modus ved at iterasjoner vil planlegges dynamisk på tvers av tilgjengelige arbeidertråder i stedet for å bli tildelt hver tråd. Denne modusen tillater bedre distribusjon av nestede løkker med @spawn og @threads.
  • Nye bibliotekfunksjoner
    • eachsplit(str) for å utføre split(str) flere ganger.
    • allequal(itr) for å teste om alle elementene i en iterator er like.
    • hardlink(src, dst) kan brukes til å lage harde lenker.
    • setcpuaffinity(cmd, cpus) for å angi affiniteten til prosessorkjernen til de lanserte prosessene.
    • diskstat(path=pwd()) for å få diskstatistikk.
    • Ny @showtime-makro for å vise både linjen som evalueres og @time-rapporten.
    • LazyString og lazy"str"-makro er lagt til for å støtte lat konstruksjon av feilmeldinger i feilbaner.
    • Rettet et samtidighetsproblem i Dict og andre avledede objekter som keys(::Dict), values(::Dict) og Set. Iterasjonsmetoder kan nå kalles på en ordbok eller et sett, så lenge det ikke er noen anrop som endrer ordboken eller settet.
    • @time og @timev har nå en valgfri beskrivelse, slik at du for eksempel kan kommentere kilden til tidsrapporter. @time "Evaluering av foo" foo().
    • område tar enten stopp eller lengde som det eneste søkeordargumentet.
    • presisjon og settpresisjon aksepterer nå base som nøkkelord
    • TCP-socketobjekter gir nå en closewrite-metode og støtter bruk av halvåpen modus.
    • Extrema godtar nå et innledende argument.
    • Iterators.countfrom godtar nå alle typer som definerer en +-metode.
    • @time allokerer nå % av tiden brukt på å rekompilere metoder med endrede typer.
  • Standard bibliotekendringer
    • Nøkler med verdi Ingenting er nå fjernet fra miljøet i addenv.
    • Iterators.reverse (og derfor last) støtter hver linje.
    • Lengdefunksjonen for områder av visse typer sjekker ikke lenger for heltallsoverløp. En ny funksjon, checked_length, er tilgjengelig; den inneholder kontrolllogikk for bitoverføring. Om nødvendig, bruk SaferIntegers.jl for å konstruere områdetypen.
    • Iterators.Reverse iterator implementerer hver indeksreversering hvis mulig.
  • Pakkebehandler
    • Nye ⌃- og ⌅-indikatorer ved siden av pakker i «pkg>»-statusen som nye versjoner er tilgjengelige for. ⌅ indikerer at nye versjoner ikke kan installeres.
    • Nytt utdatert::Bool-argument til Pkg.status (--utdatert eller -o i REPL-modus) for å vise informasjon om pakker fra tidligere versjoner.
    • Nytt compat::Bool-argument til Pkg.status (--compat eller -c i REPL-modus) for å vise eventuelle [compat]-oppføringer i Project.toml.
    • Ny "pkg>compat" (og Pkg.compat) modus for å angi prosjektkompatibilitetsoppføringer. Gir en interaktiv editor via "pkg>compat" eller direkte postkontroll via "pkg>Foo 0.4,0.5", som kan laste gjeldende poster via tabulatorfullføring. Det vil si at "pkg> compat Fo" oppdateres automatisk til "pkg> Foo 0.4,0.5" slik at en eksisterende oppføring kan redigeres.
    • Pkg prøver nå bare å laste ned pakker fra en pakkeserver hvis serveren overvåker registeret som inneholder pakken.
    • Pkg.instantiate vil nå gi en advarsel når Project.toml er ute av synkronisering med Manifest.toml. Den gjør dette basert på en hash av prosjektets deps og compat-poster (andre felt ignoreres) i manifestet når det løses, slik at enhver endring i Project.toml-deps eller compat-poster kan oppdages uten å løses på nytt.
    • Hvis "pkg>add" ikke finner en pakke med det gitte navnet, vil den nå foreslå pakker med lignende navn som kan legges til.
    • Versjonen av julia som er lagret i manifestet inkluderer ikke lenger byggenummeret, noe som betyr at master nå skrives som 1.9.0-DEV.
    • Testavbrudd "pkg>" vil nå bli oppdaget mer konsistent, og vil bli korrekt returnert til REPL.
  • InteractiveUtils
    • Ny @time_imports-makro for å rapportere tiden brukt på å importere pakker og deres avhengigheter, og fremheve kompilerings- og rekompileringstiden som en prosentandel av importene.
  • Lineær algebra
    • BLAS-undermodulen støtter nå nivå-2 BLAS spr!-funksjoner.
    • Standardbiblioteket LinearAlgebra.jl er nå helt uavhengig av SparseArrays.jl, både fra et kildekode- og enhetstestingsperspektiv. Som en konsekvens blir sparsomme matriser ikke lenger returnert (implisitt) av metoder fra LinearAlgebra brukt på Base- eller LinearAlgebra-objekter. Spesielt fører dette til følgende brytende endringer:
      • Sammenkoblinger som bruker spesielle "sparsomme" matriser (f.eks. diagonal) returnerer nå tette matriser; Som en konsekvens er D1- og D2-feltene til SVD-objekter opprettet av getproperty-kall nå tette matriser.
      • Den lignende (::SpecialSparseMatrix, ::Type, ::Dims)-metoden returnerer en tett nullmatrise. Som en konsekvens fører produkter av to-, tre- og symmetriske tridiagonale matriser med hverandre til generering av en tett matrise. I tillegg mislykkes det å konstruere lignende matriser med tre argumenter fra spesielle "sparsomme" matriser fra (ikke-statiske) matriser på grunn av "null(::Type{Matrix{T}})".
  • Printf
    • %s og %c bruker nå tekstbredde-argumentet for å formatere bredden.
  • Profil
    • CPU-belastningsprofilering registrerer nå metadata inkludert tråder og oppgaver. Profile.print() har et nytt groupby-argument som lar deg gruppere tråder, oppgaver eller undertråder/oppgaver, oppgaver/tråder og tråder og oppgaver-argumenter for å gi filtrering. I tillegg rapporteres nå utnyttelsesprosent enten som en total eller per tråd, avhengig av om tråden er inaktiv eller ikke i hver prøve. Profile.fetch() inkluderer de nye metadataene som standard. For bakoverkompatibilitet med eksterne forbrukere av profileringsdata, kan de ekskluderes ved å sende include_meta=false.
    • Den nye Profile.Allocs-modulen lar deg profilere minnetildelinger. En stabelsporing av typen og størrelsen på hver minneallokering registreres, og sample_rate-argumentet lar et konfigurerbart antall allokeringer hoppes over, noe som reduserer ytelsesoverhead.
    • CPU-profilering med fast varighet kan nå kjøres av brukeren mens oppgaver kjører uten først å laste profilen, og rapporten vil vises mens den kjøres. På MacOS og FreeBSD, trykk ctrl-t eller ring SIGINFO. For andre plattformer, aktiver SIGUSR1, dvs. % kill -USR1 $julia_pid. Dette er ikke tilgjengelig på Windows.
  • ERSTATTER
    • RadioMenu støtter nå ekstra hurtigtaster for direkte valg av alternativer.
    • Sekvensen "?(x, y" etterfulgt av å trykke TAB viser alle metodene som kan kalles med argumentene x, y, .... (Et innledende mellomrom hindrer deg i å gå inn i hjelpemodus.) "MyModule.?(x, y " begrenser søket til "MyModule". Å trykke TAB krever at minst ett argument er av en type som er mer spesifikk enn Any. Eller bruk SHIFT-TAB i stedet for TAB for å tillate kompatible metoder.
    • Den nye globale variabelen err lar deg få det siste unntaket, lik oppførselen til ans med siste respons. Hvis du skriver inn feil, skrives unntaksinformasjonen ut på nytt.
  • SparseArrays
    • Flyttet SparseArrays-koden fra Julia-depotet til det eksterne SparseArrays.jl-depotet.
    • De nye sammenkoblingsfunksjonene sparse_hcat, sparse_vcat og sparse_hvcat returnerer en SparseMatrixCSC-type uavhengig av typen inndataargumenter. Dette ble nødvendig for å forene mekanismen for liming av matriser etter å ha separert LinearAlgebra.jl- og SparseArrays.jl-koden.
  • Logging
    • Standard loggingsnivåene BelowMinLevel, Debug, Info, Warn, Error og AboveMaxLevel eksporteres nå fra standard Logging-biblioteket.
  • Unicode
    • Lagt til isequal_normalized funksjon for å sjekke for Unicode-ekvivalens uten eksplisitt å konstruere normaliserte strenger.
    • Unicode.normalize-funksjonen godtar nå nøkkelordet charttransform, som kan brukes til å gi tilpassede tegntilordninger, og Unicode.julia_chartransform-funksjonen er også tilgjengelig for å reprodusere tilordningen som brukes når Julia-parseren normaliserer identifikatorer.
  • Test
    • '@test_throws "noen melding" triggers_error()' kan nå brukes til å teste om den viste feilteksten inneholder en "noen melding"-feil, uavhengig av den spesifikke unntakstypen. Regulære uttrykk, strenglister og samsvarende funksjoner støttes også.
    • @testset foo() kan nå brukes til å lage et testsett fra en gitt funksjon. Testcasenavnet er navnet på funksjonen som kalles. Den kalte funksjonen kan inneholde @test og andre @testset-definisjoner, inkludert for kall til andre funksjoner, mens den registrerer alle mellomliggende testresultater.
    • TestLogger og LogRecord eksporteres nå fra standard testbibliotek.
  • distribuert
    • SSHManager støtter nå arbeidertråder med en csh/tcsh wrapper via addprocs()-metoden og shell=:csh-parameteren.
  • Andre endringer
    • GC.enable_logging(true) kan brukes til å logge hver søppelinnsamlingsoperasjon med tiden og mengden minne som er samlet inn.

Kilde: opennet.ru

Legg til en kommentar