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

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

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

Підтримка мови здійснюється для операційних систем 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!, попросив 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, HTTP/2 сервер з автоматичною підтримкою HTTPS.
  • Docker, інструментарій для роботи з контейнерами Linux
  • Hugo, генератор статичних сайтів
  • InfluxDB, високопродуктивна база даних часових рядів.
  • Kubernetes, система керування контейнерами

Примітки

  1. What are Go's ancestors?. Процитовано 3 травня 2018.
  2. Google-go-language
  3. Language Design FAQ
  4. http://blog.golang.org/go1.4: The most notable new feature in this release is official support for Android.
  5. інструкція по встановленню go
  6. Rob Pike. The Go Programming Language (flv) [Tech talk]. Google. Подія відбулася 8:53.
  7. Модель пам'яті Go. Google. 23 Februari 2010.
  8. Дискусія про шаблони в Go. golang-nuts. 18 Dec 2009.
  9. Нотатки до випуску, 3/30/2010
  10. Пропозиція механізму обробки винятків. golang-nuts. 25 березня 2010. Процитовано 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. Процитовано 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. Процитовано 10 січня 2018.

Посилання

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.