Udgivelse af programmeringssproget Julia 1.8

Udgivelsen af ​​programmeringssproget Julia 1.8 er tilgængelig, der kombinerer kvaliteter som høj ydeevne, understøttelse af dynamisk skrivning og indbyggede værktøjer til parallel programmering. Julias syntaks er tæt på MATLAB, og låner nogle elementer fra Ruby og Lisp. Strengemanipulationsmetoden minder om Perl. Projektkoden distribueres under MIT-licensen.

Nøgletræk ved sproget:

  • Høj ydeevne: Et af de vigtigste mål for projektet er at opnå præstation tæt på C-programmer. Julia-kompileren er baseret på arbejdet i LLVM-projektet og genererer effektiv indbygget maskinkode til mange målplatforme;
  • Understøtter forskellige programmeringsparadigmer, herunder elementer af objektorienteret og funktionel programmering. Standardbiblioteket giver blandt andet funktioner til asynkron I/O, processtyring, logning, profilering og pakkehåndtering;
  • Dynamisk skrivning: Sproget kræver ikke eksplicit definition af typer for variabler, svarende til scripting programmeringssprog. Interaktiv tilstand understøttet;
  • Valgfri mulighed for eksplicit at specificere typer;
  • En syntaks ideel til numerisk databehandling, videnskabelig databehandling, maskinlæring og datavisualisering. Understøttelse af mange numeriske datatyper og værktøjer til parallelisering af beregninger.
  • Muligheden for at kalde funktioner direkte fra C-biblioteker uden yderligere lag.

Større ændringer i Julia 1.8:

  • Nye sprogfunktioner
    • Felter af en foranderlig struktur kan nu annoteres som konstanter for at forhindre dem i at blive ændret og tillade optimering.
    • Typeanmærkninger kan tilføjes til globale variabler.
    • Tomme n-dimensionelle arrays kan oprettes ved hjælp af flere semikolon inden for firkantede parenteser, for eksempel "[;;;]" opretter en 0x0x0 matrix.
    • Prøv-blokke kan nu valgfrit have en else-blok, som udføres umiddelbart efter hovedteksten, hvis ingen fejl blev kastet.
    • @inline og @noinline kan placeres inde i en funktionstekst, så du kan kommentere en anonym funktion.
    • @inline og @noinline kan nu anvendes på en funktion i et opkaldssted eller blok for at tvinge de tilsvarende funktionskald til at blive inkluderet (eller ikke inkluderet).
    • ∀, ∃ og ∄ er tilladt som identifikationstegn.
    • Tilføjet understøttelse af Unicode 14.0.0-specifikation.
    • Metoden Module(:name, false, false) kan bruges til at oprette et modul, der ikke indeholder navne, ikke importerer Base eller Core og ikke indeholder en reference til sig selv.
  • Ændringer i sproget
    • Nyoprettede opgaveobjekter (@spawn, @async osv.) har nu world_age for metoder fra den overordnede opgave, når de er oprettet, hvilket giver mulighed for optimeret udførelse. Den tidligere aktiveringsmulighed er tilgængelig ved brug af metoden Base.invokelatest.
    • Unicode ubalancerede tovejsformateringsdirektiver er nu forbudt i strenge og kommentarer for at undgå indsprøjtninger.
    • Base.ifelse er nu defineret som en generisk funktion snarere end en indbygget funktion, hvilket gør det muligt for pakker at udvide sin definition.
    • Hver tildeling til en global variabel går nu først gennem et kald til at konvertere(Any, x) eller convert(T, x), hvis den globale variabel blev erklæret til at være af typen T. Før du bruger globale variabler, skal du sikre dig, at den invariante konverter(Any) , x) === x er altid sandt, ellers kan det føre til uventet adfærd.
    • Indbyggede funktioner ligner nu generiske funktioner og kan opregnes programmatisk ved hjælp af metoder.
  • Compiler/runtime forbedringer
    • Starttid reduceret med cirka 25 %.
    • Den LLVM-baserede compiler er blevet adskilt fra runtime-biblioteket til et nyt bibliotek, libjulia-codegen. Den er indlæst som standard, så der bør ikke være nogen ændringer under normal brug. I installationer, der ikke har brug for en compiler (for eksempel systembilleder, hvor al den nødvendige kode er prækompileret), kan dette bibliotek (og dets LLVM-afhængighed) simpelthen udelades.
    • Betinget type inferens er nu mulig ved at sende et argument til en metode. For eksempel, for Base.ifelse(isa(x, Int), x, 0) returnerer ::Int, selvom typen af ​​x er ukendt.
    • SROA (Scalar Replacement of Aggregates) er blevet forbedret: eliminerer getfield-kald med vedvarende globale felter, eliminerer foranderlige strukturer med ikke-initialiserede felter, forbedrer ydeevne og håndtering af indlejrede getfield-kald.
    • Typeslutning sporer forskellige effekter – bivirkninger og ikke-fald. Konstant udbredelse tages i betragtning, hvilket væsentligt forbedrer kompileringstidsydelsen. I nogle tilfælde vil opkald til funktioner, der ikke kan indlejres, men som ikke påvirker resultatet, blive kasseret under kørsel. Regler for effekter kan overskrives manuelt ved hjælp af makroen Base.@assume_effects.
    • Prækompilering (med eksplicitte prækompileringsdirektiver eller specificerede arbejdsbelastninger) gemmer nu mere typedefineret kode, hvilket resulterer i hurtigere førstegangsudførelse. Alle nye metode/type-kombinationer, der er nødvendige for din pakke, uanset hvor disse metoder blev defineret, kan nu cachelagres i prækompileringsfilen, hvis de kaldes af en metode, der hører til din pakke.
  • Ændringer til kommandolinjeindstillinger
    • Standardadfærden for overvågning af @inbounds-deklarationer er nu auto-indstillingen i "--check-bounds=yes|no|auto".
    • Ny "--strip-metadata" mulighed for at fjerne docstrings, kildeplaceringsoplysninger og lokale variabelnavne, når der oprettes et systembillede.
    • Ny mulighed "--strip-ir" for at tillade compileren at fjerne den mellemliggende kildekoderepræsentation, når systembilledet bygges. Det resulterende billede vil kun fungere, hvis "--compile=all" bruges, eller hvis al den nødvendige kode er præ-kompileret.
    • Hvis tegnet "-" er angivet i stedet for filnavnet, læses den eksekverbare kode fra standardinputstrømmen.
  • Ændringer i understøttelse af multithreading
    • Threads.@threads bruger som standard den nye planlægningsindstilling :dynamic, som adskiller sig fra den tidligere tilstand ved, at iterationer vil blive planlagt dynamisk på tværs af tilgængelige arbejdstråde i stedet for at blive tildelt hver tråd. Denne tilstand giver mulighed for bedre fordeling af indlejrede loops med @spawn og @threads.
  • Nye biblioteksfunktioner
    • eachsplit(str) for at udføre split(str) flere gange.
    • allequal(itr) for at teste om alle elementer i en iterator er ens.
    • hardlink(src, dst) kan bruges til at oprette hårde links.
    • setcpuaffinity(cmd, cpus) for at indstille affiniteten af ​​processorkernen til de lancerede processer.
    • diskstat(path=pwd()) for at få diskstatistik.
    • Ny @showtime-makro for at vise både den linje, der evalueres, og @time-rapporten.
    • LazyString og lazy"str"-makro er blevet tilføjet for at understøtte doven konstruktion af fejlmeddelelser i fejlstier.
    • Rettede et samtidighedsproblem i Dict og andre afledte objekter såsom nøgler(::Dict), værdier(::Dict) og Set. Iterationsmetoder kan nu kaldes på en ordbog eller et sæt, så længe der ikke er nogen kald, der ændrer ordbogen eller sættet.
    • @time og @timev har nu en valgfri beskrivelse, så du f.eks. kan kommentere kilden til tidsrapporter. @time "Evaluering af foo" foo().
    • interval tager enten stop eller længde som dets eneste søgeordsargument.
    • præcision og sætpræcision accepterer nu base som nøgleord
    • TCP-socket-objekter giver nu en closewrite-metode og understøtter brugen af ​​halvåben tilstand.
    • extrema accepterer nu et indledende argument.
    • Iterators.countfrom accepterer nu enhver type, der definerer en +-metode.
    • @time allokerer nu % af tid brugt på at rekompilere metoder med ændrede typer.
  • Standardbiblioteksændringer
    • Nøgler med værdi Intet er nu fjernet fra miljøet i addenv.
    • Iterators.reverse (og derfor sidste) understøtter hver linje.
    • Længdefunktionen for områder af visse typer kontrollerer ikke længere for heltalsoverløb. En ny funktion, checked_length, er tilgængelig; den indeholder bitoverførselskontrollogik. Brug eventuelt SaferIntegers.jl til at konstruere områdetypen.
    • Iterators.Reverse iterator implementerer hver indeksvending, hvis det er muligt.
  • Pakkeadministrator
    • Nye ⌃- og ⌅-indikatorer ved siden af ​​pakker i "pkg>"-status, som nye versioner er tilgængelige for. ⌅ angiver, at nye versioner ikke kan installeres.
    • Nyt forældet::Bool-argument til Pkg.status (--outdated eller -o i REPL-tilstand) for at vise information om pakker fra tidligere versioner.
    • Nyt compat::Bool-argument til Pkg.status (--compat eller -c i REPL-tilstand) for at vise alle [compat]-indgange i Project.toml.
    • Ny "pkg>compat" (og Pkg.compat) tilstand til indstilling af projektkompatibilitetsindgange. Giver en interaktiv editor via "pkg>compat" eller direkte registreringskontrol via "pkg>Foo 0.4,0.5", som kan indlæse aktuelle poster via fanefuldførelse. Det vil sige, at "pkg> compat Fo" automatisk opdateres til "pkg> Foo 0.4,0.5", så en eksisterende post kan redigeres.
    • Pkg forsøger nu kun at downloade pakker fra en pakkeserver, hvis serveren overvåger registreringsdatabasen, der indeholder pakken.
    • Pkg.instantiate vil nu udstede en advarsel, når Project.toml er ude af synkronisering med Manifest.toml. Det gør det baseret på en hash af projektets deps og compat-poster (andre felter ignoreres) i manifestet, når det løses, så enhver ændring af Project.toml-deps eller compat-poster kan detekteres uden at blive genløst.
    • Hvis "pkg>add" ikke kan finde en pakke med det givne navn, vil den nu foreslå pakker med lignende navne, der kan tilføjes.
    • Den version af julia, der er gemt i manifestet, inkluderer ikke længere build-nummeret, hvilket betyder, at master nu vil blive skrevet som 1.9.0-DEV.
    • Testafbrydelse "pkg>" vil nu blive detekteret mere konsekvent og vil blive korrekt returneret til REPL.
  • InteractiveUtils
    • Ny @time_imports-makro til at rapportere tid brugt på at importere pakker og deres afhængigheder, fremhæve kompilerings- og genkompileringstiden som en procentdel af importen.
  • Lineær algebra
    • BLAS-undermodulet understøtter nu niveau-2 BLAS spr!-funktioner.
    • LinearAlgebra.jl standardbiblioteket er nu fuldstændig uafhængigt af SparseArrays.jl, både fra et kildekode- og enhedstestperspektiv. Som en konsekvens returneres sparse arrays ikke længere (implicit) af metoder fra LinearAlgebra anvendt på Base- eller LinearAlgebra-objekter. Dette fører især til følgende brudændringer:
      • Sammenkædninger ved hjælp af specielle "sparsomme" matricer (f.eks. diagonal) returnerer nu tætte matricer; Som en konsekvens er D1- og D2-felterne for SVD-objekter, der er oprettet af getproperty-kald, nu tætte matricer.
      • Den lignende(::SpecialSparseMatrix, ::Type, ::Dims)-metoden returnerer en tæt nulmatrix. Som en konsekvens fører produkter af to-, tre- og symmetriske tridiagonale matricer med hinanden til dannelsen af ​​en tæt matrix. Derudover mislykkes det nu at konstruere lignende matricer med tre argumenter fra specielle "sparsomme" matricer fra (ikke-statiske) matricer på grund af "nul(::Type{Matrix{T}})".
  • Printf
    • %s og %c bruger nu argumentet textwidth til at formatere bredden.
  • Profil
    • CPU-belastningsprofilering registrerer nu metadata inklusive tråde og opgaver. Profile.print() har et nyt groupby-argument, der giver dig mulighed for at gruppere tråde, opgaver eller undertråde/opgaver, opgaver/tråde og tråde og opgaver-argumenter for at give filtrering. Derudover rapporteres udnyttelsesprocenten nu enten som en samlet eller pr. tråd, afhængigt af om tråden er inaktiv eller ej i hver prøve. Profile.fetch() inkluderer de nye metadata som standard. For bagudkompatibilitet med eksterne forbrugere af profileringsdata kan de udelukkes ved at sende include_meta=false.
    • Det nye Profile.Allocs-modul giver dig mulighed for at profilere hukommelsestildelinger. Et stakspor af typen og størrelsen af ​​hver hukommelsesallokering registreres, og sample_rate-argumentet tillader, at et konfigurerbart antal allokeringer kan springes over, hvilket reducerer ydeevneoverhead.
    • CPU-profilering med fast varighed kan nu køres af brugeren, mens opgaver kører, uden først at indlæse profilen, og rapporten vil blive vist, mens den kører. På MacOS og FreeBSD skal du trykke på ctrl-t eller ringe til SIGINFO. For andre platforme skal du aktivere SIGUSR1, dvs. % kill -USR1 $julia_pid. Dette er ikke tilgængeligt på Windows.
  • REPL
    • RadioMenu understøtter nu yderligere tastaturgenveje til direkte valg af muligheder.
    • Sekvensen "?(x, y" efterfulgt af at trykke på TAB viser alle de metoder, der kan kaldes med argumenterne x, y, .... (Et indledende mellemrum forhindrer dig i at gå ind i hjælpetilstand.) "MyModule.?(x, y " begrænser søgningen til "MyModule". Tryk på TAB kræver, at mindst ét ​​argument er af en type, der er mere specifik end Any. Eller brug SHIFT-TAB i stedet for TAB for at tillade alle kompatible metoder.
    • Den nye globale variabel fejl giver dig mulighed for at få den seneste undtagelse, svarende til adfærden hos ans med det sidste svar. Hvis du indtaster fejl, udskrives undtagelsesoplysningerne igen.
  • SparseArrays
    • Flyttede SparseArrays-koden fra Julia-lageret til det eksterne SparseArrays.jl-lager.
    • De nye sammenkædningsfunktioner sparse_hcat, sparse_vcat og sparse_hvcat returnerer en SparseMatrixCSC-type uanset typen af ​​input-argumenterne. Dette blev nødvendigt for at forene mekanismen til limning af matricer efter adskillelse af koden LinearAlgebra.jl og SparseArrays.jl.
  • Logning
    • Standardlogningsniveauerne BelowMinLevel, Debug, Info, Warn, Error og AboveMaxLevel eksporteres nu fra standardlogningsbiblioteket.
  • Unicode
    • Tilføjet isequal_normalized-funktion til at kontrollere for Unicode-ækvivalens uden eksplicit at konstruere normaliserede strenge.
    • Unicode.normalize-funktionen accepterer nu charttransform-søgeordet, som kan bruges til at give brugerdefinerede tegntilknytninger, og Unicode.julia_chartransform-funktionen er også tilvejebragt for at reproducere den mapping, der bruges, når Julia-parseren normaliserer identifikatorer.
  • Test
    • '@test_throws "some message" triggers_error()' kan nu bruges til at teste, om den viste fejltekst indeholder en "some message" fejl, uanset den specifikke undtagelsestype. Regulære udtryk, strenglister og matchende funktioner understøttes også.
    • @testset foo() kan nu bruges til at oprette et testsæt fra en given funktion. Testcasenavnet er navnet på den funktion, der kaldes. Den kaldte funktion kan indeholde @test og andre @testset-definitioner, herunder for opkald til andre funktioner, mens alle mellemliggende testresultater registreres.
    • TestLogger og LogRecord eksporteres nu fra standardtestbiblioteket.
  • Distribueret
    • SSHManager understøtter nu arbejdertråde med en csh/tcsh-indpakning via addprocs()-metoden og shell=:csh-parameteren.
  • Andre ændringer
    • GC.enable_logging(true) kan bruges til at logge hver affaldsindsamlingsoperation med den indsamlede tid og mængde hukommelse.

Kilde: opennet.ru

Tilføj en kommentar