Rilascio del linguaggio di programmazione Go 1.18

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

Aggiungi un commento