È stata pubblicata la versione del linguaggio di programmazione Julia 1.7, 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.
Nuove funzionalità del linguaggio Julia 1.7:
- Nuova sintassi per la creazione di array multidimensionali. I punti e virgola vengono utilizzati per separare le dimensioni degli array, con il numero di punti e virgola che ne indica la dimensione. Ad esempio, un punto e virgola in "[A; B]" indica la concatenazione nella prima dimensione (verticalmente in un array unidimensionale), due punti e virgola "[A;; B]" indicano la concatenazione nella seconda dimensione (orizzontale come una nuova riga in una matrice), tre punti e virgola ";;;" nella terza e così via.
- Una barra rovesciata (\) alla fine di una riga all'interno di una stringa letterale ora rimuove il carattere di nuova riga e l'indentazione. Questo può essere utilizzato per suddividere righe lunghe in più righe di codice senza aggiungere caratteri extra.
- Una barra rovesciata prima di una nuova riga nei comandi letterali della console `cmd \…` ora rimuove sempre la nuova riga e interpreta la sequenza come una stringa letterale continua, mentre in precedenza il risultato era indefinito.
- 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 nel formato ".&&" e ".||".
- Gli operatori ⫪(U+2AEA, \Top, \downvDash) e ⫫(U+2AEB, \Bot, \upvDash, \indep) possono ora essere utilizzati come operatori binari.
- Aggiunta l'opzione "--check-bounds=yes|no|auto" per controllare le macro @inbounds con valore predefinito auto.
Modifiche linguistiche
- Il generatore di numeri pseudo-casuali predefinito è stato modificato da Mersenne Twister a Xoshiro256++, quindi tutti i numeri casuali saranno diversi (anche con lo stesso seed) a meno che non venga utilizzato un oggetto RNG esplicito. Il nuovo generatore offre prestazioni migliori, statistiche superiori e viene utilizzato per la casualità riproducibile nei programmi multi-thread (mantiene lo stato per ogni task in esecuzione e crea uno stato separato quando viene creato un nuovo task).
- La destrutturazione non modifica più i valori durante l'assegnazione a sinistra quando si recuperano valori dal lato destro di un'espressione. Ad esempio, per un array x, l'espressione "x[2], x[1] = x" ora scambierà il primo e il secondo elemento di x, mentre in precedenza x[1] veniva utilizzato per riempire entrambe le voci perché x[2] era stato modificato durante l'iterazione dell'assegnazione a x.
- macroexpand, @macroexpand e @macroexpand1 non generano più un errore LoadError. Anche @test_throws è stato modificato per garantire il funzionamento dei test interessati.
- Il punto centrale "·" (\cdotpU+00b7) e il punto mediano greco · (U+0387) sono ora trattati come equivalenti all'operatore punto "⋅" (\cdotU+22c5).
- Il segno meno '−' (\minusU+2212) è ora considerato equivalente al segno meno-trattino '-' (U+002d).
- Iterators.peel(itr) ora restituisce "nothing" quando itr è vuoto, anziché generare un'eccezione BoundsError.
- In precedenza, più punti e virgola consecutivi in un'espressione array venivano ignorati (ad esempio "[1 ;; 2] == [1 ; 2]"). Questa sintassi viene ora utilizzata per separare le dimensioni.
- Le direttive di formattazione Unicode non bilanciate "#= ... =#" non sono più consentite nelle stringhe e nei commenti per ridurre la probabilità di iniezione di codice di analisi/valutazione.
Modifiche ai parametri della riga di comando
- L'opzione julia --project e la variabile d'ambiente JULIA_PROJECT ora supportano la selezione di ambienti condivisi. Ad esempio, julia --project=@myenv ed export JULIA_PROJECT="@myenv" sono ora equivalenti.
Modifiche al multithreading
- Gli intrinseci per le operazioni dei puntatori atomici sono ora definiti per dimensioni di byte specifiche.
- Aggiunto supporto per la dichiarazione e l'utilizzo di singoli campi di una struttura modificabile come atomici; vedere la nuova macro @atomic.
- Se la variabile d'ambiente JULIA_NUM_THREADS è impostata su "auto", il numero di thread sarà uguale al numero di thread del processore.
- Ogni oggetto Task ha un generatore di numeri casuali locale, che per impostazione predefinita garantisce un'esecuzione riproducibile (indipendente dalla pianificazione) del codice di simulazione parallelo. Inoltre, il generatore funziona in parallelo in modo significativamente più veloce rispetto alle versioni precedenti.
- Ora è possibile spostare le attività tra i thread. In precedenza, un'attività veniva sempre eseguita nel thread che la eseguiva 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 non dovrebbe essere ordinato, ad esempio NaN o mancante.
- Nuova funzione keepat!(vector, inds) che è equivalente a vector[inds] di un elenco inds di interi.
- Il metodo lock(f, lck) a due argomenti accetta ora un canale come secondo argomento.
- Il nuovo funtore Returns(value) restituisce il valore per qualsiasi argomento.
- Nuove macro @something e @coalesce che sono rispettivamente versioni di something e coalesce.
- Nuova funzione redirect_stdio per reindirizzare stdin, stdout e stderr.
- La nuova macro "Base.@invoke f(arg1::T1, arg2::T2; kwargs…)" fornisce una sintassi semplice per chiamare "invoke(f, Tuple{T1,T2}, arg1, arg2; kwargs…)".
- La nuova macro "Base.@invokelatest f(args…; kwargs…)" fornisce un modo pratico per chiamare "Base.invokelatest(f, args…; kwargs…)".
Nuove funzionalità della libreria
- È possibile creare una tupla 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 pratico.
Modifiche alla libreria standard
- count e findall ora accettano un argomento AbstractChar per cercare un carattere in una stringa.
- Nuovi metodi range(start, stop) e range(start, stop, length).
- range ora supporta start come argomento opzionale per parola chiave.
- Alcune operazioni di intervallo ora restituiscono StepRangeLen anziché StepRange, consentendo che il passo finale sia zero. In precedenza, λ .* (1:9) generava un errore quando λ = 0.
- islowercase e isuppercase ora gestiscono le categorie minuscole e maiuscole Unicode.
- Le funzioni iseven e isodd ora supportano tipi diversi da Integer.
- escape_string ora accetta un set di caratteri tramite la parola chiave keep, per i caratteri che devono rimanere così come sono.
- getindex per NamedTuple ora accetta una tupla di caratteri per indicizzare più valori.
- I sottotipi AbstractRange seguono il comportamento generale di indicizzazione degli array quando indicizzano i valori booleani, gli errori per gli scalari booleani e quando trattano array (inclusi gli intervalli) di valori booleani come indici logici.
- keys(::RegexMatch) restituisce le chiavi di cattura di un'espressione regolare in base al nome o all'indice se non ci sono nomi.
- keys(::Generator) restituisce le chiavi dell'iteratore.
- RegexMatch ora esegue un'iterazione, restituendo le sottostringhe catturate.
- lpad/rpad sono definiti per textwidth.
- Test.@test ora accetta gli argomenti denominati broken e skip, che replicano 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 viene ora esportato da Base.
- La funzione sperimentale Base.catch_stack() è stata rinominata current_exceptions() e ha un tipo di ritorno specifico.
- Alcune funzioni trigonometriche (sind, cosd, tand, asind, acosd, asecd, acscd, acotd, atand) ora accettano una matrice quadrata.
- replace(::String) ora accetta più pattern, che verranno applicati simultaneamente da sinistra a destra, quindi a ogni carattere verrà applicato un solo pattern e i pattern verranno applicati solo al testo di input, non alle successive sostituzioni.
- La funzione length su intervalli di determinati tipi non controlla più l'overflow di interi nella maggior parte dei casi. checked_length è una nuova funzione che utilizza l'aritmetica controllata fino al punto di overflow, se il risultato è riporto. In alternativa, utilizzare il pacchetto SaferIntegers.jl se esiste il rischio di overflow di intervallo.
- Nuovi metodi di sostituzione per sostituire gli elementi in una tupla.
Gestore di pacchetti
- Nella modalità console "julia>" per l'utilizzo o l'importazione di pacchetti non installati, ma disponibili nel registro "pkg> add", si consiglia di installare il pacchetto automaticamente.
- Manifest.toml utilizza il nuovo formato con nuovi metadati, inclusa la versione di Julia che ha generato il manifest. I manifest del vecchio formato sono ancora supportati nel loro formato originale, finché l'utente non esegue Pkg.upgrade_manifest().
- "pkg> precompile" ora precompilerà le nuove versioni dei pacchetti già scaricati, anziché rimandarle alla sessione successiva.
- "pkg> rm, pin e free" ora supportano l'argomento "--all" per richiamare l'azione su tutti i pacchetti contemporaneamente.
- I registri scaricati da Pkg Server (non da git) non vengono più decompressi in file, ma letti direttamente dall'archivio e memorizzati in memoria. Per disabilitare questa funzionalità, impostare la variabile d'ambiente JULIA_PKG_UNPACK_REGISTRY=true.
- Ora è possibile utilizzare l'eseguibile git esterno al posto della libreria libgit2 predefinita per i download che avvengono tramite il protocollo Git impostando la variabile di ambiente JULIA_PKG_USE_CLI_GIT=true.
- Реестры, загруженные с server Pkg (не git), теперь считаются неизменяемыми. Изменения, внесённые вручную в их файлы, могут не быть приняты запущенным сеансом Pkg.
- L'aggiunta di pacchetti in base al nome della directory in modalità REPL ora richiede l'aggiunta di "./" al nome se il pacchetto si trova nella directory corrente; ad esempio "add ./Package" invece di "add Package". Questo per evitare confusione tra il nome del pacchetto Package e la directory Package locale.
- Rimossa la parola chiave mode per PackageSpec.
Algebra lineare
- Utilizzare Libblastrampoline per abilitare BLAS e LAPACK in fase di esecuzione. Per impostazione predefinita, OpenBLAS è abilitato come parte della distribuzione Julia. Il nuovo meccanismo di abilitazione può essere utilizzato per sostituire BLAS e LAPACK con impostazioni definite dall'utente.
- 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 di una matrice di UpperHessenberg viene conservata durante determinate operazioni aritmetiche, come la moltiplicazione o la divisione per una matrice triangolare superiore.
- Le fattorizzazioni di Schur quasi triangolari reali possono ora essere trasformate in una forma triangolare superiore complessa utilizzando l'espressione "Schur{Complex}(S)".
- cis(A) ora supporta le matrici come argomenti.
- dot supporta UniformScaling per il tipo AbstractMatrix.
- qr[!] e lu[!] ora supportano valori LinearAlgebra.PivotingStrategy singleton come argomento pivot facoltativo: i valori predefiniti sono qr(A, NoPivot()) anziché qr(A, ColumnNorm()) con pivot e lu(A, RowMaximum()) anziché 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 i valori esatti.
SOSTITUZIONE
- Le righe lunghe vengono ora rimosse utilizzando la sintassi "head" ⋯ 12345 byte ⋯ "tail" quando visualizzate nel REPL.
- L'incollaggio di esempi Repl dagli appunti in REPL ora supporta tutte le modalità Repl (julia, pkg, shell, help?) e la modalità viene cambiata automaticamente.
- "help?>" per i moduli senza docstring ora restituisce un elenco di nomi esportati e, se trovato, restituisce il contenuto del file README.md associato.
SparseArray
- Nuovo metodo sizehint!(::SparseMatrixCSC, ::Integer)\.
- cholesky() ora conserva completamente la permutazione specificata dall'utente.
- issparse viene ora applicato in modo coerente a tutti gli array wrapper, compresi quelli annidati, controllando issparse dell'array padre dell'array wrapper.
Manipolazione della data
- La funzione Dates.periods può essere utilizzata per ottenere valori vettoriali da un periodo da un periodo composto.
Scaricare
- Se l'intestazione del cookie è impostata in una richiesta reindirizzata, il cookie verrà inviato nelle richieste successive.
- Se il file ~/.netrc esiste, viene utilizzato come origine delle password per i siti web che richiedono l'autenticazione.
- L'indicazione del nome del server viene ora eseguita con tutte le connessioni TLS, anche se l'identità del server non è verificata (vedere NetworkOptions).
- Quando si controllano le connessioni TLS su Windows, se il server di revoca dei certificati non è disponibile, la connessione è consentita; ciò è coerente con quanto fanno altre applicazioni e con il modo in cui viene eseguita la revoca su macOS.
- Ora l'attesa per stabilire una connessione è di 30 secondi e quella per inviare i dati è di 20 secondi. Questo garantisce che le connessioni siano attive, altrimenti verranno disconnesse in meno di un minuto.
Catrame
- Tar.extract ora ignora la modalità di autorizzazione esatta del tarball e normalizza le modalità allo stesso modo di Tar.create. Il che è simile a git.
- Le funzioni che utilizzano gli archivi tar ora gestiscono i collegamenti fisici: la destinazione del collegamento deve essere un file visualizzato in precedenza; Tar.list elenca una voce con il tipo :hardlink e un campo .link che specifica il percorso alla destinazione; altre funzioni (Tar.extract, Tar.rewrite, Tar.tree_hash) convertono un collegamento fisico in una copia del file di destinazione.
- Il formato standard creato da Tar.create e Tar.rewrite ora include voci per directory non vuote. Alcuni strumenti che utilizzano tarball (incluso docker) sono confusi dalla mancanza di queste voci di directory.
- Tar ora accetta i tarball con spazi iniziali nei campi di intestazione degli interi ottali: tecnicamente questo è un formato non valido secondo le specifiche POSIX, ma i vecchi comandi tar di Solaris creavano tali archivi, quindi questo formato è presente in natura e sembra innocuo accettarlo.
- Tar.extract ora accetta un argomento con parola chiave set_permissions che per impostazione predefinita è true; se invece viene passato false, i permessi dei file estratti non vengono modificati durante l'estrazione.
mmap
- mmap è ora esportato e disponibile per l'uso.
File delimitati
- Ora Readdlm utilizza per impostazione predefinita use_mmap=false su tutti i sistemi operativi per garantire un'affidabilità costante in situazioni anomale del file system.
Fonte: opennet.ru
