È stata pubblicata la versione del linguaggio di programmazione Julia 1.10, 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.10:
- Nuove funzionalità linguistiche
- Per impostazione predefinita, viene utilizzato il nuovo e migliorato parser JuliaSyntax.jl. Per tornare alla versione precedente, è necessario impostare la variabile d'ambiente JULIA_USE_FLISP_PARSER su 1.
- I caratteri ⥺ (U+297A, \leftarrowsubset) e ⥷ (U+2977, \leftarrowless) possono ora essere utilizzati come operatori binari con precedenza della freccia.
- La lingua cambia
- Quando si generano task figlio, il generatore di numeri casuali (RNG) locale del task padre non viene più influenzato. Il nuovo schema di inizializzazione del generatore di numeri casuali è simile alle implementazioni di SplitMix e DotMix.
- Viene proposta una nuova regola di selezione del metodo che rimuove l'ambiguità con il tipo "Union{}" a favore di un metodo definito esplicitamente per gestire un argomento di tipo "Union{}".
- Il carattere "h bar" ℏ (\hslash U+210F) è ora considerato equivalente a ħ (\hbar U+0127).
- La macro @simd ora ha una semantica più specifica: consente solo il riordino e la potatura dei dati in virgola mobile, anziché abilitare tutte le ottimizzazioni @fastmath. Se i programmi riscontrano un calo delle prestazioni a causa di questa modifica, è possibile ripristinare il comportamento precedente utilizzando @fastmath @simd.
- Quando si visualizza una traccia dello stack di un metodo con parole chiave, la rappresentazione testuale delle parole chiave è ora semplificata utilizzando la nuova sintassi macro "@Kwargs{key1::Type1, ...}".
- Miglioramenti al compilatore/runtime
- Il garbage collector ora esegue la selezione multi-thread degli oggetti da rimuovere.
- JITLink è abilitato di default in Linux-sistemi basati sull'architettura aarch64 quando si compila Julia con LLVM 15 o versioni successive.
- Il processo di precompilazione utilizza blocchi di file pid. Solo un processo Julia alla volta esegue la precompilazione. In precedenza, tutti i processi venivano eseguiti in parallelo e c'era il rischio di corrompere i file della cache di compilazione a causa di condizioni di gara.
- Modifiche ai parametri della riga di comando
- Aggiunta l'opzione "--gcthreads" per specificare quanti thread paralleli verranno utilizzati dal garbage collector. L'impostazione predefinita è "N/2", dove N è il numero di thread worker ("--threads") utilizzati da Julia.
- Costruisci modifiche al sistema
- I nodi "SparseArrays" e "SuiteSparse" sono stati rimossi dall'immagine di sistema predefinita. Il pacchetto base di Julia non contiene più librerie con licenza GPL. Tuttavia, queste librerie sono ancora incluse nel linguaggio nella distribuzione binaria standard.
- Nuove funzioni di libreria
- "tanpi" calcola "tan(π*x)" in modo più accurato di "tan(pi*x)".
- "fourroot(x)" è definito in Base.Math e può essere utilizzato per calcolare la radice quarta di "x". Il nome abbreviato di questo metodo è il carattere Unicode ∜, che può essere inserito utilizzando il comando \fourthroot. .
- Aggiunte le funzioni "Libc.memmove", "Libc.memset" e "Libc.memcpy" la cui funzionalità corrisponde a quella delle corrispondenti chiamate C.
- Aggiunto il metodo "Base.isprecompiled(pkg::PkgId)" che restituisce "true" se il pacchetto è già stato precompilato.
- Opzioni della funzione di libreria
- "binomial(x, k)" ora supporta "x" non intero.
- 'CartesianIndex' ora viene trattato come uno 'scalare' ai fini della trasmissione.
- Il metodo "printstyled" ora supporta l'output in corsivo.
- I metodi "parent" e "parentindices" ora supportano il tipo "SubStrings".
- Il metodo "replace(string,pattern...)" ora supporta un argomento "IO" facoltativo per l'output in un flusso anziché restituire una stringa.
- Il metodo "startswith" ora supporta i flussi I/O.
- Modifiche alle librerie principali
- La parola chiave "initialized=true" è stata rimossa dai metodi "sortperm!" e "partialsortperm!", il che potrebbe causare comportamenti non sicuri.
- Quando si stampano interi razionali, il loro denominatore viene ora saltato nel contesto dei flussi tipizzati razionali (ad esempio negli array).
- Gestore di pacchetti
- Il metodo "Pkg.precompile" ora accetta "timing" come argomento di parola chiave, visualizzando le informazioni sui tempi di precompilazione per ciascun pacchetto: "Pkg.precompile(timing=true)".
- Algebra lineare
- Il tipo AbstractQ non è più un sottotipo di AbstractMatrix. Inoltre, il metodo adjoint(Q::AbstractQ) non racchiude più Q in un tipo Adjoint, sostituendolo con AdjointQ, che è a sua volta un sottotipo di AbstractQ. Questa modifica è dovuta al fatto che le istanze di AbstractQ si comportano tipicamente come operatori lineari su funzioni e matrici e non sono accessibili tramite indice. Inoltre, molti tipi di AbstractQ possono operare su vettori/matrici di dimensioni variabili, comportandosi come una matrice con dimensioni dipendenti dal contesto. Questa modifica conferisce ad AbstractQ un'interfaccia ben definita, descritta in dettaglio nella documentazione di Julia.
- I risultati della fattorizzazione non sono più racchiusi nei tipi "Adjoint" e "Transpose". Sono stati invece aggiunti i tipi "AdjointFactorization" e "TranposeFactorization", che sono a loro volta sottotipi di "Factorization".
- Nuove funzioni "hermitianpart" e "hermitianpart!" per trovare la parte hermitiana (veramente simmetrica) di una matrice.
- Il metodo "norm" di una matrice trasposta di un figlio di tipo "AbstractMatrix" ora restituisce per impostazione predefinita la norma della matrice padre, corrispondendo al comportamento attuale per "AbstractVectors".
- Aggiunti i metodi di calcolo degli autovettori "eigen(A, B)" e "eigvals(A, B)" per il caso in cui uno tra A o B è simmetrico o hermitiano.
- I metodi "eigvals/eigen(A, cholesky(B))" ora calcolano gli autovalori generalizzati (autovettori) di A e B tramite la decomposizione di Cholesky per B definito positivo.
- Stampaf
- Gli specificatori di formato ora supportano larghezza e precisione dinamiche, come "%*s" e "%*.*g".
- SOSTITUZIONE
- Quando si stampa una traccia dello stack, la profondità dei tipi stampati nelle firme delle funzioni è limitata per evitare un output troppo dettagliato.
- Test
- La macro "@test_broken" (o "@test" con "broken=true") ora genera un errore se l'espressione di test non restituisce un valore false/true.
- Quando si verifica un errore durante la chiamata a "@test" o all'interno di una funzione, ora viene fornita una traccia dello stack dettagliata, che consente di comprendere la posizione del test in "@testset".
- Utilità interattive
- "code_native" e "@code_native" ora utilizzano la sintassi Intel anziché AT&T.
- "@time_imports" ora mostra il tempo di esecuzione di "__init__()" per i moduli importati.
- Strutture obsolete e deprecate
- La macro "@pure" è stata deprecata. Utilizzare al suo posto "Base.@assume_effects :foldable".
Fonte: opennet.ru
