Programmeringsspråk Julia 1.9 tilgjengelig

Utgivelsen av programmeringsspråket Julia 1.9 er publisert, og kombinerer 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 er distribuert 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.9:

  • Nye språkfunksjoner
    • Tillat at tildelinger gjøres i en annen modul ved å bruke "setproperty!(::Module, ::Symbol, x)".
    • Flere oppgaver som ikke er i endelig stilling er tillatt. For eksempel vil strengen "a, b..., c = 1, 2, 3, 4" bli behandlet som "a = 1; b..., = 2, 3; c = 4". Dette håndteres via Base.split_rest.
    • Enkelttegnsliteraler støtter nå samme syntaks som strengliteraler; de. Syntaksen kan representere ugyldige UTF-8-sekvenser, som tillatt av Char-typen.
    • Lagt til støtte for Unicode 15-spesifikasjonen.
    • Nestede kombinasjoner av tupler og navngitte tegntupler kan nå brukes som typeparametere.
    • Nye innebygde funksjoner "getglobal(::Module, ::Symbol[, order])" og "setglobal!(::Module, ::Symbol, x[, order])" for lesing og skriving utelukkende til globale variabler. Getglobal-metoden bør nå foretrekkes fremfor getfield-metoden for tilgang til globale variabler.
  • Endringer i språket
    • "@invoke"-makroen introdusert i versjon 1.7 er nå eksportert og tilgjengelig for bruk. I tillegg bruker den nå "Core.Typeof(x)"-metoden i stedet for "Any" i tilfellet hvor typekommentaren er utelatt for "x"-argumentet. Dette er nødvendig for å sikre at typer som sendes som argumenter behandles riktig.
    • Aktivert eksport av "invokelatest"-funksjonen og "@invokelatest"-makroen, introdusert i versjon 1.7.
  • Forbedringer av kompilator/runtime
    • Betydelig redusert tid til første utførelse (TTFX - Tid til første utførelse). Forhåndskompilering av en pakke lagrer nå opprinnelig kode i "pkgimage", noe som betyr at kode generert av forhåndskompileringsprosessen ikke trenger å bli rekompilert etter at pakken er lastet. Bruken av pkgimages-modus kan deaktiveres ved å bruke "--pkgimages=no" alternativet.
    • Det kjente kvadratiske kompleksitetsproblemet med typeinferens er løst, og inferens bruker mindre minne totalt sett. Noen kanttilfeller med automatisk genererte lange funksjoner (som ModelingToolkit.jl med partielle differensialligninger og store årsaksmodeller) kompileres mye raskere.
    • Samtaler med argumenter uten konkrete typer kan nå unionssplittes optimalisert for injeksjon eller statisk oppløsning, selv om det er flere forskjellige typer kandidater for utsendelse. Dette kan forbedre ytelsen i visse situasjoner der objekttyper ikke er fullstendig statisk løst, ved statisk å løse "@nospecialize-d" anropssteder og unngå rekompilering.
    • All bruk av @pure-makroen i Base-modulen er erstattet med Base.@assume_effects.
    • Anrop til å invoke(f, invokesig, args...) med mindre spesifikke typer enn det som vanligvis brukes for f(args...) fører ikke lenger til at pakken rekompileres.
  • Endringer i kommandolinjealternativer
    • På Linux og Windows forsøker "--threads=auto"-alternativet nå å bestemme tilgjengelig antall prosessorer basert på CPU-tilhørighet, en maske som vanligvis er satt i HPC- og skymiljøer.
    • Parameteren "--math-mode=fast" er deaktivert, i stedet for dette anbefales det å bruke makroen "@fastmath", som har klart definert semantikk.
    • Alternativet "--tråder" er nå i formatet "auto | N[,auto|M]", der M indikerer antall interaktive tråder som skal opprettes (for øyeblikket betyr auto 1).
    • Lagt til alternativet "—heap-size-hint=" ", som setter terskelen som aktiv søppelinnsamling starter etter. Størrelsen kan angis i byte, kilobyte (1000 KB), megabyte (300 MB) eller gigabyte (1,5 GB).
  • Endringer i multithreading
    • "Threads.@spawn" har nå et valgfritt første argument med verdien ":default" eller ":interactive". En interaktiv oppgave krever lav responsforsinkelse og er designet for å være kort eller utføres ofte. Interaktive oppgaver vil kjøre på interaktive tråder hvis de er spesifisert når du starter Julia.
    • Tråder som kjører utenfor Julia runtime (som fra C eller Java) kan nå kalle Julia-kode ved å bruke "jl_adopt_thread". Dette skjer automatisk når du skriver inn Julia-koden via "cfunction" eller "@ccallable"-inngangspunktet. Som en konsekvens kan antallet tråder nå endres under utførelse.
  • Nye bibliotekfunksjoner
    • Ny funksjon "Iterators.flatmap".
    • Ny funksjon "pkgversion(m::Module)" for å få versjonen av pakken som lastet en gitt modul, lik "pkgdir(m::Module)".
    • Ny funksjon "stack(x)" som generaliserer "reduce(hcat, x::Vector{<:Vector})" til en hvilken som helst dimensjon og tillater enhver iterator av iteratorer. "stack(f, x)"-metoden generaliserer "mapreduce(f, hcat, x)" og er mer effektiv.
    • Ny makro for å analysere tildelt minne "@allokasjoner", lik "@allokert", bortsett fra at den returnerer antall minneallokeringer, i stedet for den totale størrelsen på det tildelte minnet.
  • Nye bibliotekfunksjoner
    • "RoundFromZero" fungerer nå for andre typer enn "BigFloat".
    • "Dict" kan nå reduseres manuelt ved å bruke "sizehint!"
    • "@time" spesifiserer nå separat prosentandelen av tiden brukt på å rekompilere ugyldige metoder.
  • Endringer i standardbiblioteket
    • Rettet et samtidighetsproblem i iterasjonsmetoder for Dict og andre avledede objekter som nøkler(::Dict), verdier(::Dict) og Set. Disse iterasjonsmetodene kan nå kalles på en Dict eller Set parallelt for et ubegrenset antall tråder, så lenge det ikke er noen handlinger som endrer ordboken eller settet.
    • Negering av en predikatfunksjon "!f" returnerer nå en sammensatt funksjon "(!) ∘ f" i stedet for en anonym funksjon.
    • Dimensjonssnittfunksjoner fungerer nå på tvers av flere dimensjoner: "eachslice", "eachrow" og "eachcol" returnerer et "Slices"-objekt som tillater sending for å gi mer effektive metoder.
    • La "@kwdef"-makroen til den offentlige API-en.
    • Rettet et problem med rekkefølgen av operasjoner i "fld1".
    • Sorteringen er nå alltid tidsstabil (QuickSort har blitt redesignet).
    • "Base.splat" er nå eksportert. Returverdien er en "Base.Splat"-type i stedet for en anonym funksjon, noe som gjør at den kan sendes pent ut.
  • Pakkebehandler
    • "Package Extensions": Støtte for å laste inn en kodebit fra andre pakker lastet inn i en Julia-økt. Applikasjonen ligner på "Requires.jl"-pakken, men forhåndskompilering og kompatibilitet med innstillinger støttes.
  • Lineær algebra bibliotek
    • På grunn av risikoen for forveksling med element-vis deling, fjernet "a/b" og "b\a" metodene med skalar "a" og vektor "b", som tilsvarte "a * pinv(b)".
    • Å ringe BLAS og LAPACK bruker nå "libblastrampoline (LBT)". OpenBLAS leveres som standard, men å bygge systembildet med andre BLAS/LAPACK-biblioteker støttes ikke. I stedet anbefales det å bruke LBT-mekanismen for å erstatte BLAS/LAPACK med et annet eksisterende sett med biblioteker.
    • "lu" støtter en ny matriserotasjonsstrategi, "RowNonZero()", som velger det første rotasjonselementet som ikke er null for bruk med nye aritmetiske typer og for treningsformål.
    • "normalize(x, p=2)" støtter nå alle normaliserte vektorrom "x", inkludert skalarer.
    • Standard antall BLAS-tråder er nå lik antall CPU-tråder på ARM-arkitekturer og halvparten av antall CPU-tråder på andre arkitekturer.
  • Printf: Omarbeidede feilmeldinger for feil formaterte strenger for bedre lesbarhet.
  • Profil: Ny funksjon "Profile.take_heap_snapshot(file)", som skriver en fil i det JSON-baserte ".heapsnapshot"-formatet som støttes i Chrome.
  • Random: randn og randexp fungerer nå for enhver AbstractFloat-type som definerer rand.
  • ERSTATTER
    • Ved å trykke på tastekombinasjonen "Alt-e" åpnes nå gjeldende inndata i editoren. Innholdet (hvis endret) vil bli utført når du går ut av redigeringsprogrammet.
    • Den gjeldende modulkonteksten som er aktiv i REPL kan endres (Main som standard) ved å bruke funksjonen "REPL.activate(::Module)" eller ved å legge inn modulen i REPL og trykke på tastekombinasjonen "Alt-m".
    • "Nummerert ledetekst"-modus, som skriver ut tall for hver inngang og utgang og lagrer de scorede resultatene i Ut, kan aktiveres ved å bruke "REPL.numbered_prompt!()".
    • Tabellfullføring viser tilgjengelige søkeordargumenter.
  • SuiteSparse: Flyttet kode for "SuiteSparse"-løseren til "SparseArrays.jl". Løsere blir nå re-eksportert av "SuiteSparse.jl".
  • SparseArrays
    • "SuiteSparse"-løsere er nå tilgjengelige som "SparseArrays"-undermoduler.
    • UMFPACK og CHOLMOD trådbeskyttelsesmoduser har blitt forbedret ved å eliminere globale variabler og bruke låser. Flertråds "ldiv!" UMFPACK-objekter kan nå kjøres trygt.
    • Den eksperimentelle funksjonen "SparseArrays.allowscalar(::Bool)" lar deg deaktivere eller aktivere skalarindeksering av sparsomme matriser. Denne funksjonen er designet for å oppdage tilfeldig skalarindeksering av "SparseMatrixCSC"-objekter, som er en vanlig kilde til ytelsesproblemer.
  • Ny feilsikker modus for testsuiter som avslutter en testkjøring tidlig i tilfelle feil eller feil. Sett enten via "@testset kwarg failfast=true" eller "export JULIA_TEST_FAILFAST=true". Dette er noen ganger nødvendig i CI-kjøringer for å motta feilmeldinger tidlig.
  • Datoer: Tomme strenger blir ikke lenger feilaktig analysert som gyldige "DateTime", "Dates" eller "Times"-verdier og i stedet kastes en "ArgumentError" i konstruktører og parsing, mens "tryparse" ikke returnerer noe.
  • Pakke distribuert
    • Pakkekonfigurasjonen (aktivt prosjekt, "LOAD_PATH", "DEPOT_PATH") spres nå når lokale arbeidsprosesser legges til (f.eks. ved å bruke "addprocs(N::Int)" eller ved å bruke kommandolinjeflagget "--procs=N").
    • "addprocs" for lokale arbeidsprosesser godtar nå et argument kalt "env" for å sende miljøvariabler til arbeidsprosesser.
  • Unicode: "graphemes(s, m:n)" returnerer delstrengen fra mth til nth graphemes i "s".
  • DelimitedFiles-pakken er fjernet fra systembibliotekene og distribueres nå som en egen pakke som må være eksplisitt installert for å kunne brukes.
  • Eksterne avhengigheter
    • I Linux blir versjonen av systembiblioteket libstdc++ automatisk oppdaget, og hvis det er nyere, lastes det. Den gamle libstdc++ innebygde lasteoppførselen, uavhengig av systemversjon, kan gjenopprettes ved å sette miljøvariabelen "JULIA_PROBE_LIBSTDCXX=0".
    • Fjernet "RPATH" fra julia binær, som kan bryte biblioteker på Linux som ikke klarer å definere "RUNPATH"-variabelen.
    • Verktøyforbedringer: Utdataene til "MethodError" og metoder (for eksempel fra "methods(my_func)") er nå formatert og farget i samsvar med prinsippet om utdata av metoder i en stack trace.

    Kilde: opennet.ru

Legg til en kommentar