Go (мова програмування)

Go
Парадигма компільована, багатониткова, імперативна, структурована
Дата появи 2009
Творці Роберт Гризмер, Роб Пайк і Кен Томпсон
Розробник Google
Останній реліз 1.20 (1 лютого, 2023; 14 місяців тому (2023-02-01))
Система типізації сувора статична
Основні реалізації gc (8g, 6g, 5g), gccgo
Під впливом від С, Pascal / Modula / Oberon, CSP / Newsqueak / Limbo[1]
Операційна система NetBSD, OpenBSD, FreeBSD, Linux, Mac OS X, Windows, Android
Ліцензія BSD
Звичайні розширення файлів .go
Вебсайт golang.org

Goкомпільована мова програмування із вбудованими засобами для паралельних обчислень і засобами віддаленого керування пакунками. Цю мову програмування розробив Google[2] як частину проєкту з розробки операційної системи Inferno.[джерело?] Початкова розробка Go почалася у вересні 2007 року, а безпосередньо проєктували її Роберт Гризмер, Роб Пайк і Кен Томпсон[3]. Офіційно мову представили у листопаді 2009 року.

Підтримка мови здійснюється для операційних систем Linux, Android[4], Mac OS X та Windows[5].

Опис[ред. | ред. код]

Метою створення проєкту Go було бажання отримати мову, що поєднує високу продуктивність компільованих мов з легкістю написання коду, швидкістю розробки і захищеністю від помилок, властивих скриптовим мовам. Синтаксис Go базується на звичних елементах мови Сі з окремими запозиченнями з мови Python. Мова досить лаконічна, але при цьому код залишається легким для читання і сприйняття. Проєкт від початку розробляється з оглядкою на багатониткове програмування та ефективну роботу на багатоядерних системах, в тому числі надаючи реалізовані на рівні операторів засоби для організації паралельних обчислень та взаємодії між паралельно виконуваними методами.

Мова надає вбудовані засоби захисту від виходу за допустимі області виділених блоків пам'яті і забезпечує можливість використання збирача сміття. При цьому код мовою Go компілюється у відокремлені бінарні виконувані файли, що виконуються нативно без використання віртуальної машини (модулі профілювання, зневадження та інші підсистеми виявлення проблем на етапі виконання інтегруються у вигляді runtime-компонентів), що дозволяє домогтися продуктивності порівнянної з програмами на мові Сі .

Синтаксис Go дуже схожий на синтаксис С: блоки коду в фігурних дужках; загальна структура керування виконанням програми включає for, switch та if. На відміну від C, крапка з комою в кінці рядка не є обов'язковою; оголошення змінних відбувається по-іншому; перетворення типів строге; нові інструкції go та select було введено для підтримки паралельного програмування. Нові вбудовані типи включають хеш-таблиці, рядки Unicode, slices-масиви та канали для передачі даних між нитками.

Go спроєктований для швидкого компілювання, навіть на застарілому обладнанні.[6] Ця мова підтримує прибирання сміття. Чітка паралельно-орієнтована структура Go (канали є альтернативою каналам вводу даних) запозичені з Communicating Sequential Processes Тоні Гоара. На відміну попередніх паралельно-орієнтованих мов програмування, таким як occam чи Limbo, Go не надає будь-якої вбудованої підтримки попереджень безпеки чи перевірки паралельності.[7] На сьогодні Go не має ніякої вбудованої підтримки шаблонів, але це може бути додано в майбутньому.[8]

З функцій, доступних в C++ або Java, Go не включає в себе успадкування типів, узагальнене (шаблонне) програмування, твердження (assert), перевизначення методів, арифметичні операції над вказівниками.[3] Автори Go підкреслюють відкритість шаблонному програмуванню, явно виступають проти асертів та арифметичних операцій над вказівниками, у той час схильні дозволити успадкування типів для більшої зручності мови.[3] Спочатку мова не включала обробку винятків, але в березні 2010 було реалізовано механізм, відомий як panic/recover для обробки помилок і винятків, для уникнення проблем з винятками, з якими зіткнулись автори.[9][10]

Видимість функцій за межами файлу, де вони визначені, визначається неявно за капіталізацією їхніх ідентифікаторів, на відміну від C++, де використовується ключове слово public.[11]

Паралельність[ред. | ред. код]

Go надає goroutines, маленькі легкі нитки (ім'я співзвучне з coroutine (співпрограма) в англійській мові). "Goroutine" створюються командою go з анонімних чи звичайних функцій. "Goroutine" виконуються в паралель між собою, включно з функцією, яка їх викликала. Їм немає потреби запускатися в окремих нитках, але їхні групи збираються в декілька ниток — передавання керування між ними здійснюється блокуванням їх при отриманні чи передаванні повідомлень через канали.

Реалізація[ред. | ред. код]

На цей час існує два компілятори Go. Перший 6g/8g/5g (компіляція для AMD64, x86, та ARM відповідно) та підручні засоби відомі як 'gc', що базуються на попередній роботі Кена Томпсона над Plan 9's C toolchain. А також gccgo, фронтенд для GCC написаний на C++.[12]

Обидва компілятори працюють на Unix-подібних системах, порт для Microsoft Windows для gc було додано в основний пакет, більшість стандартних бібліотек також вже працюють під Windows.

Також існує 'tiny' середовище виконання, що дозволяє програмам на Go працювати на "голому залізі".

Приклад[ред. | ред. код]

Класичний приклад програми "Hello world!" на Go:

package main  import "fmt"  func main() { 	fmt.Println("Привіт, світе!") } 

Автоматичне вставновлення крапки з комою в Go потребує дотримання певного стилю кодування: відкриті лапки не повинні розміщуватись на окремих рядках, тому доречно використовувати так званий brace style; Дивіться приклад.[13]

Приклад Go програми на зразок команди Unix echo:[14]

package main  import ( 	"os" 	"flag" // парсер командного рядка )  var omitNewline = flag.Bool("n", false, "Не друкувати фінальний перенос рядка")  const ( 	Space   = " " 	Newline = "\n" )  func main() { 	flag.Parse() // Сканує командний рядок та встановлює прапорець 	var s string = "" 	for i := 0; i < flag.NArg(); i++ { 		if i > 0 { 			s += Space 		} 		s += flag.Arg(i) 	} 	if !*omitNewline { 		s += Newline 	} 	os.Stdout.WriteString(s) } 

Конфуз з назвою[ред. | ред. код]

В день офіційного релізу Go Francis McCabe, розробник мови програмування Go![en], попросив Google змінити назву мови для запобігання конфліктові з назвою його мови програмування.[15] Попри те що McCabe не має торгової марки на назву, дехто з коментаторів закликав Google у відповідь на запит McCabe змінити назву. Це питання було закрите 12 жовтня 2010 з статусом "Unfortunate" (невдалий), розробник з Google прокоментував закриття як "Існує багато комп'ютерних продуктів та сервісів з найменуванням Go. За 11 місяців із нашого релізу була мінімальна кількість випадків зі сплутуванням цих двох мов".[16]

Популярність[ред. | ред. код]

Go увійшла в TIOBE Programming Community Index[17] на 15 місце в свій перший рік, посунувши усталені мови, такі як Pascal. На 14 липня 2017, вона займає 10-ту сходинку індексу.

Застосування[ред. | ред. код]

На Go написано багато відкритого програмного забезпечення:[18]

  • Caddy[en], HTTP/2 сервер з автоматичною підтримкою HTTPS.
  • Docker, інструментарій для роботи з контейнерами Linux
  • Hugo, генератор статичних сайтів
  • InfluxDB, високопродуктивна база даних часових рядів.
  • Kubernetes, система керування контейнерами

Примітки[ред. | ред. код]

  1. What are Go's ancestors?. Архів оригіналу за 3 травня 2020. Процитовано 3 травня 2018.
  2. Google-go-language. Архів оригіналу за 7 січня 2019. Процитовано 13 жовтня 2010.
  3. а б в Language Design FAQ. Архів оригіналу за 18 серпня 2010. Процитовано 13 жовтня 2010.
  4. http://blog.golang.org/go1.4 [Архівовано 11 грудня 2014 у Wayback Machine.]: The most notable new feature in this release is official support for Android.
  5. інструкція по встановленню go. Архів оригіналу за 20 березня 2012. Процитовано 13 жовтня 2010.
  6. Rob Pike (10 листопада 2009). The Go Programming Language (flv) (Tech talk). Google. Подія сталася на 8:53.
  7. Модель пам'яті Go. Google. 23 Februari 2010. Архів оригіналу за 23 листопада 2010. Процитовано 13 жовтня 2010.
  8. Дискусія про шаблони в Go, golang-nuts, 18 Dec 2009
  9. Нотатки до випуску, 3/30/2010. Архів оригіналу за 3 вересня 2010. Процитовано 13 жовтня 2010.
  10. Пропозиція механізму обробки винятків. golang-nuts. 25 березня 2010. Архів оригіналу за 17 травня 2011. Процитовано 25 березня 2010.
  11. A Tutorial for the Go Programming Language. The Go Programming Language. Google. Архів оригіналу за 8 липня 2013. Процитовано 10 березня 2010. In Go the rule about visibility of information is simple: if a name (of a top-level type, function, method, constant or variable, or of a structure field or method) is capitalized, users of the package may see it. Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared.
  12. FAQ: Реалізація. golang.org. 16 січня 2010. Архів оригіналу за 8 липня 2013. Процитовано 18 січня 2010.
  13. A Tutorial for the Go Programming Language. The Go Programming Language. Google. Архів оригіналу за 8 липня 2013. Процитовано 10 березня 2010. The one surprise is that it's important to put the opening brace of a construct such as an if statement on the same line as the if; however, if you don't, there are situations that may not compile or may give the wrong result. The language forces the brace style to some extent.
  14. A Tutorial for the Go Programming Language. golang.org. 16 січня 2010. Архів оригіналу за 8 липня 2013. Процитовано 18 січня 2010.
  15. Claburn, Thomas (11 листопада 2009). Google 'Go' Name Brings Accusations Of Evil'. InformationWeek. Архів оригіналу за 22 липня 2010. Процитовано 18 січня 2010.
  16. Issue 9 - go - I have already used the name for *MY* programming language. Google Code. Google Inc. Архів оригіналу за 8 липня 2013. Процитовано 12 жовтня 2010.
  17. TIOBE Programming Community Index. Архів оригіналу за 22 червня 2013. Процитовано 13 жовтня 2010.
  18. avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software, архів оригіналу за 6 грудня 2017, процитовано 10 січня 2018

Посилання[ред. | ред. код]