Linguaggio di programmazione Julia 1.8 Rilascio

È disponibile il rilascio del linguaggio di programmazione Julia 1.8, che combina qualità come alte prestazioni, supporto per la digitazione dinamica e strumenti integrati per la programmazione parallela. La sintassi di Julia è vicina a MATLAB, prendendo in prestito alcuni elementi da Ruby e Lisp. Il metodo di manipolazione delle stringhe ricorda Perl. Il codice del progetto è distribuito sotto la 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 modifiche in Julia 1.8:

  • Nuove funzionalità linguistiche
    • I campi di una struttura mutabile ora possono essere annotati come costanti per impedirne la modifica e consentire l'ottimizzazione.
    • Le annotazioni di tipo possono essere aggiunte alle variabili globali.
    • Gli array n-dimensionali vuoti possono essere creati utilizzando più semiloni all'interno di staffe quadrate, ad esempio "[;;;]" crea un array 0x0x0.
    • I blocchi Try ora possono opzionalmente avere un blocco else, che viene eseguito immediatamente dopo il corpo principale se non vengono generati errori.
    • @inline e @noinline possono essere posizionati all'interno del corpo di una funzione, consentendoti di annotare una funzione anonima.
    • @inline e @noinline ora possono essere applicati a una funzione in un sito di chiamata o in un blocco per forzare l'inclusione (o la non inclusione) delle chiamate alla funzione corrispondente.
    • ∀, ∃ e ∄ sono consentiti come caratteri identificativi.
    • Aggiunto il supporto per la specifica Unicode 14.0.0.
    • Il metodo Module(:name, false, false) può essere utilizzato per creare un modulo che non contiene nomi, non importa Base o Core e non contiene un riferimento a se stesso.
  • La lingua cambia
    • Gli oggetti Task appena creati (@spawn, @async, ecc.) ora hanno world_age per i metodi dell'attività principale quando vengono creati, consentendo un'esecuzione ottimizzata. L'opzione di attivazione precedente è disponibile utilizzando il metodo Base.invokelatest.
    • Le direttive di formattazione bidirezionale sbilanciata Unicode sono ora vietate nelle stringhe e nei commenti per evitare iniezioni.
    • Base.ifelse è ora definita come una funzione generica piuttosto che come incorporata, consentendo ai pacchetti di estenderne la definizione.
    • Ogni assegnazione a una variabile globale ora passa prima attraverso una chiamata a convert(Any, x) o convert(T, x) se la variabile globale è stata dichiarata di tipo T. Prima di utilizzare variabili globali, assicurati che l'invariante convert(Any , x) === x è sempre vero, altrimenti potrebbe portare a comportamenti imprevisti.
    • Le funzioni integrate sono ora simili alle funzioni generiche e possono essere enumerate a livello di codice utilizzando metodi.
  • Miglioramenti al compilatore/runtime
    • Tempo di avvio ridotto di circa il 25%.
    • Il compilatore basato su LLVM è stato separato dalla libreria runtime in una nuova libreria, libjulia-codegen. Viene caricato per impostazione predefinita, quindi non dovrebbero esserci modifiche durante il normale utilizzo. Nelle distribuzioni che non necessitano di un compilatore (ad esempio, immagini di sistema in cui tutto il codice necessario è precompilato), questa libreria (e la relativa dipendenza LLVM) può essere semplicemente omessa.
    • L'inferenza di tipo condizionale è ora possibile passando un argomento a un metodo. Ad esempio, per Base.ifelse(isa(x, Int), x, 0) restituisce ::Int anche se il tipo di x è sconosciuto.
    • SROA (Scalar Sostituzione degli Aggregati) è stata migliorata: elimina le chiamate getfield con campi globali persistenti, elimina le strutture mutabili con campi non inizializzati, migliora le prestazioni e la gestione delle chiamate getfield nidificate.
    • L'inferenza del tipo tiene traccia di vari effetti: effetti collaterali e non-drop. Viene presa in considerazione la propagazione costante, che migliora significativamente le prestazioni in fase di compilazione. In alcuni casi, ad esempio, le chiamate a funzioni che non possono essere inline ma che non influiscono sul risultato verranno scartate in fase di esecuzione. Le regole per gli effetti possono essere sovrascritte manualmente utilizzando la macro Base.@assume_effects.
    • La precompilazione (con direttive di precompilazione esplicite o carichi di lavoro specificati) ora consente di risparmiare più codice definito dal tipo, con conseguente esecuzione più rapida alla prima esecuzione. Qualsiasi nuova combinazione metodo/tipo necessaria al tuo pacchetto, indipendentemente da dove tali metodi sono stati definiti, ora può essere memorizzata nella cache nel file di precompilazione se viene chiamata da un metodo appartenente al tuo pacchetto.
  • Modifiche ai parametri della riga di comando
    • Il comportamento predefinito per il monitoraggio delle dichiarazioni @inbounds è ora l'opzione auto in "--check-bounds=yes|no|auto".
    • Nuova opzione "--strip-metadata" per rimuovere docstring, informazioni sulla posizione di origine e nomi di variabili locali durante la creazione di un'immagine di sistema.
    • Nuova opzione "--strip-ir" per consentire al compilatore di rimuovere la rappresentazione intermedia del codice sorgente durante la creazione dell'immagine del sistema. L'immagine risultante funzionerà solo se viene utilizzato "--compile=all" o se tutto il codice richiesto è precompilato.
    • Se viene specificato il carattere "-" al posto del nome del file, il codice eseguibile viene letto dal flusso di input standard.
  • Modifiche al supporto multithreading
    • Threads.@threads per impostazione predefinita utilizza la nuova opzione di pianificazione :dynamic, che differisce dalla modalità precedente in quanto le iterazioni verranno pianificate dinamicamente tra i thread di lavoro disponibili anziché essere assegnate a ciascun thread. Questa modalità consente una migliore distribuzione dei cicli nidificati con @spawn e @threads.
  • Nuove funzioni di libreria
    • Eachsplit(str) per eseguire split(str) più volte.
    • allequal(itr) per verificare se tutti gli elementi in un iteratore sono uguali.
    • hardlink(src, dst) può essere utilizzato per creare collegamenti reali.
    • setcpuaffinity(cmd, cpus) per impostare l'affinità del core del processore con i processi avviati.
    • diskstat(path=pwd()) per ottenere le statistiche del disco.
    • Nuova macro @showtime per visualizzare sia la riga in fase di valutazione che il report @time.
    • LazyString e la macro lazy"str" ​​sono state aggiunte per supportare la costruzione pigra dei messaggi di errore nei percorsi di errore.
    • Risolto un problema di concorrenza in Dict e altri oggetti derivati ​​come chiavi(::Dict), valori(::Dict) e Set. I metodi di iterazione possono ora essere chiamati su un dizionario o un set, purché non ci siano chiamate che modifichino il dizionario o il set.
    • @time e @timev ora hanno una descrizione opzionale, che consente, ad esempio, di annotare la fonte dei report temporali. @time "Valutazione foo" foo().
    • range accetta stop o length come unico argomento di parola chiave.
    • precisione e setprecision ora accettano base come parola chiave
    • Gli oggetti socket TCP ora forniscono un metodo di scrittura chiusa e supportano l'uso della modalità semiaperta.
    • extrema ora accetta un argomento init.
    • Iterators.countfrom ora accetta qualsiasi tipo che definisca un metodo +.
    • @time ora assegna la percentuale del tempo impiegato nella ricompilazione dei metodi con i tipi modificati.
  • Modifiche alla libreria standard
    • Chiavi con valore Ora non viene rimosso nulla dall'ambiente in addenv.
    • Iterators.reverse (e quindi last) supporta ogni riga.
    • La funzione di lunghezza per intervalli di determinati tipi non controlla più l'overflow di numeri interi. È disponibile una nuova funzione, check_length, che contiene la logica di controllo del trasferimento di bit. Se necessario, utilizzare SaferIntegers.jl per costruire il tipo di intervallo.
    • L'iteratore Iterators.Reverse implementa ogni inversione dell'indice, se possibile.
  • Gestore di pacchetti
    • Nuovi indicatori ⌃ e ⌅ accanto ai pacchetti nello stato “pkg>” per i quali sono disponibili nuove versioni. ⌅ indica che non è possibile installare nuove versioni.
    • Nuovo argomento obsoleto::Bool per Pkg.status (--outdated o -o in modalità REPL) per mostrare informazioni sui pacchetti delle versioni precedenti.
    • Nuovo argomento compat::Bool per Pkg.status (--compat o -c in modalità REPL) per mostrare qualsiasi voce [compat] in Project.toml.
    • Nuova modalità "pkg>compat" (e Pkg.compat) per impostare le voci di compatibilità del progetto. Fornisce un editor interattivo tramite "pkg>compat" o un controllo diretto dei record tramite "pkg>Foo 0.4,0.5", che può caricare i record correnti tramite il completamento tramite tab. Cioè "pkg> compat Fo " viene aggiornato automaticamente a "pkg>Foo 0.4,0.5" per consentire la modifica di una voce esistente.
    • Pkg ora tenta di scaricare pacchetti da un server dei pacchetti solo se il server sta monitorando il registro contenente il pacchetto.
    • Pkg.instantiate ora emetterà un avviso quando Project.toml non è sincronizzato con Manifest.toml. Lo fa in base a un hash dei record deps e compat del progetto (gli altri campi vengono ignorati) nel manifest durante la risoluzione, in modo che qualsiasi modifica ai deps o ai record compat Project.toml possa essere rilevata senza dover essere nuovamente risolti.
    • Se "pkg>add" non riesce a trovare un pacchetto con il nome indicato, ora suggerirà pacchetti con nomi simili che possono essere aggiunti.
    • La versione di Julia memorizzata nel manifest non include più il numero di build, il che significa che master verrà ora scritto come 1.9.0-DEV.
    • L'interruzione del test "pkg>" verrà ora rilevata in modo più coerente e verrà restituita correttamente al REPL.
  • Utilità interattive
    • Nuova macro @time_imports per segnalare il tempo impiegato nell'importazione dei pacchetti e le relative dipendenze, evidenziando il tempo di compilazione e ricompilazione come percentuale delle importazioni.
  • Algebra lineare
    • Il sottomodulo BLAS ora supporta le funzioni BLAS spr! di livello 2.
    • La libreria standard LinearAlgebra.jl è ora completamente indipendente da SparseArrays.jl, sia dal punto di vista del codice sorgente che dei test unitari. Di conseguenza, gli array sparsi non vengono più restituiti (implicitamente) dai metodi di LinearAlgebra applicati a oggetti Base o LinearAlgebra. In particolare, ciò porta alle seguenti modifiche sostanziali:
      • Le concatenazioni che utilizzano matrici speciali "sparse" (ad esempio diagonali) ora restituiscono matrici dense; Di conseguenza, i campi D1 e D2 degli oggetti SVD creati dalle chiamate getproperty sono ora matrici dense.
      • Il metodo similar(::SpecialSparseMatrix, ::Type, ::Dims) restituisce una matrice nulla densa. Di conseguenza, i prodotti di matrici tridiagonali a due, tre e simmetriche tra loro portano alla generazione di una matrice densa. Inoltre, la costruzione di matrici simili con tre argomenti da matrici speciali "sparse" da matrici (non statiche) ora fallisce a causa di "zero(::Type{Matrix{T}})".
  • Stampaf
    • %s e %c ora usano l'argomento textwidth per formattare la larghezza.
  • Profilo
    • La profilazione del carico della CPU ora registra i metadati inclusi thread e attività. Profile.print() ha un nuovo argomento groupby che consente di raggruppare thread, attività o sottothread/attività, attività/thread e argomenti di thread e attività per fornire filtri. Inoltre, la percentuale di utilizzo viene ora segnalata come complessiva o per thread, a seconda che il thread sia inattivo o meno in ciascun campione. Profile.fetch() include i nuovi metadati per impostazione predefinita. Per compatibilità con le versioni precedenti con consumatori esterni di dati di profilazione, è possibile escluderlo passando include_meta=false.
    • Il nuovo modulo Profile.Allocs consente di profilare le allocazioni di memoria. Viene registrata un'analisi dello stack del tipo e della dimensione di ciascuna allocazione di memoria e l'argomento sample_rate consente di ignorare un numero configurabile di allocazioni, riducendo il sovraccarico delle prestazioni.
    • La profilazione della CPU a durata fissa può ora essere eseguita dall'utente mentre le attività sono in esecuzione senza prima caricare il profilo e il report verrà visualizzato durante l'esecuzione. Su MacOS e FreeBSD, premi ctrl-t o chiama SIGINFO. Per altre piattaforme, attivare SIGUSR1, ovvero % uccisione -USR1 $julia_pid. Questo non è disponibile su Windows.
  • SOSTITUZIONE
    • RadioMenu ora supporta ulteriori scorciatoie da tastiera per la selezione diretta delle opzioni.
    • La sequenza "?(x, y" seguita dalla pressione di TAB visualizza tutti i metodi che possono essere chiamati con argomenti x, y, .... (Uno spazio iniziale impedisce di accedere alla modalità di aiuto.) "MyModule.?(x, y " limita la ricerca a "MyModule". Premendo TAB è necessario che almeno un argomento sia di tipo più specifico di Qualsiasi. Oppure utilizzare SHIFT-TAB invece di TAB per consentire qualsiasi metodo compatibile.
    • La nuova variabile globale err consente di ottenere l'ultima eccezione, simile al comportamento di ans con l'ultima risposta. L'immissione di err ristampa le informazioni sull'eccezione.
  • SparseArray
    • Spostato il codice SparseArrays dal repository Julia al repository SparseArrays.jl esterno.
    • Le nuove funzioni di concatenazione sparse_hcat, sparse_vcat e sparse_hvcat restituiscono un tipo SparseMatrixCSC indipendentemente dai tipi degli argomenti di input. Ciò si è reso necessario per unificare il meccanismo di incollaggio delle matrici dopo aver separato il codice LinearAlgebra.jl e SparseArrays.jl.
  • Registrazione
    • I livelli di registrazione standard BelowMinLevel, Debug, Info, Warn, Error e AboveMaxLevel vengono ora esportati dalla libreria Logging standard.
  • Unicode
    • Aggiunta la funzione isequal_normalized per verificare l'equivalenza Unicode senza costruire esplicitamente stringhe normalizzate.
    • La funzione Unicode.normalize ora accetta la parola chiave charttransform, che può essere utilizzata per fornire mappature di caratteri personalizzate, e viene fornita anche la funzione Unicode.julia_chartransform per riprodurre la mappatura utilizzata quando il parser Julia normalizza gli identificatori.
  • Test
    • '@test_throws "some message" triggers_error()' ora può essere utilizzato per verificare se il testo dell'errore visualizzato contiene un errore "some message", indipendentemente dal tipo di eccezione specifico. Sono supportate anche le espressioni regolari, gli elenchi di stringhe e le funzioni di corrispondenza.
    • @testset foo() ora può essere utilizzato per creare un set di test da una determinata funzione. Il nome del test case è il nome della funzione che viene chiamata. La funzione chiamata può contenere @test e altre definizioni @testset, anche per chiamate ad altre funzioni, mentre vengono registrati tutti i risultati intermedi dei test.
    • TestLogger e LogRecord vengono ora esportati dalla libreria Test standard.
  • distribuito
    • SSHManager ora supporta i thread di lavoro con un wrapper csh/tcsh tramite il metodo addprocs() e il parametro shell=:csh.
  • Altre modifiche
    • GC.enable_logging(true) può essere utilizzato per registrare ogni operazione di Garbage Collection con l'ora e la quantità di memoria raccolta.

Fonte: opennet.ru

Aggiungi un commento