За какво наистина е добър езикът Go?

По време на своите девет и повече години в дивата природа, езикът Go на Google, известен още като Golang - с версия 1.13 от септември 2019 г. - се превърна от любопитство към алфа гийкове до проверен в битки език за програмиране зад някои от най-важните в света облачно-ориентирани проекти. 

Защо Go беше избран от разработчиците на такива проекти като Docker и Kubernetes? Какви са определящите характеристики на Go, по какво се различава от другите езици за програмиране и какви видове проекти е най-подходящ за изграждане? В тази статия ще изследваме набора от функции на Go, оптималните случаи на използване, пропуските и ограниченията на езика и къде Go може да се движи оттук.

Go езикът е малък и прост

Go, или Golang, както често го наричат, е разработен от служители на Google - главно дългогодишният гуру на Unix и известният инженер на Google Роб Пайк - но това не е строго казано „проект на Google“. По-скоро Go е разработен като ръководен от общността проект с отворен код, ръководен от ръководство, което има силни мнения за това как Go трябва да се използва и посоката, в която трябва да поеме езикът.

Go е предназначен да бъде лесен за учене, лесен за работа и лесен за четене от други разработчици. Go няма голям набор от функции, особено в сравнение с езици като C ++. Go напомня на C в своя синтаксис, което улеснява сравнително лесното обучение на дългогодишни разработчици на C. Въпреки това, много функции на Go, особено неговите паралелни и функционални функции за програмиране, се връщат към езици като Erlang.

Като език, подобен на C, за изграждане и поддържане на различни платформи за корпоративни приложения от всякакъв вид, Go има много общо с Java. И като средство за бързо развитие на код, който може да работи навсякъде, можете да направите паралел между Go и Python, въпреки че разликите са далеч по-големи от приликите.

Go език има по нещо за всеки

Документацията на Go описва Go като „бърз, статично въведен, компилиран език, който се чувства като динамично въведен, интерпретиран език“. Дори голяма програма Go ще се компилира за секунди. Освен това Go избягва голяма част от режийните разходи в стил C, включително файлове и библиотеки.

Go улеснява живота на разработчика по редица начини:

  • Удобство.  Go е сравняван със скриптовите езици като Python в способността му да задоволи много често срещани нужди от програмиране. Част от тази функционалност е вградена в самия език, като „goroutines“ за едновременност и подобно на нишки поведение, докато допълнителни възможности са налични в стандартните библиотечни пакети на Go, като http пакета на Go. Подобно на Python, Go предоставя възможности за автоматично управление на паметта, включително събиране на боклук.

    За разлика от скриптовите езици като Python, Go кодът се компилира в бързо работещ роден двоичен файл. И за разлика от C или C ++, Go се компилира изключително бързо - достатъчно бързо, за да накара работата с Go да се чувства по-скоро като работа със скриптов език, отколкото компилиран език. Освен това системата за изграждане Go е по-малко сложна от тази на други компилирани езици. Отнема няколко стъпки и малко счетоводство, за да се изгради и стартира проект Go.

  • Скорост.  Двоичните файлове на Go работят по-бавно от техните аналози на C, но разликата в скоростта е незначителна за повечето приложения. Ефективността на Go е толкова добра, колкото C за по-голямата част от работата, и обикновено много по-бърза от другите езици, известни със скоростта на разработка (например JavaScript, Python и Ruby).
  • Преносимост.  Изпълнимите файлове, създадени с инструментариума Go, могат да стоят самостоятелно, без външни зависимости по подразбиране. Веригата инструменти Go е достъпна за голямо разнообразие от операционни системи и хардуерни платформи и може да се използва за компилиране на двоични файлове в различни платформи.
  • Оперативна съвместимост.  Go предоставя всичко по-горе, без да жертва достъпа до основната система. Програмите Go могат да говорят с външни C библиотеки или да извършват местни системни повиквания. В Docker, например, Go интерфейси с ниско ниво функции на Linux, cgroups и пространства от имена, за да работи магия на контейнера.
  • Поддържа.  Инструментът Go е свободно достъпен като двоичен файл на Linux, MacOS или Windows или като контейнер на Docker. Go е включен по подразбиране в много популярни дистрибуции на Linux, като Red Hat Enterprise Linux и Fedora, което улеснява малко по-лесното разполагане на Go source на тези платформи. Поддръжката на Go също е силна в много среди за разработка на трети страни, от Microsoft Visual Studio Code до Komodo IDE на ActiveState.

Езикът Go Go работи най-добре

Нито един език не е подходящ за всяка работа, но някои езици са подходящи за повече работни места от други.

Go блести най-ярко за разработване на следните типове приложения:

  • Разпределени мрежови услуги. Мрежовите приложения живеят и умират от паралелност, а родните функции на паралелността на Go - предимно програми и канали - са много подходящи за такава работа. Следователно много Go проекти са за работа в мрежа, разпределени функции и облачни услуги: API, уеб сървъри, минимални рамки за уеб приложения и други подобни.
  • Облачно развитие. Функциите на Go за едновременност и работа в мрежа, както и високата му степен на преносимост, го правят подходящ за изграждане на приложения, използвани в облак. Всъщност Go е бил използван за изграждането на няколко крайъгълни камъка на изчислителните технологии в облака, включително Docker, Kubernetes и Istio.
  • Подмяна на съществуваща инфраструктура. Голяма част от софтуера, от който разчитаме за интернет инфраструктурата, остарява и се променя с експлойти. Пренаписването на такива неща в Go предоставя много предимства - по-добра безопасност на паметта, по-лесно внедряване на различни платформи и чиста кодова база за насърчаване на бъдещата поддръжка. Нов SSH сървър, наречен Teleport, и нова версия на Network Time Protocol се пишат в Go и се предлагат като заместители на техните конвенционални аналози.
  • Помощни програми и самостоятелни инструменти. Go програмите се компилират в двоични файлове с минимални външни зависимости. Това ги прави идеално подходящи за създаване на помощни програми и други инструменти, защото те стартират бързо и могат лесно да бъдат пакетирани за преразпределение.

Отидете на езиковите ограничения

Умният набор от функции на Go предизвика както похвали, така и критики. Go е проектиран да греши от страна на това, че е малък и лесен за разбиране, като някои функции са умишлено пропуснати. Резултатът е, че някои функции, които са често срещани в други езици, просто не са налични в Go - нарочно.

Една такава характеристика са генериците, които позволяват на функцията да приема много различни видове променливи. Go не включва генерични лекарства и управителите на езика са против добавянето им, тъй като генеричните лекарства биха компрометирали простотата на езика. Възможно е да се заобиколи това ограничение, но много разработчици все още сърбят да видят генерици, добавени към Go по някакъв начин. Повдигнато е поне едно предложение за внедряване на генерични лекарства в Go, но нищо не е поставено на камък.

Друг недостатък на Go е размерът на генерираните двоични файлове. Двоичните файлове на Go са статично компилирани по подразбиране, което означава, че всичко необходимо по време на изпълнение е включено в двоичното изображение. Този подход опростява процеса на изграждане и внедряване, но с цената на едно просто „Здравей, свят!“ с тегло около 1,5 MB на 64-битов Windows. Екипът на Go работи за намаляване на размера на тези двоични файлове с всяко следващо издание. Също така е възможно да се свият двоичните файлове на Go с компресия или чрез премахване на информацията за отстраняване на грешки на Go. Тази последна опция може да работи по-добре за самостоятелни разпределени приложения, отколкото за облачни или мрежови услуги, където наличието на информация за отстраняване на грешки е полезно, ако дадена услуга се провали.

Още една популяризирана функция на Go, автоматично управление на паметта, може да се разглежда като недостатък, тъй като събирането на боклук изисква определено количество обработка над главата. По дизайн Go не осигурява ръчно управление на паметта, а събирането на боклука в Go е критикувано, че не се справя добре с видовете натоварване на паметта, които се появяват в корпоративни приложения. Положителната страна е, че Go 1.8 носи много подобрения в управлението на паметта и събирането на боклука, които намаляват времето за забавяне. Разбира се, разработчиците на Go имат възможност да използват ръчно разпределение на паметта в разширение C или чрез библиотека за ръчно управление на паметта на трети страни.

Културата на софтуера около изграждането на богати графични интерфейси за приложения Go, като тези в настолни приложения, все още е разпръсната.

Повечето приложения на Go са инструменти на командния ред или мрежови услуги. Въпреки това, различни проекти работят за предоставяне на богати графични интерфейси за приложенията Go. Има обвързвания за рамките GTK и GTK3. Друг проект е предназначен да предостави интерфейси на платформата, въпреки че те разчитат на C обвързвания и не са написани в чист Go. И потребителите на Windows могат да изпробват разходка. Но в това пространство не се появи ясен победител или сигурен дългосрочен залог, а някои проекти, като например опит на Google да изгради крос-платформен GUI библиотека, отидоха встрани. Освен това, тъй като Go е независим от платформата по дизайн, малко вероятно е някой от тях да стане част от стандартния комплект пакети.

Въпреки че Go може да говори с местни системни функции, той не е предназначен за създаване на системни компоненти на ниско ниво, като ядра или драйвери на устройства, или вградени системи. В крайна сметка времето за изпълнение Go и събирачът на боклук за приложенията Go зависят от основната ОС. (Разработчиците, които се интересуват от авангарден език за този вид работа, може да разгледат езика Rust.)

Отидете на фючърсите на езика

Следващата фаза в разработката на Go може да се ръководи повече от желанията и нуждите на нейната база за разработчици, като хората на Go променят езика, за да се настанят по-добре тази аудитория, а не просто да водят с упорит пример. С други думи, Go може да придобие функциите, които първоначално не са били предназначени за него, като генерични лекарства.

Ясно е, че разработчиците на Golang искат тези неща. Проучването на потребителите за Go 2018 постави генеричните продукти сред първите три предизвикателства по пътя на по-широкото приемане на Go, заедно с по-добра зависимост и управление на пакети. А съществуващо предложение за GitHub за генерици остава активно като предложение за Go 2.x. Промени като тези могат да помогнат на Go да заеме по-централно място в развитието на предприятията, където Java, JavaScript и Python понастоящем са най-висши.

Дори и без големи промени, можем да очакваме засилено използване на Go за проекти за възстановяване на инфраструктура, съгласно замените за SSH и NTP, описани по-горе, и като част от многоезични проекти. 

Реализациите на трети страни на инструментариума Go също се разраснаха. ActiveGo на ActiveState предлага комерсиално поддържано издание на езика Go, а проектите LLVM и gccgo предоставят свободно лицензирани реализации на Go с отворен код чрез алтернативни вериги от инструменти.

И накрая, Go също така служи като основа за разработване на изцяло нови езици, въпреки че два примера за това престават да се развиват активно. Един пример беше езикът Have, който рационализира синтаксиса на Go, внедри някои от същите концепции по свой собствен начин и преобразува в Go за лесно изпълнение. Друг несъществуващ проект, Oden, използва асемблера и инструментариума на Go, за да компилира новопроектиран език, който взе допълнително вдъхновение от езици като Lisp и Haskell.

Този последен набор от проекти илюстрира един от начините всяка ИТ иновация да стане наистина революционна - когато хората я разделят и я преназначат, намирането на приложения, които нейните дизайнери никога не са планирали. Бъдещето на езика Go като хакерски проект тепърва започва. Но бъдещето му като основен език за програмиране вече е гарантирано, със сигурност в облака, където скоростта и простотата на Go улесняват развитието на мащабируема инфраструктура, която може да се поддържа в дългосрочен план.