Release av programmeringsspråket Julia 1.8

Utgivningen av programmeringsspråket Julia 1.8 är tillgänglig, 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.8:

  • Nya språkfunktioner
    • Fält i en föränderlig struktur kan nu annoteras som konstanter för att förhindra att de ändras och möjliggöra optimering.
    • Typkommentarer kan läggas till globala variabler.
    • Tomma n-dimensionella arrayer kan skapas med flera semikolon inom hakparenteser, till exempel "[;;;]" skapar en 0x0x0 array.
    • Prova block kan nu valfritt ha ett annat block, som exekveras omedelbart efter huvuddelen om inga fel har kastats.
    • @inline och @noinline kan placeras inuti en funktionskropp, så att du kan kommentera en anonym funktion.
    • @inline och @noinline kan nu appliceras på en funktion i en anropsplats eller block för att tvinga motsvarande funktionsanrop att inkluderas (eller inte inkluderas).
    • ∀, ∃ och ∄ är tillåtna som identifierare.
    • Tillagt stöd för Unicode 14.0.0-specifikationen.
    • Metoden Module(:name, false, false) kan användas för att skapa en modul som inte innehåller namn, som inte importerar Base eller Core och inte innehåller en referens till sig själv.
  • Förändringar i språket
    • Nyskapade Task-objekt (@spawn, @async, etc.) har nu world_age för metoder från den överordnade Task när de skapas, vilket möjliggör optimerad exekvering. Det tidigare aktiveringsalternativet är tillgängligt med metoden Base.invokelatest.
    • Unicode obalanserade dubbelriktade formateringsdirektiv är nu förbjudna i strängar och kommentarer för att undvika injektioner.
    • Base.ifelse definieras nu som en generisk funktion snarare än en inbyggd funktion, vilket tillåter paket att utöka sin definition.
    • Varje tilldelning till en global variabel går nu först igenom ett anrop till convert(Any, x) eller convert(T, x) om den globala variabeln deklarerades vara av typen T. Innan du använder globala variabler, se till att den invarianta convert(Any) , x) === x är alltid sant, annars kan det leda till oväntat beteende.
    • Inbyggda funktioner liknar nu generiska funktioner och kan räknas upp programmatiskt med metoder.
  • Förbättringar av kompilator/körtid
    • Starttiden minskas med cirka 25 %.
    • Den LLVM-baserade kompilatorn har separerats från runtime-biblioteket till ett nytt bibliotek, libjulia-codegen. Den är laddad som standard, så det bör inte göras några ändringar under normal användning. I distributioner som inte behöver en kompilator (till exempel systemavbildningar där all nödvändig kod är förkompilerad) kan detta bibliotek (och dess LLVM-beroende) helt enkelt utelämnas.
    • Villkorlig typinferens är nu möjlig genom att skicka ett argument till en metod. Till exempel, för Base.ifelse(isa(x, Int), x, 0) returnerar ::Int även om typen av x är okänd.
    • SROA (Scalar Replacement of Aggregates) har förbättrats: eliminerar getfield-anrop med beständiga globala fält, eliminerar föränderliga strukturer med oinitierade fält, förbättrar prestanda och hantering av kapslade getfield-anrop.
    • Typinferens spårar olika effekter – biverkningar och non-dropping. Konstant spridning beaktas, vilket avsevärt förbättrar kompileringstidens prestanda. I vissa fall, till exempel, kommer anrop till funktioner som inte kan infogas men som inte påverkar resultatet att kasseras vid körning. Regler för effekter kan skrivas över manuellt med makrot Base.@assume_effects.
    • Förkompilering (med explicita förkompileringsdirektiv eller specificerade arbetsbelastningar) sparar nu mer typdefinierad kod, vilket resulterar i snabbare förstagångsexekvering. Alla nya metod/typkombinationer som behövs av ditt paket, oavsett var dessa metoder definierades, kan nu cachelagras i förkompileringsfilen om de anropas av en metod som tillhör ditt paket.
  • Ändringar av kommandoradsalternativ
    • Standardbeteendet för övervakning av @inbounds-deklarationer är nu autoalternativet i "--check-bounds=yes|no|auto".
    • Nytt "--strip-metadata"-alternativ för att ta bort docstrings, källplatsinformation och lokala variabelnamn när du skapar en systemavbildning.
    • Nytt alternativ "--strip-ir" för att tillåta kompilatorn att ta bort den mellanliggande källkodsrepresentationen när systembilden byggs. Den resulterande bilden kommer bara att fungera om "--compile=all" används eller om all nödvändig kod är förkompilerad.
    • Om tecknet "-" anges istället för filnamnet läses den körbara koden från standardinmatningsströmmen.
  • Ändringar av stöd för flera trådar
    • Threads.@threads använder som standard det nya schemaläggningsalternativet :dynamic, som skiljer sig från det tidigare läget genom att iterationer kommer att schemaläggas dynamiskt över tillgängliga arbetstrådar istället för att tilldelas varje tråd. Detta läge möjliggör bättre distribution av kapslade loopar med @spawn och @threads.
  • Nya biblioteksfunktioner
    • eachsplit(str) för att köra split(str) flera gånger.
    • allequal(itr) för att testa om alla element i en iterator är lika.
    • hardlink(src, dst) kan användas för att skapa hårda länkar.
    • setcpuaffinity(cmd, cpus) för att ställa in affiniteten för processorkärnan till de startade processerna.
    • diskstat(path=pwd()) för att få diskstatistik.
    • Nytt @showtime-makro för att visa både raden som utvärderas och @time-rapporten.
    • LazyString och lazy"str"-makro har lagts till för att stödja lazy konstruktion av felmeddelanden i felsökvägar.
    • Fixat ett samtidighetsproblem i Dict och andra härledda objekt som nycklar(::Dict), värden(::Dict) och Set. Iterationsmetoder kan nu anropas på en ordbok eller uppsättning, så länge det inte finns några anrop som modifierar ordboken eller uppsättningen.
    • @time och @timev har nu en valfri beskrivning, så att du till exempel kan kommentera källan för tidsrapporter. @time "Evaluating foo" foo().
    • intervallet tar antingen stopp eller längd som sitt enda sökordsargument.
    • precision och setprecision accepterar nu bas som nyckelord
    • TCP-socketobjekt tillhandahåller nu en closewrite-metod och stöder användningen av halvöppet läge.
    • extrema accepterar nu ett init-argument.
    • Iterators.countfrom accepterar nu alla typer som definierar en +-metod.
    • @time allokerar nu % av tiden som går åt till att kompilera om metoder med ändrade typer.
  • Standardbiblioteksändringar
    • Nycklar med värde Ingenting tas nu bort från miljön i addenv.
    • Iterators.reverse (och därför last) stöder varje rad.
    • Längdfunktionen för intervall av vissa typer kontrollerar inte längre efter heltalsspill. En ny funktion, checked_length, är tillgänglig, den innehåller styrlogik för bitöverföring. Om det behövs, använd SaferIntegers.jl för att konstruera intervalltypen.
    • Iterators.Reverse iteratorn implementerar varje indexomkastning om möjligt.
  • Pakethanterare
    • Nya ⌃ och ⌅ indikatorer bredvid paket i "pkg>" status för vilka nya versioner är tillgängliga. ⌅ indikerar att nya versioner inte kan installeras.
    • Nytt föråldrat::Bool-argument till Pkg.status (--outdated eller -o i REPL-läge) för att visa information om paket från tidigare versioner.
    • Nytt compat::Bool-argument till Pkg.status (--compat eller -c i REPL-läge) för att visa alla [compat]-poster i Project.toml.
    • Nytt läge "pkg>compat" (och Pkg.compat) för att ställa in projektkompatibilitetsposter. Ger en interaktiv editor via "pkg>compat" eller direkt postkontroll via "pkg>Foo 0.4,0.5", som kan ladda aktuella poster via flikkomplettering. Det vill säga "pkg> compat Fo " uppdateras automatiskt till "pkg>Foo 0.4,0.5" för att tillåta redigering av en befintlig post.
    • Pkg försöker nu bara ladda ner paket från en paketserver om servern övervakar registret som innehåller paketet.
    • Pkg.instantiate kommer nu att utfärda en varning när Project.toml inte är synkroniserat med Manifest.toml. Den gör detta baserat på en hash av projektets deps och kompatibla poster (andra fält ignoreras) i manifestet när det löses, så att alla ändringar i Project.toml deps eller kompatibla poster kan upptäckas utan att lösas om.
    • Om "pkg>add" inte kan hitta ett paket med det angivna namnet, kommer det nu att föreslå paket med liknande namn som kan läggas till.
    • Den version av julia som lagras i manifestet innehåller inte längre byggnumret, vilket betyder att master nu kommer att skrivas som 1.9.0-DEV.
    • Testavbryt "pkg>" kommer nu att upptäckas mer konsekvent och kommer att returneras korrekt till REPL.
  • InteractiveUtils
    • Nytt @time_imports-makro för att rapportera tiden som ägnats åt att importera paket och deras beroenden, och markera kompilerings- och omkompileringstiden som en procentandel av importerna.
  • Linjär algebra
    • BLAS-undermodulen stöder nu nivå-2 BLAS spr!-funktioner.
    • Standardbiblioteket LinearAlgebra.jl är nu helt oberoende av SparseArrays.jl, både ur ett källkods- och enhetstestningsperspektiv. Som en konsekvens returneras glesa arrayer inte längre (implicit) av metoder från LinearAlgebra som tillämpas på Base- eller LinearAlgebra-objekt. I synnerhet leder detta till följande brytande förändringar:
      • Sammankopplingar som använder speciella "glesa" matriser (t.ex. diagonal) returnerar nu täta matriser; Som en konsekvens är D1- och D2-fälten för SVD-objekt skapade av getproperty-anrop nu täta matriser.
      • Liknande(::SpecialSparseMatrix, ::Type, ::Dims)-metoden returnerar en tät nollmatris. Som en konsekvens leder produkter av två-, tre- och symmetriska tridiagonala matriser med varandra till genereringen av en tät matris. Dessutom misslyckas nu att konstruera liknande matriser med tre argument från speciella "glesa" matriser från (icke-statiska) matriser på grund av "noll(::Typ{Matrix{T}})".
  • Printf
    • %s och %c använder nu argumentet textwidth för att formatera bredden.
  • Profil
    • Processorbelastningsprofilering registrerar nu metadata inklusive trådar och uppgifter. Profile.print() har ett nytt groupby-argument som låter dig gruppera trådar, uppgifter eller undertrådar/uppgifter, uppgifter/trådar och trådar och uppgiftsargument för att ge filtrering. Dessutom rapporteras nu utnyttjandeprocent antingen som en total eller per tråd, beroende på om tråden är tomgång eller inte i varje prov. Profile.fetch() inkluderar den nya metadatan som standard. För bakåtkompatibilitet med externa konsumenter av profileringsdata kan den uteslutas genom att skicka include_meta=false.
    • Den nya Profile.Allocs-modulen låter dig profilera minnestilldelningar. En stackspårning av typen och storleken för varje minnesallokering registreras, och argumentet sample_rate tillåter att ett konfigurerbart antal allokeringar hoppas över, vilket minskar prestandaoverhead.
    • CPU-profilering med fast varaktighet kan nu köras av användaren medan uppgifter körs utan att först ladda profilen, och rapporten kommer att visas medan den körs. På MacOS och FreeBSD, tryck på ctrl-t eller ring SIGINFO. För andra plattformar, aktivera SIGUSR1, d.v.s. % döda -USR1 $julia_pid. Detta är inte tillgängligt på Windows.
  • REPL
    • RadioMenu stöder nu ytterligare kortkommandon för direkt val av alternativ.
    • Sekvensen "?(x, y" följt av att trycka på TAB visar alla metoder som kan anropas med argumenten x, y, .... (Ett inledande mellanslag hindrar dig från att gå in i hjälpläge.) "MyModule.?(x, y " begränsar sökningen till "MyModule". Att trycka på TAB kräver att minst ett argument är av en typ som är mer specifik än Any. Eller använd SHIFT-TAB istället för TAB för att tillåta alla kompatibla metoder.
    • Den nya globala variabeln err låter dig få det senaste undantaget, liknande beteendet hos ans med det senaste svaret. Om du anger fel skrivs undantagsinformationen ut igen.
  • SparseArrays
    • Flyttade SparseArrays-koden från Julia-förvaret till det externa SparseArrays.jl-förrådet.
    • De nya sammanlänkningsfunktionerna sparse_hcat, sparse_vcat och sparse_hvcat returnerar en SparseMatrixCSC-typ oavsett typen av inmatningsargument. Detta blev nödvändigt för att förena mekanismen för limning av matriser efter att ha separerat koden LinearAlgebra.jl och SparseArrays.jl.
  • Loggning
    • Standardloggningsnivåerna BelowMinLevel, Debug, Info, Warn, Error och AboveMaxLevel exporteras nu från standardloggningsbiblioteket.
  • Unicode
    • Lade till funktion isequal_normalized för att kontrollera Unicode-ekvivalens utan att uttryckligen konstruera normaliserade strängar.
    • Funktionen Unicode.normalize accepterar nu nyckelordet charttransform, som kan användas för att tillhandahålla anpassade teckenmappningar, och Unicode.julia_chartransform-funktionen tillhandahålls också för att återskapa den mappning som används när Julia-parsern normaliserar identifierare.
  • Testa
    • '@test_throws "något meddelande" triggers_error()' kan nu användas för att testa om den visade feltexten innehåller ett "något meddelande"-fel, oavsett den specifika undantagstypen. Reguljära uttryck, stränglistor och matchande funktioner stöds också.
    • @testset foo() kan nu användas för att skapa en testuppsättning från en given funktion. Testfallets namn är namnet på den funktion som anropas. Den anropade funktionen kan innehålla @test och andra @testset-definitioner, inklusive för anrop till andra funktioner, samtidigt som alla mellanliggande testresultat registreras.
    • TestLogger och LogRecord exporteras nu från standardtestbiblioteket.
  • Distribuerad
    • SSHManager stöder nu arbetartrådar med ett csh/tcsh-omslag via metoden addprocs() och parametern shell=:csh.
  • Andra förändringar
    • GC.enable_logging(true) kan användas för att logga varje skräpinsamlingsoperation med tiden och mängden minne som samlats in.

Källa: opennet.ru

Lägg en kommentar