È stata pubblicata la versione 1.10 del linguaggio di programmazione Julia, che combina prestazioni elevate, supporto per la tipizzazione dinamica e strumenti integrati per la programmazione parallela. La sintassi di Julia è simile a quella di MATLAB, con alcuni elementi presi in prestito da Ruby e Lisp. Il modo di manipolare le stringhe ricorda Perl. Il codice del progetto è distribuito sotto 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à in Julia 1.10:
- Nuove funzionalità del linguaggio
- È stato attivato di default un nuovo analizzatore sintattico migliorato, JuliaSyntax.jl. Per tornare alla versione precedente, è necessario impostare la variabile d'ambiente JULIA_USE_FLISP_PARSER su 1.
- I simboli ⥺ (U+297A, \leftarrowsubset) e ⥷ (U+2977, \leftarrowless) possono ora essere utilizzati come operatori binari con priorità delle frecce.
- Modifiche al linguaggio
- Nella creazione di compiti figli, il RNG locale (generatore di numeri casuali) del compito genitore non è più influenzato. Il nuovo schema di inizializzazione del generatore di numeri casuali è simile alle implementazioni di SplitMix e DotMix.
- È stata proposta una nuova regola di selezione del metodo che elimina l'ambiguità con il tipo «Union{}», a favore di un metodo specificamente definito per gestire gli argomenti di tipo «Union{}».
- Il simbolo «h bar» ℏ (\hslash U+210F) è ora considerato equivalente a ħ (\hbar U+0127).
- Il macro «@simd» ora ha una semantica specificata: consente solo di riordinare e ridurre le operazioni in virgola mobile anziché includere tutte le ottimizzazioni della «matematica rapida @fastmath». Se durante l'esecuzione dei programmi si verifica una perdita di prestazioni a causa di questa modifica, il comportamento precedente può essere ripristinato utilizzando «@fastmath @simd».
- Quando si visualizza il tracciamento dello stack di un metodo con parole chiave, la rappresentazione testuale delle parole chiave ora viene semplificata utilizzando la nuova sintassi del macro «@Kwargs{key1::Type1, …}».
- Miglioramenti del compilatore / ambiente di esecuzione
- Il garbage collector ora esegue la raccolta degli oggetti da eliminare in modo multithreading.
- JITLink è abilitato di default nei sistemi Linux basati sull'architettura aarch64 quando Julia è compilata con LLVM 15 o versioni successive.
- Durante la precompilazione vengono utilizzati i blocchi dei file pid. Solo un processo julia alla volta può eseguire la precompilazione. In precedenza, tutti i processi lavoravano in parallelo, e c'era il rischio di danneggiare i file di cache della compilazione a causa di condizioni di gara.
- Modifiche ai parametri della riga di comando
- Aggiunta l'opzione «—gcthreads», che consente di specificare quanti thread parallelizzati utilizzerà il garbage collector. Per impostazione predefinita, il valore è «N/2», dove N è il numero di thread di lavoro («—threads») utilizzati da Julia.
- Modifiche al sistema di build
- I noduli «SparseArrays» e «SuiteSparse» sono stati esclusi dall'immagine di sistema predefinita. Nel pacchetto base di Julia non sono più incluse le librerie con licenza GPL. Tuttavia, queste librerie sono comunque incluse con il linguaggio nella distribuzione binaria standard.
- Nuove funzioni di libreria
- «tanpi» calcola «tan(π*x)» con maggiore precisione rispetto a «tan(pi*x)».
- «fourroot(x)» è definito in Base.Math e può essere utilizzato per calcolare la radice quarta di «x». L'abbreviazione di questo metodo è il simbolo Unicode ∜, che può essere inserito con il comando \fourthroot<tab>.
- Aggiunte le funzioni «Libc.memmove», «Libc.memset» e «Libc.memcpy», la cui funzionalità corrisponde a quella delle rispettive chiamate C.
- Aggiunto il metodo «Base.isprecompiled(pkg::PkgId)», che restituisce «true» se il pacchetto è già stato precompilato.
- Opzioni delle funzioni di libreria
- «binomial(x, k)» ora supporta valori non interi per «x».
- «CartesianIndex» è ora considerato come «scalare» per la trasmissione in broadcast.
- Il metodo «printstyled» supporta ora l'output in corsivo.
- I metodi «parent» e «parentindices» supportano ora il tipo «SubStrings».
- Il metodo «replace(string,pattern…)» supporta ora l'argomento opzionale «IO» per l'output in streaming invece del ritorno di una stringa.
- Il metodo «startswith» supporta ora i flussi di input/output.
- Modifiche alle librerie di base
- Dai metodi «sortperm!» e «partialsortperm!» è stata rimossa la parola chiave «initialized=true», che poteva causare comportamenti insicuri.
- Quando si stampano numeri interi di tipo «Rational», il loro denominatore viene ora omesso nel contesto dei flussi tipizzati «Rational» (ad esempio, negli array).
- Gestore pacchetti
- Il metodo «Pkg.precompile» accetta ora «timing» come argomento chiave, visualizzando informazioni sul tempo di precompilazione per ciascun pacchetto — «Pkg.precompile(timing=true)».
- LinearAlgebra
- Il tipo «AbstractQ» non è più un sottotipo di «AbstractMatrix». Inoltre, il metodo «adjoint(Q::AbstractQ)» ora non avvolge «Q» nel tipo «Adjoint», sostituendolo con «AdjointQ», che è anch'esso un sottotipo di «AbstractQ». Questa modifica è dovuta al fatto che le istanze di «AbstractQ» si comportano generalmente come operatori lineari basati su funzioni e matrici e non sono accessibili per indice. Inoltre, molti tipi di «AbstractQ» possono lavorare con vettori/matrici di diverse dimensioni, comportandosi come una matrice le cui dimensioni dipendono dal contesto. Grazie a questa modifica, il tipo «AbstractQ» ha ora un'interfaccia ben definita, dettagliata nella documentazione di Julia.
- I risultati della fattorizzazione non sono più racchiusi nei tipi wrapper «Adjoint» e «Transpose». Al loro posto sono stati aggiunti i tipi «AdjointFactorization» e «TranposeFactorization», che sono anch'essi sottotipi di «Factorization».
- Nuove funzioni «hermitianpart» e «hermitianpart!» per trovare la parte ermaitana (veramente simmetrica) di una matrice.
- Il metodo «norm» della matrice trasposta del sottotipo «AbstractMatrix» ora restituisce per impostazione predefinita la norma della matrice padre, in conformità al comportamento attuale per gli «AbstractVectors».
- Sono stati 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 ermetico.
- I metodi «eigvals/eigen(A, cholesky(B))» ora calcolano i valori propri generali (gli autovalori e i vettori propri) di A e B tramite la decomposizione di Cholesky per il B positivo definito.
- Printf
- I specificatori di formato ora supportano larghezza e precisione dinamiche, ad esempio «%*s» e «%*.*g».
- REPL
- Quando si stampa lo stack trace, la profondità dei tipi stampati nelle firme delle funzioni è limitata per evitare un output eccessivamente dettagliato.
- Test
- Il macro «@test_broken» (o «@test» con «broken=true») ora genera un errore se l'espressione di test non restituisce un valore false/true.
- In caso di errore durante la chiamata a «@test» o di errore all'interno della funzione, ora viene fornito un tracciato approfondito dello stack per comprendere la posizione del test in «@testset».
- InteractiveUtils
- «code_native» e «@code_native» ora utilizzano la sintassi Intel invece di AT&T.
- «@time_imports» ora mostra il tempo di esecuzione di «__init__()» per i moduli importati.
- Costrutti obsoleti e da rimuovere.
- Il macro «@pure» è stato dichiarato obsoleto. Utilizzare invece «Base.@assume_effects :foldable».
Fonte: opennet.ru
