Programmeringssprog Julia 1.9 tilgængelig

Udgivelsen af ​​programmeringssproget Julia 1.9 er blevet offentliggjort, 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.9:

  • Nye sprogfunktioner
    • Tillad, at tildelinger udføres i et andet modul ved hjælp af "setproperty!(::Module, ::Symbol, x)".
    • Flere opgaver, der ikke er i den endelige stilling, er tilladt. For eksempel vil strengen "a, b..., c = 1, 2, 3, 4" blive behandlet som "a = 1; b..., = 2, 3; c = 4". Dette håndteres via Base.split_rest.
    • Enkelttegnsliteraler understøtter nu den samme syntaks som strengliteraler; de der. Syntaksen kan repræsentere ugyldige UTF-8-sekvenser, som tilladt af Char-typen.
    • Tilføjet understøttelse af Unicode 15-specifikation.
    • Indlejrede kombinationer af tupler og navngivne karaktertupler kan nu bruges som typeparametre.
    • Nye indbyggede funktioner "getglobal(::Module, ::Symbol[, order])" og "setglobal!(::Module, ::Symbol, x[, order])" til udelukkende at læse og skrive til globale variabler. Den getglobale metode bør nu foretrækkes frem for getfield-metoden til at få adgang til globale variabler.
  • Ændringer i sproget
    • Makroen "@invoke" introduceret i version 1.7 er nu eksporteret og tilgængelig til brug. Derudover bruger den nu "Core.Typeof(x)"-metoden i stedet for "Any" i det tilfælde, hvor typeannotationen er udeladt for "x"-argumentet. Dette er nødvendigt for at sikre, at typer, der sendes som argumenter, behandles korrekt.
    • Aktiveret eksport af "invokelatest"-funktionen og "@invokelatest"-makroen, introduceret i version 1.7.
  • Compiler/runtime forbedringer
    • Væsentlig reduceret tid til første udførelse (TTFX - Tid til første udførelse). Prækompilering af en pakke gemmer nu native kode i "pkgimage", hvilket betyder, at kode genereret af prækompileringsprocessen ikke behøver at blive rekompileret efter pakken er indlæst. Brugen af ​​pkgimages-tilstand kan deaktiveres ved at bruge "--pkgimages=no" muligheden.
    • Det kendte kvadratiske kompleksitetsproblem med typeinferens er blevet rettet, og inferens bruger generelt mindre hukommelse. Nogle kanttilfælde med automatisk genererede lange funktioner (såsom ModelingToolkit.jl med partielle differentialligninger og store kausalmodeller) kompilerer meget hurtigere.
    • Opkald med argumenter uden konkrete typer kan nu unionssplittes optimeret til injektion eller statisk opløsning, selvom der er flere forskellige typer kandidater til afsendelse. Dette kan forbedre ydeevnen i visse situationer, hvor objekttyper ikke er fuldt statisk løst, ved statisk at løse "@nospecialize-d" opkaldssteder og undgå rekompilering.
    • Alle anvendelser af @pure-makroen i Base-modulet er blevet erstattet med Base.@assume_effects.
    • Kald til invoke(f, invokesig, args...) med mindre specifikke typer end typisk brugt til f(args...) forårsager ikke længere, at pakken bliver kompileret igen.
  • Ændringer til kommandolinjeindstillinger
    • På Linux og Windows forsøger "--threads=auto"-indstillingen nu at bestemme det tilgængelige antal processorer baseret på CPU-affinitet, en maske, der typisk er indstillet i HPC- og cloud-miljøer.
    • Parameteren "--math-mode=fast" er deaktiveret, i stedet for anbefales det at bruge makroen "@fastmath", som har klart defineret semantik.
    • Muligheden "--tråde" er nu i formatet "auto | N[,auto|M]", hvor M angiver antallet af interaktive tråde, der skal oprettes (i øjeblikket betyder auto 1).
    • Tilføjet mulighed "—heap-size-hint=" ", som sætter tærsklen, hvorefter aktiv affaldsindsamling begynder. Størrelsen kan angives i byte, kilobyte (1000 KB), megabyte (300 MB) eller gigabyte (1,5 GB).
  • Ændringer i multithreading
    • "Threads.@spawn" har nu et valgfrit første argument med værdien ":default" eller ":interactive". En interaktiv opgave kræver lav responsforsinkelse og er designet til at være kort eller udføres ofte. Interaktive opgaver kører på interaktive tråde, hvis de er angivet, når Julia startes.
    • Tråde, der kører uden for Julia-runtiden (såsom fra C eller Java) kan nu kalde Julia-kode ved hjælp af "jl_adopt_thread". Dette sker automatisk, når Julia-koden indtastes via "cfunction" eller "@ccallable"-indgangspunktet. Som en konsekvens kan antallet af tråde nu ændre sig under udførelsen.
  • Nye biblioteksfunktioner
    • Ny funktion "Iterators.flatmap".
    • Ny funktion "pkgversion(m::Module)" for at få den version af pakken, der indlæste et givet modul, svarende til "pkgdir(m::Module)".
    • Ny funktion "stack(x)", der generaliserer "reduce(hcat, x::Vector{<:Vector})" til enhver dimension og tillader enhver iterator af iteratorer. "Stack(f, x)"-metoden generaliserer "mapreduce(f, hcat, x)" og er mere effektiv.
    • Ny makro til at analysere allokeret hukommelse "@allokationer", svarende til "@allokeret", bortset fra at den returnerer antallet af hukommelsestildelinger i stedet for den samlede størrelse af den tildelte hukommelse.
  • Nye biblioteksfunktioner
    • "RoundFromZero" virker nu for andre typer end "BigFloat".
    • "Dict" kan nu reduceres manuelt ved at bruge "sizehint!"
    • "@time" angiver nu separat den procentdel af tid, der bruges på at genkompilere ugyldige metoder.
  • Ændringer til standardbiblioteket
    • Rettede et samtidighedsproblem i iterationsmetoder for Dict og andre afledte objekter såsom nøgler(::Dict), værdier(::Dict) og Set. Disse iterationsmetoder kan nu kaldes på en Dict eller Set parallelt for et ubegrænset antal tråde, så længe der ikke er nogen handlinger, der ændrer ordbogen eller sættet.
    • Negering af en prædikatfunktion "!f" returnerer nu en sammensat funktion "(!) ∘ f" i stedet for en anonym funktion.
    • Dimensionsudsnitsfunktioner fungerer nu på tværs af flere dimensioner: "eachslice", "eachrow" og "eachcol" returnerer et "Slices"-objekt, der tillader afsendelse for at give mere effektive metoder.
    • Tilføjede "@kwdef"-makroen til den offentlige API.
    • Rettede et problem med rækkefølgen af ​​operationer i "fld1".
    • Sortering er nu altid tidsstabil (QuickSort er blevet redesignet).
    • "Base.splat" er nu eksporteret. Returværdien er en "Base.Splat"-type snarere end en anonym funktion, hvilket gør det muligt at udlæse den pænt.
  • Pakkeadministrator
    • "Package Extensions": Understøttelse af indlæsning af et kodestykke fra andre pakker indlæst i en Julia-session. Applikationen ligner "Requires.jl"-pakken, men prækompilering og kompatibilitet med indstillinger understøttes.
  • Lineær Algebra Bibliotek
    • På grund af risikoen for forveksling med element-vis opdeling fjernede "a/b" og "b\a" metoderne med skalar "a" og vektor "b", som svarede til "a * pinv(b)".
    • Opkald til BLAS og LAPACK bruger nu "libblastrampolin (LBT)". OpenBLAS leveres som standard, men opbygning af systembilledet med andre BLAS/LAPACK-biblioteker understøttes ikke. I stedet anbefales det at bruge LBT-mekanismen til at erstatte BLAS/LAPACK med et andet eksisterende sæt af biblioteker.
    • "lu" understøtter en ny matrix-rotationsstrategi, "RowNonZero()", som vælger det første ikke-nul rotationselement til brug med nye aritmetiske typer og til træningsformål.
    • "normalize(x, p=2)" understøtter nu ethvert normaliseret vektorrum "x", inklusive skalarer.
    • Standardantallet af BLAS-tråde er nu lig med antallet af CPU-tråde på ARM-arkitekturer og halvdelen af ​​antallet af CPU-tråde på andre arkitekturer.
  • Printf: Omarbejdede fejlmeddelelser for forkert formaterede strenge for bedre læsbarhed.
  • Profil: Ny funktion "Profile.take_heap_snapshot(file)", som skriver en fil i det JSON-baserede ".heapsnapshot"-format, der understøttes i Chrome.
  • Random: randn og randexp virker nu for enhver AbstractFloat-type, der definerer rand.
  • REPL
    • Ved at trykke på tastekombinationen "Alt-e" åbnes nu den aktuelle input i editoren. Indholdet (hvis det er ændret) vil blive udført, når du afslutter editoren.
    • Den aktuelle modulkontekst, der er aktiv i REPL, kan ændres (Main som standard) ved hjælp af funktionen "REPL.activate(::Module)" eller ved at indtaste modulet i REPL og trykke på tastekombinationen "Alt-m".
    • "Nummereret prompt"-tilstand, som udskriver tal for hver input og output og gemmer de scorede resultater i Out, kan aktiveres ved hjælp af "REPL.numbered_prompt!()".
    • Tabfuldførelse viser tilgængelige søgeordsargumenter.
  • SuiteSparse: Flyttede kode for "SuiteSparse"-løseren til "SparseArrays.jl". Løsere er nu re-eksporteret af "SuiteSparse.jl".
  • SparseArrays
    • "SuiteSparse"-løsere er nu tilgængelige som "SparseArrays" undermoduler.
    • UMFPACK og CHOLMOD trådbeskyttelsestilstande er blevet forbedret ved at eliminere globale variabler og bruge låse. Flertrådet "ldiv!" UMFPACK-objekter kan nu udføres sikkert.
    • Den eksperimentelle funktion "SparseArrays.allowscalar(::Bool)" giver dig mulighed for at deaktivere eller aktivere skalarindeksering af sparse arrays. Denne funktion er designet til at detektere tilfældig skalær indeksering af "SparseMatrixCSC"-objekter, som er en almindelig kilde til ydeevneproblemer.
  • Ny fejlsikker tilstand til testsuiter, der afslutter en testkørsel tidligt i tilfælde af en fejl eller fejl. Indstil enten via "@testset kwarg failfast=true" eller "export JULIA_TEST_FAILFAST=true". Dette er nogle gange nødvendigt i CI-kørsler for at modtage fejlmeddelelser tidligt.
  • Datoer: Tomme strenge parses ikke længere forkert som gyldige "DateTime", "Dates" eller "Times" værdier og i stedet smider en "ArgumentError" i konstruktører og parsing, mens "tryparse" ikke returnerer noget.
  • Pakke distribueret
    • Pakkekonfigurationen (aktivt projekt, "LOAD_PATH", "DEPOT_PATH") udbredes nu, når der tilføjes lokale arbejdsprocesser (f.eks. ved at bruge "addprocs(N::Int)" eller bruge kommandolinjeflaget "--procs=N").
    • "addprocs" for lokale arbejdsprocesser accepterer nu et argument ved navn "env" for at videregive miljøvariabler til arbejdsprocesser.
  • Unicode: "grafem(er, m:n)" returnerer delstrengen fra det m. til n. grafem i "s".
  • Pakken DelimitedFiles er blevet fjernet fra systembibliotekerne og distribueres nu som en separat pakke, der skal være eksplicit installeret for at blive brugt.
  • Eksterne afhængigheder
    • I Linux bliver versionen af ​​libstdc++ systembiblioteket automatisk fundet, og hvis den er nyere, indlæses den. Den gamle libstdc++ indbyggede indlæsningsadfærd, uanset systemversion, kan gendannes ved at indstille miljøvariablen "JULIA_PROBE_LIBSTDCXX=0".
    • Fjernet "RPATH" fra julia binær, som kan bryde biblioteker på Linux, der ikke kan definere "RUNPATH"-variablen.
    • Værktøjsforbedringer: Outputtet af "MethodError" og metoder (f.eks. fra "methods(my_func)") er nu formateret og farvet i overensstemmelse med princippet om output af metoder i en stack trace.

    Kilde: opennet.ru

Tilføj en kommentar