Wydanie języka programowania Go 1.18

Przedstawiono wydanie języka programowania Go 1.18, który jest rozwijany przez Google przy udziale społeczności jako rozwiązanie hybrydowe, łączące wysoką wydajność języków kompilowanych z takimi zaletami języków skryptowych, jak łatwość pisania kodu , szybkość rozwoju i ochrona przed błędami. Kod projektu jest rozpowszechniany na licencji BSD.

Składnia Go opiera się na znanych elementach języka C z pewnymi zapożyczeniami z języka Python. Język jest dość zwięzły, ale kod jest łatwy do odczytania i zrozumienia. Kod Go jest kompilowany do samodzielnych binarnych plików wykonywalnych, które działają natywnie bez użycia maszyny wirtualnej (moduły profilowania, debugowania i inne podsystemy wykrywania problemów w czasie wykonywania są zintegrowane jako komponenty środowiska wykonawczego), co pozwala na wydajność porównywalną z programami C.

Projekt jest początkowo rozwijany z myślą o programowaniu wielowątkowym i wydajnej pracy w systemach wielordzeniowych, w tym o zapewnieniu środków zaimplementowanych na poziomie operatora do organizowania obliczeń równoległych i interakcji między równolegle wykonywanymi metodami. Język zapewnia również wbudowaną ochronę przed przekroczeniem przydzielonych bloków pamięci oraz zapewnia możliwość korzystania z Garbage Collectora.

Nowa wersja dodaje obsługę funkcji i typów generycznych (generics), za pomocą których programista może definiować i wykorzystywać funkcje zaprojektowane do pracy z kilkoma typami jednocześnie. Możliwe jest również użycie interfejsów do tworzenia połączonych typów obejmujących wiele typów danych. Wsparcie dla typów generycznych jest realizowane bez przerywania kompatybilności wstecznej z istniejącym kodem. // Suma wartości ustawionych, działa dla typów int64 i float64 func SumIntsOrFloats[K porównywalne, V int64 | float64](m map[K]V) V { var s V for _, v := zakres m { s += v } return s } // Inna opcja z definicją typu ogólnego: type Number interfejs { int64 | float64 } func SumNumbers[K porównywalne, V Numer](m map[K]V) V { var s V for _, v := zakres m { s += v } return s }

Inne ulepszenia:

  • Narzędzia do testowania kodu fuzzingowego są zintegrowane ze standardowym zestawem narzędzi. Podczas testów fuzzingowych generowany jest strumień wszystkich możliwych losowych kombinacji danych wejściowych i rejestrowane są ewentualne awarie podczas ich przetwarzania. Jeśli sekwencja ulegnie awarii lub nie odpowiada oczekiwanej reakcji, wówczas takie zachowanie z dużym prawdopodobieństwem wskazuje na błąd lub lukę w zabezpieczeniach.
  • Dodano obsługę wielomodułowych obszarów roboczych, umożliwiając wykonywanie poleceń w wielu modułach jednocześnie, co pozwala na jednoczesne budowanie i uruchamianie kodu w wielu modułach.
  • Wprowadzono istotne optymalizacje wydajności dla systemów opartych na procesorach Apple M1, ARM64 i PowerPC64. Włączono możliwość używania rejestrów zamiast stosu do przekazywania argumentów do funkcji i zwracania wyniku. Ulepszone wbudowane rozwijanie pętli przez kompilator. Sprawdzanie typów w kompilatorze zostało całkowicie przeprojektowane. Niektóre testy wykazują 20% wzrost wydajności kodu w porównaniu do poprzedniej wersji, ale sama kompilacja trwa około 15% dłużej.
  • W czasie wykonywania zwiększono efektywność zwrotu zwolnionej pamięci do systemu operacyjnego i poprawiono działanie modułu zbierającego elementy bezużyteczne, którego zachowanie stało się bardziej przewidywalne.
  • Do biblioteki standardowej dodano nowe pakiety net/netip i debug/buildinfo. Obsługa protokołów TLS 1.0 i 1.1 jest domyślnie wyłączona w kodzie klienta. Moduł crypto/x509 przestał przetwarzać certyfikaty podpisane przy użyciu skrótu SHA-1.
  • Podwyższono wymagania dotyczące środowiska w Linuksie, do pracy wymagane jest teraz posiadanie jądra Linuksa w wersji co najmniej 2.6.32. W następnym wydaniu podobne zmiany spodziewane są dla FreeBSD (wsparcie dla gałęzi FreeBSD 11.x zostanie zakończone) i do działania wymagany będzie co najmniej FreeBSD 12.2.

Źródło: opennet.ru

Dodaj komentarz