The programming language Julia 1.11 has been released.

È stata rilasciata la versione 1.11 del linguaggio di programmazione Julia, che combina caratteristiche come alte prestazioni, supporto per la tipizzazione dinamica e strumenti integrati per la programmazione parallela. La sintassi di Julia è simile a quella di 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.

Le principali novità di Julia 1.11:

  • Nuove funzionalità del linguaggio
    • È stato introdotto il tipo Memory, che rappresenta un'alternativa a basso livello al tipo Array. Il tipo Memory richiede minori risorse e ha un costruttore veloce, essendo un'alternativa all'Array dove non è necessario l'intero set delle sue funzionalità, ad esempio, per gli array multidimensionali. Nella sua implementazione interna, gran parte dei metodi del tipo Array è realizzata sopra il tipo Memory, il che ha notevolmente accelerato alcune funzioni, come ad esempio push.
    • È stata aggiunta la parola chiave «public». Gli identificatori contrassegnati come «public» sono considerati come interfacce di programmazione esterne. Gli identificatori con la parola chiave «export» sono trattati in modo simile. Tuttavia, la differenza principale tra «public» e «export» è che i nomi contrassegnati come «public» non sono inclusi nel contesto del modulo quando si utilizza «using» nei moduli dipendenti.
    • Il pacchetto ScopedValue implementa una visibilità dinamica quando viene utilizzato nella programmazione parallela Threads/tasks.
    • Il file Manifest.toml può ora essere rinominato nel formato Manifest-v{major}.{minor}.toml per l'utilizzo con versioni specifiche di Julia. Ad esempio, il file Manifest-v1.11.toml sarà utilizzato dalla versione 1.11, mentre il file Manifest.toml nella stessa directory sarà utilizzato da altre versioni di Julia.
    • Aggiunta la compatibilità con Unicode 15.1.
  • Modifiche al linguaggio
    • Durante il processo di precompilazione, il gestore «atexit» viene eseguito prima della generazione del file risultante. Questo consente agli utenti di terminare in sicurezza l'esecuzione in background (come trigger temporali o notifiche periodiche) e di liberare esplicitamente le risorse prima di terminare il programma.
    • I file di copertura del codice e dell'allocazione della memoria non vengono più generati durante la precompilazione. Inoltre, in queste modalità, le cache pkgimage vengono utilizzate per i pacchetti che non vengono tracciati. Ciò significa che i test di copertura (di default per julia-actions/julia-runtest) utilizzano le cache pkgimage per tutti gli altri pacchetti di cui dipende il pacchetto in fase di test. Questo consente di accelerare il testing.
    • L'indicazione del percorso in JULIA_DEPOT_PATH viene ora gestita in modo diverso. Se è presente un solo percorso, solo quel percorso sarà inserito nel valore della variabile interna DEPOT_PATH. Se l'ultimo carattere è ':', la variabile DEPOT_PATH conterrà tutto ciò che è stato specificato prima di ':' e un elenco dei percorsi di sistema in cui si trova Julia.
    • I file di cache della precompilazione possono ora essere spostati e la loro validità viene ora verificata tramite l'hash del contenuto dei file sorgente, anziché tramite 'mtime'.
  • Miglioramenti del compilatore / ambiente di esecuzione
    • L'euristica del garbage collector è stata aggiornata per lavorare con le pagine di memoria nel loro insieme anziché con oggetti singoli.
    • È stata aggiunta la supporto per l'annotazione Base.@assume_effects nel codice.
  • Modifiche ai parametri della riga di comando
    • Il punto di ingresso è ora definito rigidamente come Main.main(args). Il punto di ingresso deve essere definito tramite il macro @main (vedi la documentazione). Se il punto di ingresso è specificato in uno script eseguito dalla riga di comando (ad esempio "julia script.jl o julia -e expr"), Julia chiamerà automaticamente la funzione Main.main. Questo è fatto per uniformare l'esecuzione degli script e la loro compilazione, quando il caricamento del codice può avvenire per la compilazione, mentre l'esecuzione del metodo Main.main avviene solo al momento dell'avvio del file eseguibile. Quando si utilizza Julia in modalità interattiva non ci sono cambiamenti. Tutto il codice viene eseguito in sequenza. Gli argomenti "—compiled-modules" e "—pkgimages" possono essere impostati sulla modalità existing, che costringe Julia a utilizzare le cache esistenti, senza crearne di nuove.
    • L'argomento "—project" ora può ricevere il valore @script per specificare la posizione del file Project.toml relativo allo script in esecuzione. Ad esempio "—project=@script/foo" per la sottodirectory foo. Se non viene specificato nulla, ovvero "—project=@script", sarà equivalente a "—project=@.", quando il file Project.toml viene cercato nella directory corrente.
  • Modifiche multithreading
    • Nel macro Threads.@threads è possibile specificare la modalità dello scheduler :greedy, utile per carichi di lavoro computazionali non omogenei. La nuova struttura (con specificatore public, ma non export) «struct Base.Lockable{T, L<:AbstractLock}» funge da avvolgimento per ordinare l'accesso parallelo agli elementi dei tipi compositi, semplificando complessivamente il codice.
  • Modifiche al sistema di build
    • Il file Makefile per costruire Julia e LLVM utilizza strategie di ottimizzazione PGO e LTO. Vedi contrib/pgo-lto/Makefile.
  • Nuove funzioni di libreria
    • Sono stati aggiunti tre nuovi tipi nell'ambito dell'idea di testo annotato — Pair{Symbol, Any}, ad esempio ‘:lang => «en»‘ o ‘:face => :magenta’. Se possibile, le annotazioni vengono mantenute durante le operazioni sulle stringhe, come la concatenazione.
    • Il tipo specifico AnnotatedString implementa AbstractString. Questo tipo è un avvolgimento su una stringa, consentendo di aggiungere annotazioni su un intervallo di caratteri. Il tipo AnnotatedString è ampiamente utilizzato nella nuova libreria standard StyledStrings per visualizzare informazioni sullo schermo in modo stilizzato.
    • Il tipo specifico AnnotatedChar implementa AbstractChar. È un avvolgimento su un carattere e consente di allegare un elenco di annotazioni ad esso.
    • Il tipo specifico AnnotatedIOBuffer implementa IO, replica l'interfaccia del tipo IOBuffer, ma ha metodi specializzati per la lettura/scrittura per annotare il flusso. Può essere utilizzato sia come costruttore di stringhe che come strumento per unire stringhe annotate e non annotate.
    • Il metodo «in!(x, s::AbstractSet)» restituisce sempre true. Ma se l'elemento x non è presente in s, verrà inserito.
    • La nuova funzione Libc.mkfifo è un wrapper della funzione C mkfifo per le piattaforme Unix.
    • Il metodo «logrange(start, stop; length)» crea una sequenza logaritmica con il numero specificato, invece di un passo fisso.
    • I metodi «copyuntil(out, io, delim)» e «copyline(out, io)» copiano i dati dal flusso io nel flusso out::IO.
    • Il metodo «eachrsplit(string, pattern)» restituisce un iteratore sugli elementi della stringa suddivisi da destra a sinistra.
    • Il metodo Sys.username() restituisce il nome dell'utente corrente.
    • I metodi Sys.isreadable(), Sys.iswritable() possono essere utilizzati per determinare i permessi dell'utente per la lettura e la scrittura dei dati.
    • Il metodo GC.logging_enabled() restituisce true se il logging delle operazioni del garbage collector è abilitato tramite GC.enable_logging.
    • Il tipo IdSet è ora esportato da Base e è pubblico.
    • Il macro «@time» ora riporta il valore del contatore dei conflitti di lock se viene utilizzato ReentrantLock, che deve essere atteso. È stato anche aggiunto il macro «@lock_conflicts», che restituisce questo contatore.
    • Il macro Base.Cartesian.@ncallkw è stato progettato in analogia con Base.Cartesian.@ncall, ma consente di aggiungere argomenti sotto forma di parole chiave per la chiamata della funzione.
    • La nuova funzione Docs.hasdoc(module, symbol) indica se il nome symbol richiesto ha una descrizione docstring.
    • La nuova funzione Docs.undocumented_names(module) restituisce i nomi delle funzioni non documentate del modulo richiesto module.
  • Nuove funzionalità per metodi noti
    • Il metodo invmod(n, T) per il tipo intero predefinito T ora calcola l'inverso modulo intero n con un nuovo algoritmo.
    • Il metodo invmod(n) fornisce una forma abbreviata di chiamata invmod(n, typeof(n)) per i tipi interi.
    • Il metodo replace(string, pattern…) ora supporta un argomento opzionale IO per restituire il valore in un flusso anziché restituire una stringa di tipo String.
    • Nuovi metodi allequal(f, itr) e allunique(f, itr) con un argomento funzione predicativa.
    • Il metodo sizehint!(s, n) ora supporta l'opzione «shrink», che consente di disattivare il taglio degli elementi.
    • Il passaggio di IOBuffer come argomento stdout durante la generazione dei processi ora funziona con la sincronizzazione completa 'wait' o 'success', quindi non è più necessario verificare la disponibilità in Base.BufferStream.
    • Il metodo 'closewrite' non viene più chiamato automaticamente per il flusso passato dopo la chiusura del processo. Utilizzare il metodo 'wait' per il processo e poi chiamare forzatamente 'closewrite'. Oppure utilizzare la forma del metodo open con le funzioni per gestire automaticamente la chiusura.
    • Il metodo '@timed' ora restituisce anche una stima del tempo di compilazione e ricompilazione, dovuta all'instabilità dei tipi.
    • Il metodo 'filter' ora può operare con NamedTuple.
    • Il metodo Iterators.cycle(iter, n) viene eseguito su un iteratore 'iter' un numero fisso di volte n.
    • Il metodo zero(::AbstractArray) viene applicato ricorsivamente, ad esempio zero([[1,2],[3,4,5]]) genera [[0,0],[0,0,0]] invece di generare un errore.
    • Il metodo include_dependency(path; track_content=true) include le dipendenze basate sul valore hash del codice precompilato, non su mtime.
  • Modifiche alla libreria di base
    • Il metodo write(::IO, ::AbstractArray) viene utilizzato per chiamare ricorsivamente i metodi «write» per ogni elemento dell'array, ma ora scrive la rappresentazione in memoria di ciascun valore. Ad esempio, la chiamata write(io, ‘a’:’b’) scriverà 4 byte di ciascun carattere, invece della rappresentazione abbreviata UTF-8. Il nuovo formato è compatibile con Array, rendendo possibile utilizzare il metodo «read!» per la lettura inversa dei valori.
    • Impossibile definire il metodo «length» per gli iteratori con stato in modo generale. A causa del potenziale comportamento errato degli iteratori Stateful, il metodo length(::Stateful) è stato rimosso.
    • StyledStrings
      • Una nuova libreria standard per la rappresentazione stilizzata delle stringhe.
      • La struttura Faces è un contenitore per informazioni di stile (colore, decorazioni, ecc.) e fornisce anche una struttura comoda, estensibile (via addface!) e adattabile (utilizzando Faces.toml personalizzati e loadfaces!) per visualizzare contenuti stilizzati.
      • Il macro @styled_str fornisce un modo semplice per creare stringhe annotate AnnotatedString con vari attributi di stile. Ad esempio, StyledStrings.addface!(:orange => StyledStrings.Face(foreground = 0xFF7700)) styled»{orange:this is orange text}»
    • Libdl
      • Il nuovo tipo LazyLibrary è esportato dalla libreria Libdl per creare catene di caricamento lazy, originariamente utilizzate nel formato JLL.
    • LinearAlgebra
      • Il metodo cbrt(::AbstractMatrix{<:Real}) restituisce ora una matrice di valori reali delle radici quadrate per la matrice di input di valori reali.
      • Il metodo per calcolare i valori propri «eigvals/eigen(A, bunchkaufman(B)) e eigvals/eigen(A, lu(B))» utilizza gli algoritmi Bunchkaufman (LDL) e LU della decomposizione di B, rispettivamente, per calcolare in modo efficiente i valori propri generalizzati (eigen e eigenvectors) di A e B. Il secondo argomento del metodo riceve il risultato dei metodi bunchkaufman o lu.
      • Un metodo specializzato «eigvals/eigen(::Hermitian{<:Tridiagonal})» è progettato per matrici tridiagonali simmetriche e utilizza strumenti LAPACK.
      • Le matrici strutturate ora mantengono gli assi dei genitori (per Symmetric/Hermitian/AbstractTriangular/UpperHessenberg), oppure gli assi delle diagonali principali (per le matrici a bande).
      • I metodi bunchkaufman e bunchkaufman! sono ora definiti per i tipi AbstractFloat, Rational e le loro variazioni complesse. Il metodo bunchkaufman supporta ora i tipi Integer, convertendoli internamente in Rational{BigInt}. È stata aggiunta la funzione inertia, che calcola l'inerzia del fattore diagonale della procedura BunchKaufman per un oggetto di matrice simmetrica reale o hermitiana. Per le matrici simmetriche complesse, il metodo inertia calcola solo il numero degli autovalori del fattore diagonale.
      • I pacchetti che definiscono il metodo di moltiplicazione delle matrici mul! con la firma mul!(::AbstractMatrix, ::MyMatrix, ::AbstractMatrix, ::Number, ::Number) non presenteranno più ambiguità interagendo con il pacchetto LinearAlgebra. In precedenza, durante la moltiplicazione si verificavano ambiguità tra il tipo di matrice personalizzato MyMatrix e le matrici strutturate fornite dal pacchetto LinearAlgebra, come AbstractTriangular. Tali problemi sono stati risolti per le operazioni mul! con i tipi matrice-vettore.
      • I metodi lu e issuccess(::LU) ora supportano l'argomento allowsingular. Se impostato su true, una fattorizzazione valida con un fattore U di rango insufficiente sarà considerata un successo, invece di generare un errore. Tali fattorizzazioni vengono ora visualizzate stampando i fattori insieme all'etichetta «rank-deficient», piuttosto che al messaggio «Failed Factorization».
    • Random
      • Il metodo rand è ora applicabile ai tipi passati sotto forma di Tuple.
      • Il metodo rand è ora applicabile ai tipi passati in Pair.
      • Per l'avvio iniziale del generatore di numeri casuali RNG del modulo Random, ora è possibile utilizzare numeri negativi.
      • L'inizializzazione del generatore di numeri casuali può ora essere eseguita con una stringa, ad esempio seed!(rng, «a random seed»).
    • REPL
      • Premere il tasto Tab per completare la suggerenza ora è evidenziato con caratteri di colore chiaro. Per disattivare questa modalità, applicate Base.active_repl.options.hint_tab_completes = false in modo interattivo o nello script startup.jl: if VERSION >= v"1.11.0-0" atreplinit() do repl repl.options.hint_tab_completes = false end end
      • Meta-M con un invito vuoto ora commuta il modulo contestuale tra l'ultimo modulo contestuale non principale e quello principale, semplificando il passaggio da uno all'altro.
    • Date
      • La funzione non documentata adjust non è più esportata, ma è documentata.
    • Statistiche
      • Il pacchetto Statistics è ora aggiornabile senza l'intero set di Julia.
    • Distribuito
      • Il metodo pmap ora utilizza di default CachingPool.
  • Metodi obsoleti e rimossi
    • I metodi Base.map, Iterators.map e foreach con un solo argomento non sono più supportati.
  • Dipendenze esterne
    • La libreria libuv è stata aggiornata dalla versione 1.44.2 alla 1.48.0.
    • Il metodo tput non viene più utilizzato per controllare le capacità del terminale. È stato sostituito da strumenti di parsing terminfo completamente implementati in Julia.
    • Terminfo viene utilizzato di default. Se non è presente nel sistema, Julia può essere compilata con l'opzione Makefile WITH_TERMINFO=0.
  • Miglioramenti degli strumenti
    • Il CI ora esegue una verifica automatica limitata dei tipi in tutte le richieste di fusione.

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