Programmeringsspråk Julia 1.9 tillgängligt

Utgivningen av programmeringsspråket Julia 1.9 har publicerats, som kombinerar egenskaper som hög prestanda, stöd för dynamisk typning och inbyggda verktyg för parallell programmering. Julias syntax ligger nära MATLAB och lånar några element från Ruby och Lisp. Strängmanipulationsmetoden påminner om Perl. Projektkoden distribueras under MIT-licensen.

Nyckelfunktioner i språket:

  • Hög prestanda: ett av de viktigaste målen för projektet är att uppnå prestanda nära C-program. Julia-kompilatorn är baserad på arbetet i LLVM-projektet och genererar effektiv inbyggd maskinkod för många målplattformar;
  • Stöder olika programmeringsparadigm, inklusive element av objektorienterad och funktionell programmering. Standardbiblioteket tillhandahåller bland annat funktioner för asynkron I/O, processkontroll, loggning, profilering och pakethantering;
  • Dynamisk typning: språket kräver ingen explicit definition av typer för variabler, liknande skriptprogrammeringsspråk. Interaktivt läge stöds;
  • Valfri förmåga att explicit specificera typer;
  • En syntax idealisk för numerisk beräkning, vetenskaplig beräkning, maskininlärning och datavisualisering. Stöd för många numeriska datatyper och verktyg för parallellisering av beräkningar.
  • Möjligheten att direkt anropa funktioner från C-bibliotek utan ytterligare lager.

Stora förändringar i Julia 1.9:

  • Nya språkfunktioner
    • Tillåt att tilldelningar görs i en annan modul med "setproperty!(::Module, ::Symbol, x)".
    • Flera uppdrag som inte är i slutposition är tillåtna. Till exempel kommer strängen "a, b..., c = 1, 2, 3, 4" att behandlas som "a = 1; b..., = 2, 3; c = 4". Detta hanteras via Base.split_rest.
    • Enstaka teckenliterals stöder nu samma syntax som strängliteraler; de där. Syntaxen kan representera ogiltiga UTF-8-sekvenser, vilket tillåts av Char-typen.
    • Tillagt stöd för Unicode 15-specifikationen.
    • Kapslade kombinationer av tupler och namngivna teckentupler kan nu användas som typparametrar.
    • Nya inbyggda funktioner "getglobal(::Module, ::Symbol[, order])" och "setglobal!(::Module, ::Symbol, x[, order])" för läsning och skrivning exklusivt till globala variabler. Metoden getglobal bör nu föredras framför getfield-metoden för att komma åt globala variabler.
  • Förändringar i språket
    • Makrot "@invoke" som introducerades i version 1.7 är nu exporterat och tillgängligt för användning. Dessutom använder den nu metoden "Core.Typeof(x)" snarare än "Any" i fallet där typanteckningen utelämnas för "x"-argumentet. Detta är nödvändigt för att säkerställa att typer som skickas som argument behandlas korrekt.
    • Aktiverad export av funktionen "invokelatest" och makrot "@invokelatest", introducerade i version 1.7.
  • Förbättringar av kompilator/körtid
    • Betydligt reducerad tid till första exekvering (TTFX - Tid till första exekvering). Att förkompilera ett paket lagrar nu inbyggd kod i "pkgimage", vilket betyder att kod som genereras av förkompileringsprocessen inte behöver kompileras om efter att paketet har laddats. Användningen av pkgimages-läget kan inaktiveras med alternativet "--pkgimages=no".
    • Det kända kvadratiska komplexitetsproblemet med typinferens har åtgärdats, och slutledning använder mindre minne totalt sett. Vissa kantfall med automatiskt genererade långa funktioner (som ModelingToolkit.jl med partiella differentialekvationer och stora kausala modeller) kompileras mycket snabbare.
    • Samtal med argument utan konkreta typer kan nu unionsdelande optimeras för injektion eller statisk upplösning, även om det finns flera olika typer av kandidater för utsändning. Detta kan förbättra prestandan i vissa situationer där objekttyper inte är helt statiskt lösta, genom att statiskt lösa "@nospecialize-d" anropsplatser och undvika omkompilering.
    • All användning av makrot @pure i basmodulen har ersatts med Base.@assume_effects.
    • Anrop till invoke(f, invokesig, args...) med mindre specifika typer än vad som vanligtvis används för f(args...) orsakar inte längre att paketet kompileras om.
  • Ändringar av kommandoradsalternativ
    • På Linux och Windows försöker alternativet "--threads=auto" nu bestämma det tillgängliga antalet processorer baserat på CPU-affinitet, en mask som vanligtvis ställs in i HPC- och molnmiljöer.
    • Parametern "--math-mode=fast" är inaktiverad, istället för vilken det rekommenderas att använda makrot "@fastmath", som har tydligt definierad semantik.
    • Alternativet "--trådar" är nu i formatet "auto | N[,auto|M]", där M indikerar antalet interaktiva trådar som ska skapas (för närvarande betyder auto 1).
    • Lade till alternativet "—heap-size-hint=" ", som anger tröskeln efter vilken aktiv sophämtning börjar. Storleken kan anges i byte, kilobyte (1000 KB), megabyte (300 MB) eller gigabyte (1,5 GB).
  • Förändringar i multithreading
    • "Threads.@spawn" har nu ett valfritt första argument med värdet ":default" eller ":interactive". En interaktiv uppgift kräver låg svarslatens och är utformad för att vara kort eller utföras ofta. Interaktiva uppgifter kommer att köras på interaktiva trådar om de anges när Julia startas.
    • Trådar som körs utanför Julia runtime (som från C eller Java) kan nu anropa Julia-kod med "jl_adopt_thread". Detta sker automatiskt när Julia-koden skrivs in via "cfunction" eller "@ccallable" ingångspunkten. Som en konsekvens kan antalet trådar nu ändras under körning.
  • Nya biblioteksfunktioner
    • Ny funktion "Iterators.flatmap".
    • Ny funktion "pkgversion(m::Module)" för att få versionen av paketet som laddade en given modul, liknande "pkgdir(m::Module)".
    • Ny funktion "stack(x)" som generaliserar "reduce(hcat, x::Vector{<:Vector})" till valfri dimension och tillåter valfri iterator av iteratorer. Metoden "stack(f, x)" generaliserar "mapreduce(f, hcat, x)" och är mer effektiv.
    • Nytt makro för att analysera allokerat minne "@allokationer", liknande "@allokerat", förutom att det returnerar antalet minnesallokeringar snarare än den totala storleken på det tilldelade minnet.
  • Nya biblioteksfunktioner
    • "RoundFromZero" fungerar nu för andra typer än "BigFloat".
    • "Dict" kan nu reduceras manuellt med "sizehint!"
    • "@time" anger nu separat hur mycket tid som går åt till att kompilera om ogiltiga metoder.
  • Ändringar av standardbiblioteket
    • Fixade ett samtidighetsproblem i iterationsmetoder för Dict och andra härledda objekt som nycklar(::Dict), värden(::Dict) och Set. Dessa iterationsmetoder kan nu anropas på en dikt eller uppsättning parallellt för ett obegränsat antal trådar, så länge det inte finns några åtgärder som ändrar ordboken eller uppsättningen.
    • Negerande av en predikatfunktion "!f" returnerar nu en sammansatt funktion "(!) ∘ f" istället för en anonym funktion.
    • Dimensionssnittfunktioner fungerar nu över flera dimensioner: "eachslice", "eachrow" och "eachcol" returnerar ett "Slices"-objekt som tillåter sändning för att tillhandahålla effektivare metoder.
    • Lade till makrot "@kwdef" till det offentliga API:et.
    • Fixade ett problem med operationsordningen i "fld1".
    • Sorteringen är nu alltid tidsstabil (QuickSort har gjorts om).
    • "Base.splat" är nu exporterad. Returvärdet är av typen "Base.Splat" snarare än en anonym funktion, vilket gör att det kan matas ut snyggt.
  • Pakethanterare
    • "Package Extensions": Stöd för att ladda ett kodavsnitt från andra paket som laddas i en Julia-session. Applikationen liknar paketet "Requires.jl", men förkompilering och inställningskompatibilitet stöds.
  • Linjär algebra bibliotek
    • På grund av risken för förväxling med element-vis division togs bort metoderna "a/b" och "b\a" med skalär "a" och vektor "b", som motsvarade "a * pinv(b)".
    • Att ringa BLAS och LAPACK använder nu "libblastrampolin (LBT)". OpenBLAS tillhandahålls som standard, men att bygga systembilden med andra BLAS/LAPACK-bibliotek stöds inte. Istället rekommenderas det att använda LBT-mekanismen för att ersätta BLAS/LAPACK med en annan befintlig uppsättning bibliotek.
    • "lu" stöder en ny matrisrotationsstrategi, "RowNonZero()", som väljer det första rotationselementet som inte är noll för användning med nya aritmetiska typer och för träningsändamål.
    • "normalize(x, p=2)" stöder nu alla normaliserade vektorrymd "x", inklusive skalärer.
    • Standardantalet BLAS-trådar är nu lika med antalet CPU-trådar på ARM-arkitekturer och hälften av antalet CPU-trådar på andra arkitekturer.
  • Printf: Omarbetade felmeddelanden för felaktigt formaterade strängar för bättre läsbarhet.
  • Profil: Ny funktion "Profile.take_heap_snapshot(file)", som skriver en fil i det JSON-baserade formatet ".heapsnapshot" som stöds i Chrome.
  • Random: randn och randexp fungerar nu för alla AbstractFloat-typer som definierar rand.
  • REPL
    • Genom att trycka på tangentkombinationen "Alt-e" öppnas nu den aktuella inmatningen i editorn. Innehållet (om det ändras) kommer att köras när du avslutar redigeraren.
    • Den aktuella modulkontexten som är aktiv i REPL kan ändras (Main som standard) med funktionen "REPL.activate(::Module)" eller genom att mata in modulen i REPL och trycka på tangentkombinationen "Alt-m".
    • Läget "numrerad prompt", som skriver ut siffror för varje ingång och utgång och lagrar de poängsatta resultaten i Out, kan aktiveras med "REPL.numbered_prompt!()".
    • Tablettering visar tillgängliga sökordsargument.
  • SuiteSparse: Flyttade kod för "SuiteSparse"-lösaren till "SparseArrays.jl". Lösare återexporteras nu av "SuiteSparse.jl".
  • SparseArrays
    • "SuiteSparse"-lösare är nu tillgängliga som "SparseArrays"-undermoduler.
    • UMFPACK och CHOLMOD trådskyddslägen har förbättrats genom att eliminera globala variabler och använda lås. Flertrådig "ldiv!" UMFPACK-objekt kan nu exekveras säkert.
    • Den experimentella funktionen "SparseArrays.allowscalar(::Bool)" låter dig inaktivera eller aktivera skalär indexering av glesa arrayer. Denna funktion är utformad för att upptäcka slumpmässig skalär indexering av "SparseMatrixCSC"-objekt, vilket är en vanlig källa till prestandaproblem.
  • Nytt felsäkert läge för testsviter som avslutar en testkörning tidigt i händelse av ett fel eller fel. Ställ in antingen via "@testset kwarg failfast=true" eller "export JULIA_TEST_FAILFAST=true". Detta är ibland nödvändigt i CI-körningar för att få felmeddelanden tidigt.
  • Datum: Tomma strängar tolkas inte längre felaktigt som giltiga "DateTime", "Dates" eller "Times"-värden och istället kastar ett "ArgumentError" i konstruktorer och parsning, medan "tryparse" inte returnerar något.
  • Paket distribueras
    • Paketkonfigurationen (aktivt projekt, "LOAD_PATH", "DEPOT_PATH") sprids nu när lokala arbetsprocesser läggs till (t.ex. genom att använda "addprocs(N::Int)" eller använda kommandoradsflaggan "--procs=N").
    • "addprocs" för lokala arbetsprocesser accepterar nu ett argument som heter "env" för att skicka miljövariabler till arbetsprocesser.
  • Unicode: "graphemes(s, m:n)" returnerar delsträngen från det m:te till n:te grafemet i "s".
  • Paketet DelimitedFiles har tagits bort från systembiblioteken och distribueras nu som ett separat paket som måste vara explicit installerat för att kunna användas.
  • Externa beroenden
    • I Linux detekteras versionen av systembiblioteket libstdc++ automatiskt och, om det är nyare, laddas det. Det gamla libstdc++ inbyggda laddningsbeteendet, oavsett systemversion, kan återställas genom att ställa in miljövariabeln "JULIA_PROBE_LIBSTDCXX=0".
    • Tog bort "RPATH" från julia-binären, som kan bryta bibliotek på Linux som misslyckas med att definiera variabeln "RUNPATH".
    • Verktygsförbättringar: Utdata från "MethodError" och metoder (till exempel från "methods(my_func)") är nu formaterad och färgad i enlighet med principen för utdata av metoder i en stackspårning.

    Källa: opennet.ru

Lägg en kommentar