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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Go
Golang.png
Парадигма: компільована, багатонитева, імперативна, структурована
Дата появи: 2009
Творці: Роберт Гризмер, Роб Пайк і Кен Томпсон
Розробник: Google
Останній реліз: 1.3 (18 червня 2014; 75 днів тому)
Система типізації: сувора статична
Основні реалізації: gc (8g, 6g, 5g), gccgo
ОС: Linux, Mac OS X, Windows
Ліцензія: BSD
Сторінка інтернет: golang.org

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

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

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

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

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

Go спроектований для швидкого компілювання, навіть на застарілому обладнанні.[4] Ця мова підтримує прибирання сміття. Чітка паралельно-орієнтована структура Go (канали альтернативний каналам вводу даних) позичені з Tony Hoare's CSP. На відміну попередніх паралельно-орієнтованих мов програмування, таким як occam чи Limbo, Go не надає будь-якої вбудованої підтримки попереджень безпеки чи перевірки паралельності.[5] На сьогодні Go не має ніякої вбудованої підтримки шаблонів, але це може бути додано в майбутньому.[6]

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

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

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

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

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

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

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

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

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

Класичний приклад Hello world program на Go:

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

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

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

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 змінити назву мови для запобіганню конфлікту з іменем його мови програмування.[13] Попри те що McCabe не має торгової марки на назву, дехто з коментаторів закликав Google у відповідь на запит McCabe змінити назву. Цей питання було закрите 12 жовтня 2010 з статусом "Unfortunate" (невдалий), розробник з Google прокоментував закриття як "Існує багато комп'ютерних продуктів та сервисів з найменуванням Go. За 11 місяців з нашого релізу, була мінімальна кількіть випадків зі сплутуванням цих двох мов".[14]

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

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

Виноски[ред.ред. код]

  1. Google-go-language
  2. а б в Language Design FAQ
  3. інструкція по встановленню go
  4. Rob Pike. The Go Programming Language (flv) [Tech talk]. Google. Подія відбулася 8:53.
  5. «Модель пам'яті Go». Google. 23 Februari 2010. 
  6. Дискусія про шаблони в Go, golang-nuts, 18 Dec 2009, http://groups.google.com/group/golang-nuts/browse_thread/thread/801e9412de89baab/1a6e791e2dbf096b?q=generics&lnk=ol& 
  7. Нотатки до випуску, 3/30/2010
  8. «Пропозиція механізму обробки винятків». golang-nuts. 2010-03-25. Процитовано 2010-03-25. 
  9. «A Tutorial for the Go Programming Language». The Go Programming Language. Google. Архів оригіналу за 2013-07-09. Процитовано 2010-03-10. «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.» 
  10. «FAQ: Реалізація». golang.org. 2010-01-16. Архів оригіналу за 2013-07-09. Процитовано 2010-01-18. 
  11. «A Tutorial for the Go Programming Language». The Go Programming Language. Google. Архів оригіналу за 2013-07-09. Процитовано 2010-03-10. «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.» 
  12. «A Tutorial for the Go Programming Language». golang.org. 2010-01-16. Архів оригіналу за 2013-07-09. Процитовано 2010-01-18. 
  13. Claburn, Thomas (2009-11-11). «Google 'Go' Name Brings Accusations Of Evil'». InformationWeek. Процитовано 2010-01-18. 
  14. «Issue 9 - go - I have already used the name for *MY* programming language». Google Code. Google Inc. Архів оригіналу за 2013-07-09. Процитовано 2010-10-12. 
  15. «TIOBE Programming Community Index». Архів оригіналу за 2013-06-22. 

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