Viene presentata la versione del linguaggio di programmazione Go 1.19, sviluppato da Google con la partecipazione della comunità come soluzione ibrida che combina le elevate prestazioni dei linguaggi compilati con i vantaggi dei linguaggi di scripting come la facilità di scrittura del codice , velocità di sviluppo e protezione dagli errori. Il codice del progetto è distribuito sotto la licenza BSD.
La sintassi di Go si basa su elementi familiari del linguaggio C con alcuni prestiti dal linguaggio Python. Il linguaggio è abbastanza conciso, ma il codice è facile da leggere e comprendere. Il codice Go viene compilato in file eseguibili binari separati che vengono eseguiti in modo nativo, senza utilizzare una macchina virtuale (moduli di profilazione, debug e altri sottosistemi di rilevamento dei problemi di runtime sono integrati come componenti di runtime), il che consente prestazioni paragonabili ai programmi C.
Il progetto è inizialmente sviluppato con un occhio alla programmazione multi-thread e al funzionamento efficiente su sistemi multi-core, inclusa la fornitura di mezzi a livello operatore per organizzare il calcolo parallelo e l'interazione tra metodi eseguiti in parallelo. Il linguaggio fornisce inoltre una protezione integrata contro i blocchi di memoria sovraallocati e offre la possibilità di utilizzare un garbage collector.
Tra le novità della nuova release:
- È stato fatto del lavoro per affinare il supporto per funzioni e tipi generici (generici) aggiunti nell'ultima versione, con l'aiuto dei quali uno sviluppatore può definire e utilizzare funzioni progettate per funzionare con diversi tipi contemporaneamente. È stata effettuata l'ottimizzazione: le prestazioni di alcuni programmi che utilizzano farmaci generici sono aumentate del 20%.
- I commenti di documentazione hanno aggiunto il supporto per collegamenti, elenchi e una sintassi più semplice per definire le intestazioni. L'utilità gofmt fornisce una formattazione che tiene conto delle funzionalità estese dei commenti con la documentazione API.
- Il modello di memoria per il linguaggio Go è stato rivisto per essere coerente con i modelli dei linguaggi C, C++, Java, JavaScript, Rust e Swift che non supportano valori atomici coerenti sequenziali. Per semplificare l'uso dei valori atomici, il pacchetto sync/atomic offre nuovi tipi come atomic.Int64 e atomic.Pointer[T]. La modifica del modello di memoria non ha influito sulla compatibilità con il codice scritto in precedenza.
- Per migliorare la sicurezza, il modulo os/exec ora non prende in considerazione i percorsi relativi quando si espande la variabile d'ambiente PATH (ad esempio, quando si determina il percorso di un file eseguibile, la directory corrente non viene più controllata).
- Il garbage collector ora ha la capacità di definire limiti di memoria flessibili, che vengono applicati limitando la dimensione dell'heap e restituendo la memoria al sistema in modo più aggressivo, ad es. Non è garantito che il consumo rientri nei limiti specificati in tutte le condizioni. I limiti flessibili possono essere utili per ottimizzare i programmi in esecuzione in contenitori con una dimensione di memoria fissa.
- Aggiunto un nuovo vincolo di build "unix" che può essere utilizzato nelle righe "go:build" per filtrare i sistemi simili a Unix (aix, android, darwin, dragonfly, freebsd, hurd, illumos, ios, linux, netbsd, openbsd, solaris ).
- Sono state implementate numerose ottimizzazioni delle prestazioni. Aggiunto supporto per l'impostazione dinamica della dimensione dello stack coroutine per ridurre la dimensione dei dati copiati. Sui sistemi Unix è stato implementato l'uso automatico di descrittori di file aggiuntivi (aumentando il limite RLIMIT_NOFILE). Per velocizzare le espressioni di switch di grandi dimensioni sui sistemi x86-64 e ARM64, vengono utilizzate tabelle di salto, che consentono di elaborare espressioni di switch di grandi dimensioni fino al 20% più velocemente. Sui sistemi riscv64, gli argomenti delle funzioni vengono passati attraverso i registri della CPU, il che consente un aumento delle prestazioni di circa il 10%.
- Aggiunto supporto sperimentale per ambienti Linux su sistemi con processori Loongson basati sull'architettura LoongArch a 64 bit (GOARCH=loong64).
Fonte: opennet.ru
