È stata pubblicata la versione 1.7 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 alcuni elementi presi da Ruby e Lisp. Il metodo di manipolazione delle 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.
Nuove funzionalità del linguaggio Julia 1.7:
- Nuova sintassi per la creazione di array multidimensionali. I simboli di punto e virgola vengono utilizzati per separare le dimensioni dell'array, con il numero di punti e virgola che indica la dimensione. Ad esempio, un punto e virgola in «[A; B]» significa concatenazione nella prima dimensione (verticalmente in un array monodimensionale), due punti e virgola «[A;; B]» effettuano questa operazione nella seconda dimensione (orizzontalmente come una nuova riga della matrice), tre punti e virgola «;;;» nella terza dimensione, e così via.
- La barra inversa (\) alla fine di una riga all'interno di un letterale stringa ora rimuove il carattere di ritorno a capo e gli spazi. Questo può essere utilizzato per suddividere stringhe lunghe in più righe di codice senza aggiungere caratteri extra.
- La barra inversa prima di una nuova riga nei literal dei comandi console `cmd \…` ora elimina sempre la nuova riga e interpreta la sequenza come un literal di stringa continuo, mentre prima il risultato non era chiaramente definito.
- L'espressione «(; a, b) = x» per creare variabili separate a e b da x. Questa sintassi è equivalente a «a = getproperty(x, :a); b = getproperty(x, :b)».
- La moltiplicazione implicita è ora consentita per i simboli radicali (ad esempio, x√y e x∛y).
- Gli operatori logici «&&» e «||» possono ora essere utilizzati sugli elementi dell'array nella forma «.&&» e «.||».
- Gli operatori ⫪(U + 2AEA, \Top, \downvDash) e ⫫(U + 2AEB, \Bot, \upvDash, \indep) possono ora essere utilizzati come operatori binari.
- È stata aggiunta l'opzione «—check-bounds=yes|no|auto» per il controllo dei macro @inbounds con valore predefinito auto.
Modifiche al linguaggio
- Il generatore di numeri casuali predefinito è stato modificato da Mersenne Twister a Xoshiro256++, quindi tutti i numeri casuali saranno diversi (anche con lo stesso seme), a meno che non venga utilizzato un oggetto RNG esplicito. Il nuovo generatore offre prestazioni migliori, caratteristiche statistiche superiori ed è utilizzato per la casualità riproducibile in programmi multithreading (mantiene lo stato per ogni task eseguita e ramifica uno stato separato quando viene creata una nuova task).
- La destrutturazione non modifica più i valori nel processo di assegnazione della parte sinistra quando si ottengono valori dalla parte destra dell'espressione. Ad esempio, per l'array x, l'espressione "x[2], x[1] = x" ora scambierà il primo e il secondo elemento di x, mentre in precedenza per riempire entrambe le registrazioni veniva utilizzato x[1] perché x[2] veniva modificato durante l'iterazione dell'assegnazione di x.
- macroexpand, @macroexpand e @macroexpand1 non generano più l'errore LoadError. Anche @test_throws è stato modificato per mantenere funzionanti i test interessati.
- Il punto medio «·» (\cdotpU + 00b7) e il punto interpunzionale greco ·(U + 0387) sono ora trattati come equivalenti dell'operatore punto «⋅» (\cdotU + 22c5).
- Il segno meno «−» (\minusU + 2212) è ora considerato equivalente al segno di meno trattino «-» (U + 002d).
- Iterators.peel(itr) ora restituisce «nothing» quando itr è vuoto, invece di sollevare un'eccezione BoundsError.
- Diversi punti e virgola consecutivi nell'espressione dell'array erano precedentemente ignorati (ad esempio, «[1 ;; 2] == [1 ; 2]»). Ora questa sintassi viene utilizzata per separare le dimensioni.
- Le direttive di formattazione sbilanciate «#= … =#» in Unicode sono ora vietate nelle stringhe e nei commenti per ridurre il rischio di iniezioni di codice parse/eval.
Modifiche ai parametri della riga di comando
- Il parametro julia —project e la variabile d'ambiente JULIA_PROJECT ora supportano la selezione di ambienti comuni. Ad esempio, sono ora equivalenti julia —project=@myenv e export JULIA_PROJECT=»@myenv».
Modifiche alla multithreading
- Le funzioni interne per operazioni con puntatori atomici sono ora definite per dimensioni specifiche di byte.
- Aggiunta la supporto per la dichiarazione e l'uso di campi singoli per struct mutabili come atomici; vedere il nuovo macro @atomic.
- Se la variabile d'ambiente JULIA_NUM_THREADS è impostata su «auto», il numero di thread sarà uguale al numero di thread della CPU.
- Ogni oggetto Task ha uno stato locale del generatore di numeri casuali, che garantisce per impostazione predefinita un'esecuzione del codice di simulazione parallela riproducibile (indipendente dalla pianificazione). Il generatore per impostazione predefinita funziona anche in parallelo in modo significativamente più veloce rispetto alle versioni precedenti.
- Le attività possono ora spostarsi tra i thread. In precedenza, un'attività veniva sempre eseguita nel thread che l'aveva avviata per primo.
Nuove funzioni della libreria
- Aggiunti i metodi findmax(f, domain), argmax(f, domain) e le corrispondenti versioni «min» con due argomenti.
- isunordered(x) restituisce true se x è un valore che dovrebbe essere disordinato, come NaN o missing.
- Nuova funzione keepat!(vector, inds), che è l'equivalente di vector[inds] per l'elenco degli interi inds.
- Il metodo lock(f, lck) per due argomenti ora accetta Channel come secondo argomento.
- Nuovo functor Returns(value) restituisce value per qualsiasi argomento.
- Nuovi macro @something e @coalesce, che sono versioni di something e coalesce, rispettivamente.
- Nuova funzione redirect_stdio per reindirizzare stdin, stdout e stderr.
- Il nuovo macro «Base.@invoke f(arg1::T1, arg2::T2; kwargs…)» fornisce una sintassi semplice per chiamare «invoke(f, Tuple{T1,T2}, arg1, arg2; kwargs…)».
- Il nuovo macro «Base.@invokelatest f(args…; kwargs…)» offre un modo conveniente per chiamare «Base.invokelatest(f, args…; kwargs…)».
Nuove funzionalità della libreria
- Le tuple possono essere create con la parola chiave context nel formato «:key => value» per specificare gli attributi da passare a IOContext.
- bytes2hex e hex2bytes non sono più limitati agli argomenti di tipo «Union{String,AbstractVector{UInt8}}» e ora richiedono solo che i tipi siano sequenze e abbiano una lunghezza calcolabile.
- stat(file) ha ricevuto un metodo show più dettagliato e utile.
Modifiche alla libreria standard
- count e findall ora accettano un argomento AbstractChar per cercare un carattere nella stringa.
- Nuovi metodi range(start, stop) e range(start, stop, length).
- range ora supporta start come argomento chiave opzionale.
- Alcune operazioni con i range ora restituiscono StepRangeLen anziché StepRange permettendo un passo finale nullo. In precedenza, λ .* (1:9) generava un errore quando λ = 0.
- islowercase e isuppercase ora gestiscono le categorie Unicode di lettere minuscole e maiuscole.
- Le funzioni iseven e isodd ora supportano tipi diversi da Integer.
- escape_string ora accetta un insieme di caratteri tramite la parola chiave keep, per i caratteri che devono rimanere invariati.
- getindex per NamedTuple ora accetta una tupla di simboli per indicizzare più valori.
- I sottotipi di AbstractRange seguono il comportamento comune dell'indicizzazione degli array quando si indicizzano Bool, generando errori per gli scalari Bool e gestendo gli array (inclusi i range) Bool come indici logici.
- keys(::RegexMatch) restituisce le chiavi di cattura dell'espressione regolare per nome, o per indice se non ci sono nomi.
- keys(::Generator) restituisce le chiavi dell'iteratore.
- RegexMatch ora è iterabile, producendo le sottostringhe catturate.
- lpad/rpad sono definiti per textwidth.
- Test.@test ora accetta argomenti denominati broken e skip, che ripetono il comportamento di Test.@test_broken e Test.@test_skip, ma consentono di saltare i test che falliscono solo in determinate condizioni. Ad esempio, if T == Float64 @test_broken isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T))) else @test isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T))) end può essere sostituito con @test isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T))) broken=(T == Float64)
- @lock ora è esportato da Base.
- La funzione sperimentale Base.catch_stack() è stata rinominata in current_exceptions() e ha ricevuto un tipo di valore di ritorno specifico.
- Alcune funzioni trigonometriche (sind, cosd, tand, asind, acosd, asecd, acscd, acotd, atand) ora accettano matrici quadrate.
- replace(::String) ora accetta più modelli che verranno applicati da sinistra a destra simultaneamente, quindi a qualsiasi carattere verrà applicato solo un modello, e i modelli verranno applicati solo al testo di input, ma non alle loro sostituzioni successive.
- La funzione length sui dati di tipo specifico non controlla più l'overflow degli interi nella maggior parte dei casi. checked_length è la nuova funzione che utilizza aritmetica verificata fino al punto di overflow, se il risultato può comportare un riporto. In alternativa, puoi utilizzare il pacchetto SaferIntegers.jl, se c'è il rischio di overflow dell'intervallo.
- Nuovi metodi replace per sostituire gli elementi in un Tuple.
Gestore pacchetti
- Nella modalità console «julia>», per i pacchetti usando o import che non sono installati ma disponibili nel registro «pkg> add», viene proposta l'installazione automatica del pacchetto.
- Manifest.toml utilizza un nuovo formato con nuovi metadati, inclusa la versione di Julia che ha generato il manifesto. I manifesti in formato precedente continuano a essere supportati nel formato originale, finché l'utente non esegue Pkg.upgrade_manifest().
- «pkg> precompile» ora compilerà in anticipo le nuove versioni dei pacchetti già caricati, invece di rimandarle alla sessione successiva.
- «pkg> rm, pin e free» ora supportano l'argomento «—all» per eseguire l'azione su tutti i pacchetti contemporaneamente.
- I registri caricati dal Pkg Server (non git) non vengono più estratti in file, ma letti direttamente dall'archivio in memoria. Per disabilitare questa funzione, impostare la variabile ambiente JULIA_PKG_UNPACK_REGISTRY=true.
- Ora è possibile utilizzare un file eseguibile git esterno invece della libreria libgit2 predefinita per i download effettuati tramite il protocollo Git, impostando la variabile ambiente JULIA_PKG_USE_CLI_GIT=true.
- I registri caricati da server Pkg (non git) sono ora considerati immutabili. Le modifiche apportate manualmente ai loro file potrebbero non essere accolte dalla sessione di Pkg in esecuzione.
- Aggiungere pacchetti per nome di directory in modalità REPL ora richiede di aggiungere «./» al nome, se il pacchetto si trova nella directory corrente; ad esempio «add ./Package» invece di «add Package». Questo è stato fatto per evitare confusione tra il nome del pacchetto Package e la directory locale Package.
- La parola chiave mode per PackageSpec è stata rimossa.
Algebra lineare
- Utilizza Libblastrampoline per collegare BLAS e LAPACK durante l'esecuzione. Per impostazione predefinita, OpenBLAS è collegato con la distribuzione di Julia. Il nuovo meccanismo di collegamento può essere utilizzato per sostituire BLAS e LAPACK con impostazioni personalizzate.
- Su aarch64, OpenBLAS ora utilizza ILP64 BLAS, proprio come tutte le altre piattaforme a 64 bit.
- OpenBLAS è stato aggiornato alla versione 0.3.13.
- SuiteSparse è stato aggiornato alla versione 5.8.1.
- La forma della matrice UpperHessenberg viene mantenuta durante certe operazioni aritmetiche, come la moltiplicazione o la divisione per una matrice UpperTriangular.
- Le fattorizzazioni quasi triangolari di Schur possono ora essere convertite in forma superiore triangolare complessa utilizzando l'espressione 'Schur{Complex}(S)'.
- cis(A) ora supporta matrici come argomenti.
- dot supporta UniformScaling per il tipo AbstractMatrix.
- qr[!] e lu[!] ora supportano valori di tipo LinearAlgebra.PivotingStrategy a singolo elemento come argomento pivot opzionale: i valori predefiniti qr(A, NoPivot()) confrontati con qr(A, ColumnNorm()) con pivot e lu(A, RowMaximum()) confrontati con lu(A, NoPivot()) senza pivot. Le precedenti chiamate Val{true/false} sono deprecate.
- det(M::AbstractMatrix{BigInt}) chiama det_bareiss(M), che utilizza l'algoritmo Bareiss per calcolare valori esatti.
REPL
- Le righe lunghe vengono ora rimosse utilizzando la sintassi 'head' ⋯ 12345 bytes ⋯ 'tail' quando visualizzate in REPL.
- L'inserimento degli esempi di Repl dagli appunti in REPL ora supporta tutte le modalità di Repl (julia, pkg, shell, help?) e passa automaticamente alla modalità corretta.
- «help?>» per i moduli senza stringhe di documentazione ora restituisce un elenco dei nomi esportati e mostra il contenuto del README.md correlato se trovato.
SparseArrays
- Nuovo metodo sizehint!(::SparseMatrixCSC, ::Integer).
- cholesky() ora conserva completamente la permutazione fornita dall'utente.
- issparse ora viene applicato coerentemente a tutti gli array di wrapping, comprese le strutture annidate, controllando issparse dell'array padre del wrapping.
Manipolazione delle date
- La funzione Dates.periods può essere utilizzata per ottenere valori Vector da Period da CompoundPeriod.
Download
- Se l'intestazione del cookie è impostata nella richiesta reindirizzata, il cookie sarà ora inviato nelle richieste successive.
- Se il file ~/.netrc esiste, viene utilizzato come sorgente delle password per i siti web con autenticazione.
- L'indicazione del nome del server ora avviene con tutte le connessioni TLS, anche se l'identità del server non è verificata (vedi NetworkOptions).
- Durante la verifica delle connessioni TLS su Windows, se un server La revoca dei certificati non è disponibile, la connessione è consentita; questo è conforme a ciò che fanno altre applicazioni e a come viene eseguita la revoca in macOS.
- Ora c'è un'attesa di 30 secondi per la connessione e di 20 secondi per l'invio dei dati. Questo garantisce che le connessioni siano attive, altrimenti verranno disconnesse in meno di un minuto.
Tar
- Tar.extract ora ignora la modalità di permessi esatta nel tarball e normalizza le modalità proprio come fa Tar.create. Questo è simile a git.
- Le funzioni che utilizzano archivi tar ora gestiscono i collegamenti hard: il target del collegamento deve essere un file precedentemente visualizzato; Tar.list elenca la voce come tipo :hardlink e un campo .link che indica il percorso del target; altre funzioni — Tar.extract, Tar.rewrite, Tar.tree_hash — convertono il collegamento hard in una copia del file target.
- Il formato standard creato da Tar.create e Tar.rewrite ora include voci per le directory non vuote. Alcuni strumenti che utilizzano tarball (incluso Docker) vengono confusi a causa dell'assenza di queste voci nelle directory.
- Tar ora accetta tarball con spazi iniziali nei campi interi ottali dell'intestazione: tecnicamente questo è un formato non valido secondo la specifica POSIX, ma le vecchie versioni di tar di Solaris creavano archivi in questo formato, quindi è realmente presente in natura e sembra innocuo accettarlo.
- Tar.extract ora accetta l'argomento set_permissions come parola chiave, che di default è vero; se viene passato false, i permessi dei file estratti non vengono modificati durante l'estrazione.
Mmap
- mmap ora è esportato e disponibile per l'uso.
DelimitedFiles
- Readdlm ora utilizza di default use_mmap=false su tutti i sistemi operativi per garantire affidabilità in situazioni anomale con il file system.
Fonte: opennet.ru
