Linguaggio di programmazione Julia 1.9 disponibile

È stata pubblicata la versione del linguaggio di programmazione Julia 1.9, che combina qualità come prestazioni elevate, supporto per la digitazione dinamica e strumenti integrati per la programmazione parallela. La sintassi di Julia è vicina a MATLAB, con alcuni elementi presi in prestito da Ruby e Lisp. Il metodo di manipolazione delle stringhe ricorda Perl. Il codice del progetto è distribuito con licenza MIT.

Caratteristiche principali della lingua:

  • Elevate prestazioni: uno degli obiettivi chiave del progetto è raggiungere prestazioni vicine ai programmi C. Il compilatore Julia è basato sul progetto LLVM e genera codice macchina nativo efficiente per molte piattaforme di destinazione;
  • Supporto per vari paradigmi di programmazione, inclusi elementi di programmazione orientata agli oggetti e funzionale. La libreria standard fornisce funzioni per l'I/O asincrono, la gestione dei processi, la registrazione, la creazione di profili e la gestione dei pacchetti, tra le altre cose;
  • Tipizzazione dinamica: il linguaggio non richiede la definizione esplicita dei tipi per le variabili, per analogia con i linguaggi di programmazione scripting. Supporta la modalità interattiva;
  • Possibilità facoltativa di specificare esplicitamente i tipi;
  • Sintassi eccellente per calcoli numerici, calcoli scientifici, sistemi di apprendimento automatico e visualizzazione dei dati. Supporto per molti tipi di dati numerici e strumenti per la parallelizzazione dei calcoli.
  • Possibilità di chiamare direttamente le funzioni dalle librerie C senza livelli aggiuntivi.

Principali cambiamenti in Julia 1.9:

  • Nuove funzionalità linguistiche
    • Consenti l'esecuzione di assegnazioni in un altro modulo utilizzando "setproperty!(::Module, ::Symbol, x)".
    • Sono ammesse assegnazioni multiple non in posizione finale. Ad esempio, la stringa "a, b..., c = 1, 2, 3, 4" verrà elaborata come "a = 1; b…, = 2, 3; c = 4". Questo viene gestito tramite Base.split_rest.
    • I valori letterali a carattere singolo ora supportano la stessa sintassi dei valori letterali stringa; quelli. la sintassi può rappresentare sequenze UTF-8 non valide, come consentito dal tipo Char.
    • Aggiunto il supporto per la specifica Unicode 15.
    • Combinazioni annidate di tuple e tuple di caratteri con nome possono ora essere utilizzate come parametri di tipo.
    • Nuove funzioni built-in "getglobal(::Module, ::Symbol[, order])" e "setglobal!(::Module, ::Symbol, x[, order])" per leggere e scrivere esclusivamente su variabili globali. Il metodo getglobal dovrebbe ora essere preferito al metodo getfield per l'accesso alle variabili globali.
  • La lingua cambia
    • La macro "@invoke" introdotta nella versione 1.7 è ora esportata e disponibile per l'uso. Inoltre, ora utilizza il metodo "Core.Typeof(x)" anziché "Any" quando l'annotazione del tipo viene omessa per l'argomento "x". Ciò è necessario affinché i tipi passati come argomenti vengano elaborati correttamente.
    • Abilitata l'esportazione della funzione "invokelatest" e della macro "@invokelatest" introdotta nella versione 1.7.
  • Miglioramenti al compilatore/runtime
    • Tempo di prima esecuzione significativamente ridotto (TTFX - Tempo di prima esecuzione). La precompilazione dei pacchetti ora salva il codice nativo in "pkgimage", il che significa che il codice generato durante la precompilazione non dovrà essere ricompilato dopo il caricamento del pacchetto. L'uso della modalità pkgimages può essere disabilitato con l'opzione "--pkgimages=no".
    • Il problema noto della complessità quadratica dell'inferenza di tipo è stato risolto e in generale l'inferenza utilizza meno memoria. Alcuni casi limite con funzioni lunghe generate automaticamente (come ModelingToolkit.jl con equazioni alle derivate parziali e modelli causali di grandi dimensioni) vengono compilati molto più velocemente.
    • Le chiamate con argomenti non specifici del tipo ora possono essere ottimizzate per la suddivisione dell'unione per l'iniezione o la risoluzione statica, anche se sono presenti più tipi diversi di candidati alla spedizione. Ciò può migliorare le prestazioni in determinate situazioni in cui i tipi di oggetto non sono completamente risolti staticamente, risolvendo staticamente i siti di chiamata "@nospecialize-d" ed evitando la ricompilazione.
    • Tutti gli usi della macro @pure nel modulo Base sono stati sostituiti con Base.@assume_effects.
    • Le chiamate a invoke(f, invokesig, args...) con tipi meno specifici di quelli normalmente usati per f(args...) non provocano più la ricompilazione del pacchetto.
  • Modifiche ai parametri della riga di comando
    • Su Linux e Windows, l'opzione "--threads=auto" ora tenta di determinare il numero disponibile di processori in base all'affinità della CPU, che è una maschera tipicamente impostata negli ambienti HPC e cloud.
    • L'opzione "--math-mode=fast" è stata disabilitata, al posto della quale si consiglia di utilizzare la macro "@fastmath", che ha una semantica ben definita.
    • Il parametro "--threads" ora ha il formato "auto | N[,auto|M]", dove M specifica il numero di thread interattivi da creare (attualmente auto significa 1).
    • Aggiunta l'opzione "--heap-size-hint= ”, che imposta la soglia dopo la quale inizia la Garbage Collection attiva. La dimensione può essere specificata in byte, kilobyte (1000 KB), megabyte (300 MB) o gigabyte (1,5 GB).
  • Modifiche al multithreading
    • "Threads.@spawn" ora ha un primo argomento opzionale con il valore ":default" o ":interactive". Un'attività interattiva richiede una bassa latenza di risposta ed è progettata per essere breve o eseguita frequentemente. Le attività interattive verranno eseguite sui thread interattivi se specificati all'avvio di Julia.
    • I thread avviati al di fuori del runtime Julia (ad esempio, da C o Java) ora possono chiamare il codice Julia utilizzando "jl_adopt_thread". Ciò accade automaticamente quando inserisci il codice Julia tramite "cfunction" o il punto di ingresso "@ccallable". Di conseguenza, il numero di thread può ora cambiare in fase di esecuzione.
  • Nuove funzioni di libreria
    • Nuova funzione "Iterators.flatmap".
    • Nuova funzione "pkgversion(m::Module)" per ottenere la versione del pacchetto che ha caricato un dato modulo, simile a "pkgdir(m::Module)".
    • Nuova funzione "stack(x)" che generalizza "reduce(hcat, x::Vector{<:Vector})" a qualsiasi dimensione e consente qualsiasi iteratore di iteratori. Il metodo "stack(f, x)" generalizza "mapreduce(f, hcat, x)" ed è più efficiente.
    • Nuova macro per l'analisi della memoria allocata "@allocations", simile a "@allocated", tranne per il fatto che restituisce il numero di allocazioni di memoria, non la dimensione totale della memoria allocata.
  • Nuove funzionalità della libreria
    • "RoundFromZero" ora funziona per tipi diversi da "BigFloat".
    • "Dict" ora può essere ridimensionato manualmente con "sizehint!".
    • "@time" ora indica separatamente la percentuale di tempo impiegata a ricompilare metodi non validi.
  • Modifiche nella libreria standard
    • Risolto un problema di concorrenza nei metodi di iterazione per Dict e altri oggetti derivati ​​come keys(::Dict), values(::Dict) e Set. Questi metodi di iterazione possono ora essere chiamati su un Dict o Set in parallelo su un numero illimitato di thread, purché non vi siano azioni che modifichino il dizionario o il set.
    • La negazione della funzione predicato "!f" ora restituisce una funzione composta "(!) ∘ f" invece di una funzione anonima.
    • Le funzioni Dimension slice ora funzionano su più dimensioni: "eachslice", "eachrow" e "eachcol" restituiscono un oggetto "Slices" che consente al dispatch di fornire metodi più efficienti.
    • Aggiunta macro "@kwdef" all'API pubblica.
    • Risolto un problema con l'ordine delle operazioni in "fld1".
    • L'ordinamento ora è sempre stabile nel tempo (QuickSort riprogettato).
    • "Base.splat" viene ora esportato. Il valore restituito è di tipo "Base.Splat" anziché una funzione anonima, che consente di dedurne in modo corretto.
  • Gestore di pacchetti
    • "Estensioni pacchetto": supporto per il caricamento di uno snippet di codice da altri pacchetti caricati in una sessione Julia. L'applicazione è simile al pacchetto "Requires.jl", ma sono supportate la precompilazione e la compatibilità di configurazione.
  • Libreria Algebra lineare
    • A causa del rischio di confusione con la divisione elementwise, i metodi "a / b" e "b \ a" con scalare "a" e vettore "b" sono stati rimossi, che erano equivalenti a "a * pinv(b)".
    • Le chiamate BLAS e LAPACK ora usano "libblastrampoline (LBT)". OpenBLAS viene fornito per impostazione predefinita, ma la creazione di un'immagine di sistema con altre librerie BLAS/LAPACK non è supportata. Si consiglia invece di utilizzare il meccanismo LBT per sostituire BLAS/LAPACK con un altro set di librerie disponibile.
    • "lu" supporta la nuova strategia di rotazione della matrice "RowNonZero()", che seleziona il primo elemento di rotazione diverso da zero da utilizzare con i nuovi tipi aritmetici e per scopi didattici.
    • "normalize(x, p=2)" ora supporta qualsiasi spazio vettoriale normalizzato "x", compresi gli scalari.
    • Il numero predefinito di thread BLAS è ora uguale al numero di thread CPU sull'architettura ARM e alla metà del numero di thread CPU su altre architetture.
  • Printf: messaggi di errore rielaborati per stringhe malformate per una migliore leggibilità.
  • Profilo: nuova funzione "Profile.take_heap_snapshot(file)" che acquisisce un file nel formato ".heapsnapshot" basato su JSON supportato da Chrome.
  • Casuale: randn e randexp ora funzionano per qualsiasi tipo AbstractFloat che definisce rand.
  • SOSTITUZIONE
    • Premendo la combinazione di tasti "Alt-e" ora si apre l'input corrente nell'editor. Il contenuto (se modificato) verrà eseguito all'uscita dall'editor.
    • Il contesto del modulo corrente attivo nel REPL può essere modificato (di default è Main) utilizzando la funzione "REPL.activate(::Module)" o inserendo il modulo nel REPL e premendo il tasto "Alt-m" combinazione.
    • La modalità "prompt numerato", che stampa numeri per ogni ingresso e uscita e memorizza i risultati valutati in Out, può essere attivata con "REPL.numbered_prompt!()".
    • Il completamento con tabulazioni mostra gli argomenti delle parole chiave disponibili.
  • SuiteSparse: spostato il codice per il risolutore "SuiteSparse" in "SparseArrays.jl". I risolutori vengono ora riesportati da "SuiteSparse.jl".
  • SparseArray
    • I solutori SuiteSparse sono ora disponibili come sottomoduli di SparseArrays.
    • Le modalità di protezione del flusso UMFPACK e CHOLMOD sono state migliorate eliminando le variabili globali e utilizzando i blocchi. Multithread "ldiv!" Gli oggetti UMFPACK ora possono essere eseguiti in modo sicuro.
    • La funzione sperimentale "SparseArrays.allowscalar(::Bool)" consente di disabilitare o abilitare l'indicizzazione scalare di array sparsi. Questa funzione è progettata per rilevare l'indicizzazione scalare casuale di oggetti "SparseMatrixCSC", che è una fonte comune di problemi di prestazioni.
  • Nuova modalità di failover per suite di test che termina anticipatamente un'esecuzione di test in caso di errore o errore. Impostare tramite "@testset kwarg failfast=true" o "export JULIA_TEST_FAILFAST=true". Ciò potrebbe essere necessario negli avvii CI per ricevere i primi messaggi di errore.
  • Date: le stringhe vuote non vengono più analizzate in modo errato come valori "DateTime", "Date" o "Times" validi e generano invece un errore "ArgumentError" nei costruttori e nell'analisi, mentre "tryparse" non restituisce nulla.
  • Pacchetto distribuito
    • La configurazione del pacchetto (progetto attivo, "LOAD_PATH", "DEPOT_PATH") viene ora propagata quando vengono aggiunti processi di lavoro locali (ad es. con "addprocs(N::Int)" o con il flag della riga di comando "-procs=N").
    • "addprocs" per i processi di lavoro locali ora accetta un argomento denominato "env" per passare le variabili di ambiente ai processi di lavoro.
  • Unicode: "grafemi(s, m:n)" restituisce la sottostringa dall'mesimo all'ennesimo grafema in "s".
  • Il pacchetto DelimitedFiles è stato rimosso dalle librerie di sistema ed è ora distribuito come pacchetto separato che deve essere installato in modo esplicito per poter essere utilizzato.
  • Dipendenze esterne
    • Linux rileva automaticamente la versione della libreria di sistema libstdc++ e la carica se è più recente. Il vecchio comportamento di caricamento del libstdc++ integrato indipendentemente dalla versione del sistema può essere ripristinato impostando la variabile di ambiente "JULIA_PROBE_LIBSTDCXX=0".
    • Rimosso "RPATH" dal binario julia, che può interrompere le librerie su Linux che non riescono a definire la variabile "RUNPATH".
    • Miglioramenti dello strumento: l'output di "MethodError" e dei metodi (ad esempio, da "methods(my_func)") è ora formattato e colorato in base a come i metodi vengono emessi nelle tracce dello stack.

    Fonte: opennet.ru

Aggiungi un commento