Viene presentata la versione del linguaggio di programmazione Go 1.18, 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 autonomi che vengono eseguiti in modo nativo senza utilizzare una macchina virtuale (profilazione, moduli di 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.
La nuova versione aggiunge il supporto per funzioni e tipi generici (generici), con l'aiuto dei quali uno sviluppatore può definire e utilizzare funzioni progettate per funzionare con più tipi contemporaneamente. È anche possibile utilizzare le interfacce per creare tipi combinati che si estendono su più tipi di dati. Il supporto per i generici viene implementato senza interrompere la compatibilità con le versioni precedenti con il codice esistente. // Somma i valori impostati, funziona per i tipi int64 e float64 func SumIntsOrFloats[K comparabile, V int64 | float64](m map[K]V) V { var s V for _, v := range m { s += v } return s } // Un'altra opzione con una definizione di tipo generica: type Number interfaccia { int64 | float64 } func SumNumbers[K confrontabile, V Numero](m map[K]V) V { var s V for _, v := range m { s += v } return s }
Altri miglioramenti:
- Le utilità per il test del codice fuzzing sono integrate nel toolkit standard. Durante il test fuzzing, viene generato un flusso di tutte le possibili combinazioni casuali di dati di input e vengono registrati eventuali errori durante la loro elaborazione. Se una sequenza si arresta in modo anomalo o non corrisponde alla risposta prevista, è molto probabile che questo comportamento indichi un bug o una vulnerabilità.
- Aggiunto supporto per aree di lavoro multimodulari, che consente di eseguire comandi su più moduli contemporaneamente, consentendo di creare ed eseguire simultaneamente codice in più moduli.
- Sono state apportate significative ottimizzazioni delle prestazioni per i sistemi basati sui processori Apple M1, ARM64 e PowerPC64. Abilitata la possibilità di utilizzare i registri anziché lo stack per passare argomenti alle funzioni e restituire il risultato. Migliorato lo srotolamento in linea dei loop da parte del compilatore. Il controllo del tipo nel compilatore è stato completamente riprogettato. Alcuni test mostrano un aumento del 20% nelle prestazioni del codice rispetto alla versione precedente, ma la compilazione stessa richiede circa il 15% in più.
- In runtime è stata aumentata l'efficienza nel restituire la memoria liberata al sistema operativo ed è stato migliorato il funzionamento del garbage collector, il cui comportamento è diventato più prevedibile.
- Nuovi pacchetti net/netip e debug/buildinfo sono stati aggiunti alla libreria standard. Il supporto per TLS 1.0 e 1.1 è disabilitato per impostazione predefinita nel codice client. Il modulo crypto/x509 ha interrotto l'elaborazione dei certificati firmati utilizzando l'hash SHA-1.
- I requisiti per l'ambiente Linux sono stati aumentati; per funzionare, ora è necessario avere un kernel Linux almeno della versione 2.6.32. Nella prossima versione, sono previsti cambiamenti simili per FreeBSD (il supporto per il ramo FreeBSD 11.x verrà interrotto) e per funzionare sarà necessario almeno FreeBSD 12.2.
Fonte: opennet.ru