Vrijgave van de programmeertaal Julia 1.8

De release van de programmeertaal Julia 1.8 is beschikbaar, 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.8:

  • Nieuwe taalfuncties
    • Velden van een veranderlijke structuur kunnen nu worden geannoteerd als constanten om te voorkomen dat ze worden gewijzigd en om optimalisatie mogelijk te maken.
    • Typeannotaties kunnen aan globale variabelen worden toegevoegd.
    • Lege n-dimensionale arrays kunnen worden gemaakt met behulp van meerdere puntkomma's tussen vierkante haakjes, bijvoorbeeld "[;;;]" creëert een 0x0x0 array.
    • Try-blokken kunnen nu optioneel een else-blok hebben, dat onmiddellijk na het hoofdgedeelte wordt uitgevoerd als er geen fouten zijn gegenereerd.
    • @inline en @noinline kunnen in de hoofdtekst van een functie worden geplaatst, zodat u een anonieme functie kunt annoteren.
    • @inline en @noinline kunnen nu worden toegepast op een functie in een oproepsite of blok om te forceren dat de overeenkomstige functieaanroepen worden opgenomen (of niet worden opgenomen).
    • ∀, ∃ en ∄ zijn toegestaan ​​als identificatietekens.
    • Ondersteuning toegevoegd voor Unicode 14.0.0-specificatie.
    • De methode Module(:name, false, false) kan worden gebruikt om een ​​module te maken die geen namen bevat, geen Base of Core importeert en geen verwijzing naar zichzelf bevat.
  • Veranderingen in taal
    • Nieuw gemaakte Task-objecten (@spawn, @async, etc.) hebben nu world_age voor methoden van de bovenliggende taak wanneer ze worden gemaakt, waardoor een geoptimaliseerde uitvoering mogelijk is. De vorige activeringsoptie is beschikbaar met behulp van de Base.invokelatest-methode.
    • Unicode-onevenwichtige bidirectionele opmaakrichtlijnen zijn nu verboden in tekenreeksen en opmerkingen om injecties te voorkomen.
    • Base.ifelse wordt nu gedefinieerd als een generieke functie in plaats van als een ingebouwde functie, waardoor pakketten de definitie ervan kunnen uitbreiden.
    • Elke toewijzing aan een globale variabele gaat nu eerst via een aanroep van convert(Any, x) of convert(T, x) als de globale variabele van het type T is verklaard. Voordat u globale variabelen gebruikt, moet u ervoor zorgen dat de invariant convert(Any , x) === x is altijd waar, anders kan dit tot onverwacht gedrag leiden.
    • Ingebouwde functies zijn nu vergelijkbaar met generieke functies en kunnen programmatisch worden opgesomd met behulp van methoden.
  • Compiler-/runtime-verbeteringen
    • Opstarttijd verminderd met ongeveer 25%.
    • De op LLVM gebaseerde compiler is gescheiden van de runtimebibliotheek in een nieuwe bibliotheek, libjulia-codegen. Het wordt standaard geladen, dus er mogen geen wijzigingen optreden tijdens normaal gebruik. In implementaties waarvoor geen compiler nodig is (bijvoorbeeld systeemimages waarin alle benodigde code vooraf is gecompileerd), kan deze bibliotheek (en de LLVM-afhankelijkheid ervan) eenvoudigweg worden weggelaten.
    • Voorwaardelijke type-inferentie is nu mogelijk door een argument aan een methode door te geven. Voor Base.ifelse(isa(x, Int), x, 0) retourneert bijvoorbeeld ::Int, zelfs als het type x onbekend is.
    • SROA (Scalar Replacement of Aggregates) is verbeterd: elimineert getfield-oproepen met persistente globale velden, elimineert veranderlijke structuren met niet-geïnitialiseerde velden, verbetert de prestaties en verwerking van geneste getfield-oproepen.
    • Type-inferentie houdt verschillende effecten bij: bijwerkingen en non-dropping. Er wordt rekening gehouden met constante propagatie, wat de prestaties tijdens het compileren aanzienlijk verbetert. In sommige gevallen worden bijvoorbeeld aanroepen van functies die niet inline kunnen worden geplaatst maar die het resultaat niet beïnvloeden, tijdens runtime weggegooid. Regels voor effecten kunnen handmatig worden overschreven met behulp van de macro Base.@assume_effects.
    • Precompilatie (met expliciete precompilatierichtlijnen of gespecificeerde werkbelastingen) bespaart nu meer typegedefinieerde code, wat resulteert in een snellere uitvoering bij de eerste keer. Alle nieuwe methode/type-combinaties die uw pakket nodig heeft, ongeacht waar deze methoden zijn gedefinieerd, kunnen nu in de cache in het precompilatiebestand worden opgeslagen als ze worden aangeroepen door een methode die bij uw pakket hoort.
  • Wijzigingen in opdrachtregelopties
    • Het standaardgedrag voor het controleren van @inbounds-declaraties is nu de automatische optie in "--check-bounds=yes|no|auto".
    • Nieuwe "--strip-metadata"-optie om docstrings, bronlocatie-informatie en lokale variabelenamen te verwijderen bij het maken van een systeemimage.
    • Nieuwe optie "--strip-ir" waarmee de compiler de tussenliggende broncoderepresentatie kan verwijderen bij het bouwen van de systeemimage. De resulterende afbeelding werkt alleen als "--compile=all" wordt gebruikt of als alle vereiste code vooraf is gecompileerd.
    • Als het teken "-" wordt opgegeven in plaats van de bestandsnaam, wordt de uitvoerbare code uit de standaardinvoerstroom gelezen.
  • Wijzigingen in de ondersteuning van multithreading
    • Threads.@threads gebruikt standaard de nieuwe planningsoptie:dynamic, die verschilt van de vorige modus doordat iteraties dynamisch worden gepland over de beschikbare werkthreads in plaats van dat ze aan elke thread worden toegewezen. Deze modus zorgt voor een betere distributie van geneste lussen met @spawn en @threads.
  • Nieuwe bibliotheekfuncties
    • everysplit(str) om split(str) meerdere keren uit te voeren.
    • allequal(itr) om te testen of alle elementen in een iterator gelijk zijn.
    • hardlink(src, dst) kan worden gebruikt om harde links te maken.
    • setcpuaffinity(cmd, cpus) om de affiniteit van de processorkern voor de gelanceerde processen in te stellen.
    • diskstat(path=pwd()) om schijfstatistieken op te halen.
    • Nieuwe @showtime-macro om zowel de lijn die wordt geëvalueerd als het @time-rapport weer te geven.
    • LazyString en lazy"str"-macro zijn toegevoegd om de luie constructie van foutmeldingen in foutpaden te ondersteunen.
    • Er is een gelijktijdigheidsprobleem opgelost in Dict en andere afgeleide objecten zoals sleutels(::Dict), waarden(::Dict) en Set. Iteratiemethoden kunnen nu worden aangeroepen op een woordenboek of set, zolang er geen aanroepen zijn die het woordenboek of de set wijzigen.
    • @time en @timev hebben nu een optionele beschrijving, waarmee u bijvoorbeeld de bron van tijdrapporten kunt annoteren. @time "Evalueert foo" foo().
    • bereik neemt stop of lengte als enige trefwoordargument.
    • precisie en setprecisie accepteren nu basis als sleutelwoord
    • TCP-socketobjecten bieden nu een closewrite-methode en ondersteunen het gebruik van de half-open modus.
    • extrema accepteert nu een init-argument.
    • Iterators.countfrom accepteert nu elk type dat een + -methode definieert.
    • @time wijst nu het percentage tijd toe dat is besteed aan het opnieuw compileren van methoden met gewijzigde typen.
  • Standaard bibliotheekwijzigingen
    • Sleutels met waarde Niets wordt nu uit de omgeving verwijderd in addenv.
    • Iterators.reverse (en dus laatste) ondersteunt elke regel.
    • De lengtefunctie voor bereiken van bepaalde typen controleert niet langer op overloop van gehele getallen. Er is een nieuwe functie, checking_length, beschikbaar; deze bevat controlelogica voor bitoverdracht. Gebruik indien nodig SaferIntegers.jl om het bereiktype samen te stellen.
    • De Iterators.Reverse iterator implementeert indien mogelijk elke indexomkering.
  • Pakket manager
    • Nieuwe ⌃ en ⌅ indicatoren naast pakketten in de “pkg>” status waarvoor nieuwe versies beschikbaar zijn. ⌅ geeft aan dat er geen nieuwe versies kunnen worden geïnstalleerd.
    • Nieuw verouderd::Bool-argument voor Pkg.status (--verouderd of -o in REPL-modus) om informatie over pakketten uit eerdere versies weer te geven.
    • Nieuw compat::Bool-argument voor Pkg.status (--compat of -c in REPL-modus) om alle [compat]-vermeldingen in Project.toml weer te geven.
    • Nieuwe "pkg>compat" (en Pkg.compat) modus voor het instellen van projectcompatibiliteitsgegevens. Biedt een interactieve editor via "pkg>compat" of directe recordcontrole via "pkg>Foo 0.4,0.5", die huidige records kan laden via het voltooien van tabbladen. Dat wil zeggen: "pkg> compat Fo " wordt automatisch bijgewerkt naar "pkg>Foo 0.4,0.5" om het bewerken van een bestaand item mogelijk te maken.
    • Pkg probeert nu alleen pakketten te downloaden van een pakketserver als de server het register controleert dat het pakket bevat.
    • Pkg.instantiate geeft nu een waarschuwing wanneer Project.toml niet gesynchroniseerd is met Manifest.toml. Het doet dit op basis van een hash van de deps- en compat-records van het project (andere velden worden genegeerd) in het manifest bij het oplossen ervan, zodat elke wijziging in de Project.toml deps- of compat-records kan worden gedetecteerd zonder deze opnieuw op te lossen.
    • Als "pkg>add" geen pakket met de opgegeven naam kan vinden, zal het nu pakketten met vergelijkbare namen voorstellen die kunnen worden toegevoegd.
    • De versie van Julia die in het manifest is opgeslagen, bevat niet langer het buildnummer, wat betekent dat master nu wordt geschreven als 1.9.0-DEV.
    • Testafbreken "pkg>" wordt nu consistenter gedetecteerd en correct teruggestuurd naar de REPL.
  • InteractieveUtils
    • Nieuwe macro @time_imports om de tijd te rapporteren die is besteed aan het importeren van pakketten en hun afhankelijkheden, waarbij de compileer- en hercompilatietijd wordt benadrukt als een percentage van de import.
  • Lineaire algebra
    • De BLAS-submodule ondersteunt nu BLAS spr!-functies van niveau 2.
    • De standaardbibliotheek LinearAlgebra.jl is nu volledig onafhankelijk van SparseArrays.jl, zowel vanuit het perspectief van de broncode als van het testen van eenheden. Als gevolg hiervan worden spaarse arrays niet langer (impliciet) geretourneerd door methoden van LinearAlgebra die worden toegepast op Base- of LinearAlgebra-objecten. Dit leidt met name tot de volgende belangrijke veranderingen:
      • Aaneenschakelingen die gebruik maken van speciale "sparse" matrices (bijvoorbeeld diagonaal) leveren nu compacte matrices op; Als gevolg hiervan zijn de D1- en D2-velden van SVD-objecten die zijn gemaakt door getproperty-aanroepen nu compacte matrices.
      • De methode soortgelijke(::SpecialSparseMatrix, ::Type, ::Dims) retourneert een dichte nulmatrix. Als gevolg hiervan leiden producten van twee-, drie- en symmetrische tridiagonale matrices met elkaar tot het genereren van een dichte matrix. Bovendien mislukt het construeren van soortgelijke matrices met drie argumenten uit speciale "sparse" matrices uit (niet-statische) matrices vanwege "zero(::Type{Matrix{T}})".
  • printf
    • %s en %c gebruiken nu het tekstbreedte-argument om de breedte op te maken.
  • Profiel
    • CPU-belastingprofilering registreert nu metagegevens, inclusief threads en taken. Profile.print() heeft een nieuw groupby-argument waarmee u threads, taken of subthreads/taken, taken/threads en threads en taken-argumenten kunt groeperen om filtering mogelijk te maken. Bovendien wordt het gebruikspercentage nu gerapporteerd als geheel of per thread, afhankelijk van of de thread in elk voorbeeld inactief is of niet. Profile.fetch() bevat standaard de nieuwe metagegevens. Voor achterwaartse compatibiliteit met externe consumenten van profileringsgegevens kan dit worden uitgesloten door include_meta=false door te geven.
    • Met de nieuwe Profile.Allocs-module kunt u geheugentoewijzingen profileren. Er wordt een stacktracering van het type en de grootte van elke geheugentoewijzing geregistreerd, en het argument sample_rate maakt het mogelijk een configureerbaar aantal toewijzingen over te slaan, waardoor de prestatieoverhead wordt verminderd.
    • CPU-profilering met een vaste duur kan nu door de gebruiker worden uitgevoerd terwijl taken worden uitgevoerd, zonder eerst het profiel te laden, en het rapport wordt tijdens het uitvoeren weergegeven. Op MacOS en FreeBSD drukt u op ctrl-t of roept u SIGINFO aan. Voor andere platforms activeert u SIGUSR1, d.w.z. % doden -USR1 $julia_pid. Dit is niet beschikbaar op Windows.
  • VERVANGEN
    • RadioMenu ondersteunt nu extra sneltoetsen voor directe selectie van opties.
    • De reeks "?(x, y" gevolgd door het indrukken van TAB geeft alle methoden weer die kunnen worden aangeroepen met de argumenten x, y, .... (Een spatie vooraan verhindert dat u de helpmodus opent.) "MijnModule.?(x, y " beperkt de zoekopdracht tot "MijnModule". Als u op TAB drukt, moet ten minste één argument van een specifieker type zijn dan Elk. Of gebruik SHIFT-TAB in plaats van TAB om compatibele methoden toe te staan.
    • Met de nieuwe globale variabele err kunt u de laatste uitzondering verkrijgen, vergelijkbaar met het gedrag van an met het laatste antwoord. Als u err invoert, wordt de uitzonderingsinformatie opnieuw afgedrukt.
  • SparseArrays
    • De SparseArrays-code is verplaatst van de Julia-repository naar de externe SparseArrays.jl-repository.
    • De nieuwe aaneenschakelingsfuncties sparse_hcat, sparse_vcat en sparse_hvcat retourneren een SparseMatrixCSC-type, ongeacht het type invoerargumenten. Dit werd nodig om het mechanisme voor het lijmen van matrices te verenigen na het scheiden van de codes LinearAlgebra.jl en SparseArrays.jl.
  • Logging
    • De standaard logniveaus BelowMinLevel, Debug, Info, Warn, Error en AboveMaxLevel worden nu geëxporteerd vanuit de standaard Logging-bibliotheek.
  • Unicode
    • Functie isequal_normalized toegevoegd om te controleren op Unicode-equivalentie zonder expliciet genormaliseerde tekenreeksen te construeren.
    • De functie Unicode.normalize accepteert nu het trefwoord charttransform, dat kan worden gebruikt om aangepaste tekentoewijzingen te bieden, en de functie Unicode.julia_chartransform is ook beschikbaar om de toewijzing te reproduceren die wordt gebruikt wanneer de Julia-parser identifiers normaliseert.
  • test
    • '@test_throws "some message" triggers_error()' kan nu worden gebruikt om te testen of de weergegeven fouttekst een "some message"-fout bevat, ongeacht het specifieke uitzonderingstype. Reguliere expressies, tekenreekslijsten en overeenkomende functies worden ook ondersteund.
    • @testset foo() kan nu worden gebruikt om een ​​testset van een bepaalde functie te maken. De testcasenaam is de naam van de functie die wordt aangeroepen. De aangeroepen functie kan @test en andere @testset-definities bevatten, inclusief voor oproepen naar andere functies, terwijl alle tussentijdse testresultaten worden vastgelegd.
    • TestLogger en LogRecord worden nu geëxporteerd vanuit de standaard Testbibliotheek.
  • Distributed
    • SSHManager ondersteunt nu werkthreads met een csh/tcsh-wrapper via de addprocs()-methode en de shell=:csh-parameter.
  • Andere wijzigingen
    • GC.enable_logging(true) kan worden gebruikt om elke garbagecollection-bewerking te registreren met de tijd en hoeveelheid verzameld geheugen.

Bron: opennet.ru

Voeg een reactie