Dopo sei mesi di sviluppo, è stato rilasciato il linguaggio di programmazione Go 1.26, sviluppato da Google con il supporto della comunità. Questo linguaggio combina l'alta performance tipica dei linguaggi compilati con i vantaggi dei linguaggi di scripting, come la semplicità nella scrittura del codice, la rapidità di sviluppo e la protezione dagli errori. Il codice del progetto è distribuito con licenza BSD.
La sintassi di Go si basa su elementi familiari del linguaggio C, con alcune influenze dal linguaggio Oberon. Il linguaggio è abbastanza conciso, ma il codice è facilmente leggibile e comprensibile. Il codice scritto in Go viene compilato in file binari eseguibili autonomi, eseguiti nativamente senza l'uso di una macchina virtuale (i moduli di profiling, debugging e altre sottosistemi di rilevamento dei problemi sono integrati come componenti runtime), il che consente di raggiungere prestazioni comparabili a quelle dei programmi scritti in C.
Il progetto è stato originariamente sviluppato tenendo presente la programmazione multithread e l'efficiente funzionamento su sistemi multiprocessore. Ad esempio, a livello di operatori, sono stati implementati strumenti per organizzare calcoli paralleli e interazioni tra metodi eseguiti in parallelo. Il linguaggio fornisce anche strumenti integrati per la protezione contro il buffer overflow e consente l'uso di un garbage collector.
Tra le novità della nuova versione:
- Il garbage collector "greenteagc" è abilitato per impostazione predefinita, progettato per migliorare le prestazioni nella creazione e scansione di oggetti di piccole dimensioni. Negli applicativi in cui viene utilizzato attivamente il garbage collector, l'uso di "greenteagc" porta a una riduzione dei costi associati al garbage collection del 10-40%.
- Nella funzione integrata new(), dedicata alla creazione di nuove variabili, è stata introdotta la possibilità di specificare un'espressione come operando, definendo il valore iniziale della variabile. Ad esempio, invece di scrivere il codice x := int64(300) ptr := &x ora si può scrivere: ptr := new(int64(300))
- Nei tipi generici è consentito riferirsi a se stessi come argomento nell'elenco dei propri parametri di tipo (è possibile passare il tipo al proprio parametro). Nella prima riga dell'esempio riportato di seguito, il riferimento `Adder` a se stesso non genera più un errore: type Adder[A Adder[A]] interface { Add(A) A } func algo[A Adder[A]](x, y A) A { return x.Add(y) }
- Le spese generali per chiamare funzioni in C dal codice Go tramite cgo sono diminuite di circa il 30%.
- Nel runtime su piattaforme a 64 bit è stata implementata la randomizzazione dello spazio degli indirizzi all'avvio, il che rende più difficile prevedere gli indirizzi nella memoria durante i tentativi di sfruttare vulnerabilità nel codice C coinvolto tramite cgo. Per disattivare la randomizzazione è stata proposta l'opzione «GOEXPERIMENT=norandomizedheapbase64».
- È stato ampliato il numero di situazioni in cui il compilatore assegna memoria per gli slice nello stack anziché nell'heap, il che ha un impatto positivo sulle prestazioni.
- L'implementazione del comando «go fix» è stata completamente riscritta utilizzando il pacchetto analysis, che offre funzionalità per l'analisi statistica del codice. È stato aggiunto il supporto per gli analizzatori disponibili nel pacchetto modernize, che forniscono correzioni per semplificare il codice tenendo conto delle nuove funzionalità del linguaggio e della libreria standard. È stato aggiunto un analizzatore «inline» per la diffusione inline di tutte le chiamate di funzione contrassegnate dalla direttiva «//go:fix inline».
- Sono stati aggiunti nuovi pacchetti crypto/hpke (implementazione di HPKE — Hybrid Public Key Encryption), crypto/mlkem/mlkemtest e testing/cryptotest.
- È stato aggiunto il pacchetto sperimentale simd/archsimd, che fornisce accesso a basso livello all'esecuzione di operazioni vettoriali utilizzando istruzioni SIMD su sistemi con architettura AMD64.
- È stato aggiunto il pacchetto sperimentale runtime/secret per la cancellazione sicura (azzero) della memoria temporanea allocata durante l'esecuzione della funzione specificata.
- È stato aggiunto il profilo sperimentale goroutineleak nel pacchetto runtime/pprof per rilevare perdite di goroutine.
Fonte: opennet.ru
