Rilascio del linguaggio di programmazione Julia 1.12

È stata pubblicata la versione 1.12 del linguaggio di programmazione Julia, che combina caratteristiche come elevate prestazioni, supporto per la tipizzazione dinamica e strumenti integrati per la programmazione parallela. La sintassi di Julia è simile a MATLAB con l'adozione di alcuni elementi da Ruby e Lisp. Il metodo di manipolazione delle stringhe ricorda Perl. Il codice del progetto è distribuito con licenza MIT.

Caratteristiche principali del linguaggio:

  • Alte prestazioni: uno degli obiettivi chiave del progetto è raggiungere prestazioni simili a quelle dei programmi scritti in C. Il compilatore di Julia è basato sui risultati del progetto LLVM e genera codice macchina nativo efficiente per molte piattaforme mirate;
  • Supporto per diverse paradigmi di programmazione, inclusi elementi di programmazione orientata agli oggetti e funzionale. La libreria standard fornisce anche funzioni per l'input/output asincrono, la gestione dei processi, la registrazione, il profiling e la gestione dei pacchetti;
  • Tipizzazione dinamica: il linguaggio non richiede la definizione esplicita dei tipi per le variabili, simile ai linguaggi di scripting. È supportata la modalità interattiva.
  • Possibilità opzionale di specificare esplicitamente i tipi;
  • Una sintassi perfettamente adatta per calcoli numerici, studi scientifici, sistemi di apprendimento automatico e visualizzazione dei dati. Supporto per molti tipi di dati numerici e strumenti per il parallelismo nei calcoli.
  • Possibilità di chiamare direttamente funzioni da librerie in linguaggio C senza strati aggiuntivi.

Principali novità in Julia 1.12:

  • Nuove funzionalità del linguaggio
    • È stato introdotto il parametro sperimentale «—trim», che consente di creare file binari più compatti rimuovendo il codice non raggiungibile dai punti di ingresso specificati. I punti di ingresso possono essere contrassegnati utilizzando «Base.Experimental.entrypoint». Non tutto il codice potrebbe funzionare con questa opzione.
    • La ridefinizione delle costanti è stata chiaramente definita e segue la semantica «world age». Sono consentite ulteriori ridefinizioni (ad esempio, dei tipi).
    • Alla funzione «names» è stato aggiunto un nuovo parametro «usings::Bool», che costringe la funzione a restituire tutti i nomi visibili tramite «using».
    • La famiglia di macro «@atomic» supporta ora la sintassi di assegnazione dei riferimenti, ad esempio: «@atomic :monotonic v[3] += 4», che modifica in modo atomico «v[3]» con semantica di ordinamento monotono. La sintassi supportata include:
      • lettura atomica («x = @atomic v[3]»),
      • assegnazione atomica («@atomic v[3] = 4»),
      • modifica atomica («@atomic v[3] += 2»),
      • assegnazione atomica unica («@atomiconce v[3] = 2»),
      • scambio atomico («x = @atomicswap v[3] = 2»),
      • sostituzione atomica («x = @atomicreplace v[3] 2=>5»).
    • Nuovo parametro «—task-metrics=yes», che include la raccolta di informazioni sui tempi di esecuzione di ciascun compito, attivabile/disattivabile anche durante l'esecuzione tramite «Base.Experimental.task_metrics(::Bool)». Metriche disponibili:
      • tempo effettivo di esecuzione del compito, inclusa la compilazione e la raccolta dei rifiuti («Base.Experimental.task_running_time_ns»),
      • tempo dal momento in cui il compito è iniziato fino al completamento («Base.Experimental.task_wall_time_ns»).
    • Supporto Unicode 16.
    • «Threads.@spawn» ora accetta l'argomento «:samepool» per indicare lo stesso pool di thread del codice chiamante. «Threads.@spawn :samepool foo()» è un'abbreviazione per «Threads.@spawn Threads.threadpool() foo()».
    • Il macros "@ccall" ora può accettare l'argomento "gc_safe". Se impostato su true, durante la chiamata "ccall", il runtime può eseguire la raccolta dei rifiuti in parallelo.
  • Modifiche al linguaggio
    • Quando si sostituisce un metodo con un altro di firma equivalente, il metodo esistente non viene eliminato. Invece, il nuovo metodo diventa prioritario. Se il nuovo metodo viene rimosso, il metodo precedente riprenderà a funzionare. Questo è utile, ad esempio, in framework di test con sostituzioni (SparseArrays, Pluto, Mocking, ecc.), poiché non è necessario ripristinare esplicitamente il vecchio metodo. Attualmente, per questa situazione è richiesta una ricompilazione, ma in futuro potrebbe essere possibile riutilizzare i risultati precedenti.
    • Il deployment dei macros non accederà più immediatamente in modo ricorsivo alle espressioni "Expr(:toplevel)" dai macros. Invece, il deployment di ":toplevel" sarà posticipato fino al tempo di esecuzione. Questo consente alle espressioni successive nello stesso ":toplevel" di utilizzare macros definiti precedentemente.
    • I cicli infiniti banali (come «while true; end») non sono più considerati comportamento indefinito. I cicli infiniti in cui accade qualcosa (ad esempio, con effetti collaterali o sleep) non sono mai stati e non sono un comportamento indefinito.
    • Dichiarare simultaneamente un identificatore come «public» e «export» è ora un errore.
    • Gli errori di runtime di «getfield» ora generano un nuovo tipo di eccezione «FieldError» invece del generico «ErrorException».
    • I macro nelle posizioni di dichiarazione delle funzioni ora non richiedono parentesi tonde. Ad esempio, è consentito «function @main(args) … end», mentre in precedenza era richiesto «function (@main)(args) … end».
    • La chiamata a «using» per nome di pacchetto all'interno dello stesso pacchetto (particolarmente rilevante per i moduli annidati) ora utilizza esplicitamente questo pacchetto senza esaminare il Manifest e l'ambiente, proprio come «..Name». Questo corrisponde meglio al comportamento atteso.
  • Miglioramenti del compilatore/runtime
    • Il codice intermedio (IR) generato da LLVM ora utilizza tipi di puntatore anziché passare puntatori come interi. Questo riguarda «llvmcall»: l'IR incorporato di LLVM deve essere aggiornato sostituendo «i32»/«i64» con «i8*» o «ptr» e rimuovendo le conversioni inutili «ptrtoint»/«inttoptr». Il supporto per la compatibilità dell'IR con i puntatori interi è ancora disponibile, ma genera un avviso.
  • Modifiche ai parametri della riga di comando
    • Il flag «-m/—module» può essere passato per eseguire la funzione «main» all'interno del pacchetto con un insieme di argomenti. Questa funzione deve essere dichiarata tramite «@main», specificando che è il punto di ingresso.
    • L'attivazione/disattivazione dell'output a colori in Julia può ora essere controllata tramite le variabili d'ambiente «NO_COLOR» e «FORCE_COLOR». Queste variabili sono anche considerate dal sistema di build di Julia.
    • «—project=@temp» avvia Julia con un ambiente temporaneo.
    • Il nuovo parametro «—trace-compile-timing» stampa il tempo di compilazione di ogni metodo, che viene visualizzato con «—trace-compile», in millisecondi.
    • «—trace-compile» ora evidenzia i metodi ricompilati in giallo o aggiunge un commento se il colore non è disponibile.
    • Il nuovo parametro «—trace-dispatch» stampa i metodi che vengono distribuiti dinamicamente.
  • Modifiche alla multithreading
    • Julia ora utilizza di default 1 flusso "interattivo", oltre a 1 flusso principale "lavorativo", cioè "-t1,1". Ciò significa che il compito principale e REPL (in modalità interattiva), che entrambi operano nel flusso 1, vengono ora eseguiti in un pool interattivo. Anche il ciclo di input/output di libuv funziona nel flusso 1, garantendo un utilizzo efficiente del pool di lavoro utilizzato da "Threads.@spawn". Richiedere esattamente 1 flusso («-t1"/"JULIA_NUM_THREADS=1») o 0 flussi interattivi disabilita il flusso interattivo: "-t1,0", "JULIA_NUM_THREADS=1,0" o "-tauto,0". Richiedere più di 1 flusso include il flusso interattivo; ad esempio, "-t2" è equivalente a "-t2,1". Si ricorda: i buffer non devono essere legati a "threadid()".
    • Sono stati definiti nuovi tipi per il modello di codice che deve eseguirsi una sola volta per processo: il tipo "OncePerProcess{T}" consente di definire una funzione che verrà eseguita esattamente una volta, quando viene chiamata per la prima volta, e poi restituirà sempre lo stesso valore di tipo "T" a chiamate successive. Esistono anche i tipi "OncePerThread{T}" e "OncePerTask{T}" per un uso analogo con flussi o compiti.
  • Modifiche al sistema di build
    • Sono stati aggiunti nuovi file Makefile per la compilazione di Julia e LLVM utilizzando BOLT (Binary Optimization and Layout Tool). Vedi «contrib/bolt» e «contrib/pgo-lto-bolt».
  • Nuove funzioni di libreria
    • «logrange(start, stop; length)» crea un intervallo con un coefficiente costante (ratio), invece di un passo costante.
    • La nuova funzione «isfull(c::Channel)» verifica se il comando «put!(c, some_value)» sarà bloccato.
    • «waitany(tasks; throw=false)» e «waitall(tasks; failfast=false, throw=false)» attendono il completamento di più attività contemporaneamente.
    • «uuid7()» genera un UUID di versione 7, conforme alla RFC 9562.
    • «insertdims(array; dims)» inserisce dimensioni monodimensionali nell'array: un'operazione inversa a «dropdims».
    • Il nuovo tipo «Fix» generalizza «Fix1/Fix2» per la fissazione di un argomento.
    • «Sys.detectwsl()» verifica se Julia è in esecuzione all'interno di WSL durante il runtime.
  • Nuove funzionalità delle librerie
    • «escape_string» accetta parametri aggiuntivi «ascii=true» (per eseguire l'escaping di tutti i caratteri non ASCII) e «fullhex=true» (per utilizzare il formato esadecimale completo a 4/8 cifre nella u/U-escaping, ad esempio per compatibilità con C).
    • «tempname» ora può accettare una stringa di suffisso, affinché il nome del file includa questo suffisso e venga considerato nella sua unicità.
    • Gli oggetti «RegexMatch» possono ora essere utilizzati per creare «NamedTuple» e «Dict».
    • «Lockable» ora è esportato.
    • «Base.require_one_based_indexing» e «Base.has_offset_axes» sono ora pubblici.
    • Sono state aggiunte nuove funzioni «ltruncate», «rtruncate» e «ctruncate» per troncare le stringhe alla larghezza del testo, tenendo conto della larghezza dei caratteri.
    • La funzione «isless» (e quindi «cmp», ordinamento, ecc.) ora è supportata per «AbstractArray» di dimensione zero.
    • «invoke» ora consente di passare «Method» invece della firma di tipo.
    • «invoke» ora accetta «CodeInstance» al posto del tipo, il che può accelerare alcuni flussi di lavoro dei plugin del compilatore.
    • «Timer(f, …)» ora eredita la «sticky» (aderenza) del compito genitore nella creazione di attività del timer, il che può essere sovrascritto con un nuovo argomento «spawn». Questo risolve il problema in cui i compiti generati «@async» rendevano il genitore appiccicoso.
    • «Timer» ora ha proprietà leggibili «timeout» e «interval», oltre a un metodo «show» più descrittivo.
    • «sort» ora supporta i tuple «NTuple».
    • «map!(f, A)» ora conserva i risultati in «A», come «map!(f, A, A)» o «A .= f.(A)».
    • «setprecision» con un argomento funzione (di solito tramite il blocco «do») è ora thread-safe. Altre forme dovrebbero essere evitate e i tipi devono passare a un'implementazione che utilizza «ScopedValue».
  • Modifiche alla libreria standard
    • «gcdx(0, 0)» ora restituisce «(0, 0, 0)» invece di «(0, 1, 0)».
    • «fd» restituisce «RawFD» invece di «Int».
    • Pacchetto JuliaSyntaxHighlighting
      • Nuovo pacchetto standard per l'applicazione della evidenziazione della sintassi al codice Julia, che utilizza «JuliaSyntax» e «StyledStrings» per implementare la funzione «highlight», che crea «AnnotatedString» con evidenziazione applicata.
    • Pacchetto LinearAlgebra.
      • Ora «rank» può accettare una matrice «QRPivoted» per stimare il rango tramite fattorizzazione QR.
      • Aggiunto il parametro chiave «alg» per «eigen», «eigen!», «eigvals» e «eigvals!» per i tipi di matrici autoadiagoni (unione di tipo «RealHermSymComplexHerm»), consentendo di passare tra diversi algoritmi di estrazione degli autovalori.
      • Aggiunta una versione generale della fattorizzazione di Cholesky non bloccante con selezione delle rotazioni (invocata tramite «cholesky[!](A, RowMaximum())»).
      • Il numero di thread BLAS per impostazione predefinita ora tiene conto dell'affinità dei processi, e non solo del numero di thread logici di sistema.
      • Aggiunta la funzione «zeroslike», che restituisce elementi nulli per matrici con memorizzazione a bande. I tipi di array personalizzati possono specializzare questa funzione per un risultato corretto.
      • La moltiplicazione delle matrici «A * B» ora chiama «matprod_dest(A, B, T::Type)» per generare il ricevitore. Questa funzione è ora pubblica.
      • La funzione «haszero(T::Type)» viene utilizzata per verificare se il tipo «T» ha un elemento zero unico, definito come «zero(T)». Ora è pubblica.
      • Aggiunta la funzione «diagview», che restituisce una vista specifica sulla diagonale della matrice «AbstractMatrix».
    • Pacchetto Profile
      • «Profile.take_heap_snapshot» ora accetta un nuovo parametro «redact_data::Bool», impostato su «true» per impostazione predefinita. Se consentito, il contenuto degli oggetti Julia (ad esempio, stringhe) non è incluso nello snapshot della memoria.
      • «Profile.print()» ora evidenzia i moduli Base/Core/Package proprio come avviene nelle tracce dello stack, e i percorsi (anche abbreviati) sono ora cliccabili nei terminali che supportano i collegamenti URI e consentono di aprire il file e la riga specificata nell'editor definito da «JULIA_EDITOR».
    • REPL
      • Utilizzando la nuova funzionalità «usings=true» nella funzione «names()», l'autocompletamento nel REPL può completare i nomi visibili attraverso «using».
      • L'autocompletamento del REPL ora può completare righe del tipo «[import|using] Mod: xxx|», ad esempio, completando «using Base.Experimental: @op» in «using Base.Experimental: @opaque».
      • REPL ora emette un avviso se il nome viene richiamato tramite un modulo che non lo definisce (e non ha un sottModulo che lo definisce), e il nome non è pubblico in quel modulo. Ad esempio, «map» è definito in Base, e l'esecuzione di «LinearAlgebra.map» in REPL ora darà un avviso alla prima chiamata di questo tipo.
      • Nell'output del risultato dell'input in REPL, l'output ora viene troncato a 20 KiB. Questo non influisce sulle chiamate manuali di «show», «print», ecc.
      • Il completamento automatico per il simbolo «\» ora mostra il simbolo o l'emoticon corrispondente accanto a ciascuna parola chiave corrispondente.
    • Pacchetto Test
      • Se il set di test «DefaultTestSet» fallisce, viene visualizzato il generatore di numeri casuali (RNG) di quel set sullo schermo, per aiutare a riprodurre un errore stocastico che dipende solo dallo stato del RNG. È anche possibile specificare l’RNG per il set di test, passando il parametro «rng» nel macro «@testset»: julia usando Test, Random @testset rng=Xoshiro(0x2e026445595ed28e, 0x07bb81ac4c54926d, 0x83d7d70843e8bad6, 0xdbef927d150af80b, 0xdbf91ddf2534f850) inizio @test rand() == 0.559472630416976 fine
    • Pacchetto InteractiveUtils
      • Nuovi macro «@trace_compile» e «@trace_dispatch» per l'esecuzione di espressioni con i parametri «—trace-compile=stderr —trace-compile-timing» e «—trace-dispatch=stderr» rispettivamente.
  • Dipendenze esterne
    • Il database delle informazioni terminali («terminfo») è ora incluso di default nella distribuzione di Julia, migliorando l'operatività del REPL quando «terminfo» non è disponibile nel sistema. È possibile compilare Julia senza integrare il database, utilizzando il parametro Makefile «WITH_TERMINFO=0».
  • Miglioramenti degli strumenti
    • È ora disponibile un profiler «wall-time» per gli utenti che necessitano di un profiler a campionamento che cattura le attività indipendentemente dal loro stato (programmato/in esecuzione). Questo profiler consente di profilare attività con elevato input/output e aiuta a individuare aree di forte contesa nel sistema.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster