Rilascio del linguaggio di programmazione Go 1.19

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