Programmeertaal Julia 1.9 beschikbaar

De release van de programmeertaal Julia 1.9 is gepubliceerd, waarin kwaliteiten als hoge prestaties, ondersteuning voor dynamisch typen en ingebouwde tools voor parallel programmeren worden gecombineerd. Julia's syntaxis ligt dicht bij MATLAB en leent enkele elementen van Ruby en Lisp. De stringmanipulatiemethode doet denken aan Perl. De projectcode wordt gedistribueerd onder de MIT-licentie.

Belangrijkste kenmerken van de taal:

  • Hoge prestaties: een van de belangrijkste doelstellingen van het project is het bereiken van prestaties die dicht bij C-programma's liggen. De Julia-compiler is gebaseerd op het werk van het LLVM-project en genereert efficiënte native machinecode voor veel doelplatforms;
  • Ondersteunt verschillende programmeerparadigma's, inclusief elementen van objectgeoriënteerd en functioneel programmeren. De standaardbibliotheek biedt onder andere functies voor asynchrone I/O, procesbesturing, logging, profilering en pakketbeheer;
  • Dynamisch typen: de taal vereist geen expliciete definitie van typen voor variabelen, vergelijkbaar met scriptprogrammeertalen. Interactieve modus ondersteund;
  • Optionele mogelijkheid om typen expliciet te specificeren;
  • Een syntaxis die ideaal is voor numeriek computergebruik, wetenschappelijk computergebruik, machine learning en datavisualisatie. Ondersteuning voor veel numerieke gegevenstypen en hulpmiddelen voor parallellisatie van berekeningen.
  • De mogelijkheid om functies rechtstreeks uit C-bibliotheken aan te roepen zonder extra lagen.

Grote veranderingen in Julia 1.9:

  • Nieuwe taalfuncties
    • Sta toe dat toewijzingen in een andere module worden gemaakt met behulp van "setproperty!(::Module, ::Symbol, x)".
    • Meerdere opdrachten die niet op de eindpositie staan, zijn toegestaan. De tekenreeks “a, b…, c = 1, 2, 3, 4” wordt bijvoorbeeld verwerkt als “a = 1; b…, = 2, 3; c=4". Dit wordt afgehandeld via Base.split_rest.
    • Letterlijke waarden van één teken ondersteunen nu dezelfde syntaxis als letterlijke tekenreeksen; die. De syntaxis kan ongeldige UTF-8-reeksen vertegenwoordigen, zoals toegestaan ​​door het Char-type.
    • Ondersteuning toegevoegd voor Unicode 15-specificatie.
    • Geneste combinaties van tupels en benoemde karakter-tupels kunnen nu als typeparameters worden gebruikt.
    • Nieuwe ingebouwde functies "getglobal(::Module, ::Symbol[, order])" en "setglobal!(::Module, ::Symbol, x[, order])" voor het lezen en schrijven van uitsluitend naar globale variabelen. De getglobal-methode verdient nu de voorkeur boven de getfield-methode voor toegang tot globale variabelen.
  • Veranderingen in taal
    • De macro "@invoke" geïntroduceerd in versie 1.7 is nu geëxporteerd en beschikbaar voor gebruik. Bovendien wordt nu de methode "Core.Typeof(x)" gebruikt in plaats van "Any" in het geval dat de typeannotatie wordt weggelaten voor het argument "x". Dit is nodig om ervoor te zorgen dat typen die als argumenten worden doorgegeven, correct worden verwerkt.
    • Export van de functie “invokelatest” en de macro “@invokelatest” ingeschakeld, geïntroduceerd in versie 1.7.
  • Compiler-/runtime-verbeteringen
    • Aanzienlijk kortere tijd tot eerste uitvoering (TTFX - Tijd tot eerste uitvoering). Bij het precompileren van een pakket wordt nu de oorspronkelijke code opgeslagen in "pkgimage", wat betekent dat de code die door het precompilatieproces is gegenereerd, niet opnieuw hoeft te worden gecompileerd nadat het pakket is geladen. Het gebruik van de pkgimages-modus kan worden uitgeschakeld met de optie "--pkgimages=no".
    • Het bekende kwadratische complexiteitsprobleem van type-inferentie is opgelost en inferentie gebruikt in het algemeen minder geheugen. Sommige randgevallen met automatisch gegenereerde lange functies (zoals ModelingToolkit.jl met partiële differentiaalvergelijkingen en grote causale modellen) compileren veel sneller.
    • Oproepen met argumenten zonder concrete typen kunnen nu Union-splitting geoptimaliseerd zijn voor injectie of statische resolutie, zelfs als er meerdere kandidaten van verschillende typen zijn voor verzending. Dit kan de prestaties verbeteren in bepaalde situaties waarin objecttypen niet volledig statisch zijn opgelost, door "@nospecialize-d"-aanroepsites statisch op te lossen en hercompilatie te vermijden.
    • Al het gebruik van de macro @pure in de Base-module is vervangen door Base.@assume_effects.
    • Aanroepen om(f, invokesig, args...) aan te roepen met minder specifieke typen dan gewoonlijk gebruikt voor f(args...) zorgen er niet langer voor dat het pakket opnieuw wordt gecompileerd.
  • Wijzigingen in opdrachtregelopties
    • Op Linux en Windows probeert de optie "--threads=auto" nu het beschikbare aantal processors te bepalen op basis van CPU-affiniteit, een masker dat doorgaans wordt ingesteld in HPC- en cloudomgevingen.
    • De parameter “--math-mode=fast” is uitgeschakeld. In plaats daarvan wordt aanbevolen om de macro “@fastmath” te gebruiken, die een duidelijk gedefinieerde semantiek heeft.
    • De optie "--threads" heeft nu het formaat "auto | N[,auto|M]", waarbij M het aantal interactieve threads aangeeft dat moet worden gemaakt (momenteel betekent auto 1).
    • Optie “—heap-size-hint=” toegevoegd ", waarmee de drempel wordt ingesteld waarna de actieve afvalinzameling begint. De grootte kan worden opgegeven in bytes, kilobytes (1000 KB), megabytes (300 MB) of gigabytes (1,5 GB).
  • Veranderingen in multithreading
    • "Threads.@spawn" heeft nu een optioneel eerste argument met de waarde ":default" of ":interactive". Een interactieve taak vereist een lage responslatentie en is ontworpen om kort te zijn of regelmatig te worden uitgevoerd. Interactieve taken worden uitgevoerd op interactieve threads als deze zijn opgegeven bij het starten van Julia.
    • Threads die buiten de Julia-runtime draaien (zoals vanuit C of Java) kunnen nu Julia-code aanroepen met behulp van "jl_adopt_thread". Dit gebeurt automatisch bij het invoeren van Julia-code via "cfunction" of het "@ccallable"-invoerpunt. Als gevolg hiervan kan het aantal threads nu tijdens de uitvoering veranderen.
  • Nieuwe bibliotheekfuncties
    • Nieuwe functie "Iterators.flatmap".
    • Nieuwe functie "pkgversion(m::Module)" om de versie op te halen van het pakket dat een bepaalde module heeft geladen, vergelijkbaar met "pkgdir(m::Module)".
    • Nieuwe functie "stack(x)" die "reduce(hcat, x::Vector{<:Vector})" generaliseert naar elke dimensie en elke iterator van iterators toestaat. De "stack(f, x)"-methode generaliseert "mapreduce(f, hcat, x)" en is efficiënter.
    • Nieuwe macro voor het analyseren van toegewezen geheugen "@allocations", vergelijkbaar met "@allocated", behalve dat deze het aantal geheugentoewijzingen retourneert in plaats van de totale grootte van het toegewezen geheugen.
  • Nieuwe bibliotheekfuncties
    • "RoundFromZero" werkt nu voor andere typen dan "BigFloat".
    • "Dict" kan nu handmatig worden verkleind met behulp van "sizehint!"
    • "@time" specificeert nu afzonderlijk het percentage tijd dat wordt besteed aan het opnieuw compileren van ongeldige methoden.
  • Wijzigingen in de standaardbibliotheek
    • Er is een gelijktijdigheidsprobleem opgelost in iteratiemethoden voor Dict en andere afgeleide objecten zoals sleutels(::Dict), waarden(::Dict) en Set. Deze iteratiemethoden kunnen nu parallel worden aangeroepen op een Dict of Set voor een onbeperkt aantal threads, zolang er geen acties zijn die het woordenboek of de set wijzigen.
    • Het ontkennen van een predikaatfunctie "!f" retourneert nu een samengestelde functie "(!) ∘ f" in plaats van een anonieme functie.
    • Functies voor dimensiesegmenten werken nu in meerdere dimensies: "eachslice", "eachrow" en "eachcol" retourneren een "Slices"-object waarmee dispatching efficiëntere methoden kan bieden.
    • De macro "@kwdef" is toegevoegd aan de openbare API.
    • Er is een probleem opgelost met de volgorde van bewerkingen in "fld1".
    • Het sorteren is nu altijd tijdstabiel (QuickSort is opnieuw ontworpen).
    • "Base.splat" wordt nu geëxporteerd. De retourwaarde is van het type "Base.Splat" in plaats van een anonieme functie, waardoor deze goed kan worden uitgevoerd.
  • Pakket manager
    • "Pakketextensies": Ondersteuning voor het laden van een codefragment uit andere pakketten die in een Julia-sessie zijn geladen. De applicatie is vergelijkbaar met het pakket "Requires.jl", maar pre-compilatie en compatibiliteit van instellingen worden ondersteund.
  • Lineaire Algebra-bibliotheek
    • Vanwege het risico op verwarring met elementgewijze deling, zijn de methoden "a/b" en "b\a" met scalaire "a" en vector "b" verwijderd, die gelijkwaardig waren aan "a * pinv(b)".
    • Bij het aanroepen van BLAS en LAPACK wordt nu "libblastrampoline (LBT)" gebruikt. OpenBLAS wordt standaard geleverd, maar het bouwen van de systeemimage met andere BLAS/LAPACK-bibliotheken wordt niet ondersteund. In plaats daarvan wordt aanbevolen om het LBT-mechanisme te gebruiken om BLAS/LAPACK te vervangen door een andere bestaande set bibliotheken.
    • "lu" ondersteunt een nieuwe matrixrotatiestrategie, "RowNonZero()", die het eerste niet-nul rotatie-element selecteert voor gebruik met nieuwe rekenkundige typen en voor trainingsdoeleinden.
    • "normalize(x, p=2)" ondersteunt nu elke genormaliseerde vectorruimte "x", inclusief scalairen.
    • Het standaardaantal BLAS-threads is nu gelijk aan het aantal CPU-threads op ARM-architecturen en de helft van het aantal CPU-threads op andere architecturen.
  • Printf: Herwerkte foutmeldingen voor onjuist opgemaakte tekenreeksen voor betere leesbaarheid.
  • Profiel: Nieuwe functie "Profile.take_heap_snapshot(file)", die een bestand schrijft in het JSON-gebaseerde ".heapsnapshot"-formaat dat wordt ondersteund in Chrome.
  • Willekeurig: randn en randexp werken nu voor elk AbstractFloat-type dat rand definieert.
  • VERVANGEN
    • Door op de toetscombinatie "Alt-e" te drukken, wordt nu de huidige invoer in de editor geopend. De inhoud (indien gewijzigd) wordt uitgevoerd wanneer u de editor afsluit.
    • De huidige modulecontext die actief is in de REPL kan worden gewijzigd (standaard Main) met behulp van de functie "REPL.activate(::Module)" of door de module in de REPL in te voeren en op de toetsencombinatie "Alt-m" te drukken.
    • De "genummerde prompt"-modus, die getallen afdrukt voor elke invoer en uitvoer en de gescoorde resultaten opslaat in Out, kan worden geactiveerd met behulp van "REPL.numbered_prompt!()".
    • Als u het tabblad voltooit, worden de beschikbare trefwoordargumenten weergegeven.
  • SuiteSparse: code voor de 'SuiteSparse'-oplosser verplaatst naar 'SparseArrays.jl'. Oplossers worden nu opnieuw geëxporteerd door "SuiteSparse.jl".
  • SparseArrays
    • "SuiteSparse"-oplossers zijn nu beschikbaar als "SparseArrays"-submodules.
    • De draadbeschermingsmodi UMFPACK en CHOLMOD zijn verbeterd door globale variabelen te elimineren en vergrendelingen te gebruiken. Multi-threaded "ldiv!" UMFPACK-objecten kunnen nu veilig worden uitgevoerd.
    • Met de experimentele functie "SparseArrays.allowscalar(::Bool)" kunt u scalaire indexering van sparse arrays in- of uitschakelen. Deze functie is ontworpen om willekeurige scalaire indexering van "SparseMatrixCSC"-objecten te detecteren, wat een veelvoorkomende bron van prestatieproblemen is.
  • Nieuwe failsafe-modus voor testsuites die een testrun vroegtijdig beëindigt in geval van een storing of fout. Stel dit in via “@testset kwarg failfast=true” of “export JULIA_TEST_FAILFAST=true”. Dit is soms nodig bij CI-runs om foutmeldingen vroegtijdig te ontvangen.
  • Datums: Lege tekenreeksen worden niet langer onjuist geparseerd als geldige waarden voor "DateTime", "Dates" of "Times" en gooien in plaats daarvan een "ArgumentError" in constructors en parseren, terwijl "tryparse" niets retourneert.
  • Pakket gedistribueerd
    • De pakketconfiguratie (actief project, "LOAD_PATH", "DEPOT_PATH") wordt nu doorgegeven bij het toevoegen van lokale werkprocessen (bijvoorbeeld door gebruik te maken van "addprocs(N::Int)" of door gebruik te maken van de opdrachtregelvlag "--procs=N").
    • "addprocs" voor lokale werkprocessen accepteert nu een argument met de naam "env" om omgevingsvariabelen door te geven aan werkprocessen.
  • Unicode: "graphemes(s, m:n)" retourneert de subtekenreeks van de m-de tot n-de grafemen in "s".
  • Het DelimitedFiles-pakket is verwijderd uit de systeembibliotheken en wordt nu gedistribueerd als een afzonderlijk pakket dat expliciet moet worden geïnstalleerd om te kunnen worden gebruikt.
  • Externe afhankelijkheden
    • In Linux wordt de versie van de libstdc++-systeembibliotheek automatisch gedetecteerd en, als deze nieuwer is, geladen. Het oude ingebouwde laadgedrag van libstdc++, ongeacht de systeemversie, kan worden hersteld door de omgevingsvariabele "JULIA_PROBE_LIBSTDCXX=0" in te stellen.
    • "RPATH" verwijderd uit het julia-binaire bestand, dat bibliotheken op Linux kan breken die de variabele "RUNPATH" niet kunnen definiëren.
    • Verbeteringen in het gereedschap: De uitvoer van "MethodError" en methoden (bijvoorbeeld van "methods(my_func)") wordt nu opgemaakt en gekleurd in overeenstemming met het principe van de uitvoer van methoden in een stacktrace.

    Bron: opennet.ru

Voeg een reactie