Google Go - новый язык программирования

Выход нового языка программирования никогда не был громким событием, если только его не представляет известная компания. Впрочем, последнее уточнение можно отнести только к последним двум десятилетиям. Ранее этого срока языки программирования (ЯП) размножались как грибы после дождя. Причем все они довольно существенно отличались друг от друга.

Из пучин темного средневековья периода раннего зарождения компьютеров до сегодняшних дней по большому счету дожил только C. Все наиболее популярные современные ЯП основаны именно на его синтаксисе. Сразу вспоминаются следующие: C++, Java, PHP, C#. Ну и немного особняком стоит Pascal, который получил свое продолжение в Delphi. Тем не менее, Delphi все же не так распространен, как остальные, так что его формально можно оставить в стороне.

Хотя с другой стороны синтаксис Pascal частично применяется и в современных языках. Ну вот к примеру в C#, или Google Go. В последнем его так вообще немеряно. Но об этом позже. Сейчас пойдет речь о том, как компания Google решила захватить весь мир. Все началось с простого поиска. Оказалось, что интернету именно его и не хватает. Фигня вопрос — нате пожалуйста.

После того как денег хватило не только на самоокупаемость, но и на исследования и развитие, мы увидели Google Earth, Google Docs, Google [еще чего-то там]. Самые яркие продукты Гугла — это, конечно, операционная система Android, браузер Chrome и ОС для нетбуков Chrome OS. Ну и вот теперь язык программирования Google Go.


Возникает сразу вопрос: зачем он надо, если и без него, в принципе, неплохо? А причина все та же — средств достаточно не только на зарплату, но и на исследование тех направлений, что принесут прибыль не только в ближайшем будущем. Вообще Google Go разрабатывался два года, а по началу он вообще начинался как "20-процентный проект", то есть сотрудники компании отдавали на него 20% того времени, что уделялось на экспериментальные разработки.

Так почему все же начали работать над новым ЯП? По словам Роба Пайка, инженера Google, они хотели сделать что-то с нуля, а не дорабатывать уже существующие языки. Хотелось заново все спроектировать, продумав базовые основы. В общем понятно, группа программистов просто решила сделать "язык своей мечты". Что же, Google себе это вполне может позволить.

Так что такое Google Go? Прежде всего это обычный язык, который на выходе выдает исполняемые файлы. То есть он работает так же, как и компиляторы C/C++. Это несколько отходит от современной тенденции применения LLVM (Low-Level Virtual Machine — виртуальная машина низкого уровня), когда после компиляции получается специальный байт-код, выполняемый виртуальной машиной. Преимущества LLVM заключаются в высокой переносимости кода — теоретически без перекомпиляции байт-код может быть исполнен под любой ОС, главное чтобы там была установлена виртуальная машина. Главный недостаток такого подхода очевиден — более низкая скорость работы приложений.

Ну и кроме того исходный код виртуальной машины как правило не раскрывается, так что многое зависит не только от собственных ошибок, но и от ошибок разработчиков LLVM. Так что можно (и нужно) обновлять не только программы, но и виртуальные машины. Сегодня наиболее распространенными из них являются Java VM и .NET Framework.

В общем Google решила пойти своим путем, позволив компилировать программы на Go нормальным образом. Уже даже выпущено три компилятора: 6g, 8g и Gccgo. Первые два созданы самой Google и отличаются только архитектурой: на выходе 6g получается 64-битный исполняемый файл, а на выходе 8g – 32-битный. Почему такие странные названия? Видимо, 6g произошло от "64-bit", а 8g от "x86".

Ну а Gccgo входит в состав GCC и является альтернативным компилятором. Как отмечается, работает он медленнее, но на выходе у него получается более качественный код. Google прямо-таки помешалась на скорости. Chrome действительно очень быстрый браузер, но его юзабилити под большим вопросом — на мой взгляд Opera более удобна для использования "из коробки". Так же и с компилятором — он, может, работает и быстро, но, полагаю, большинство программистов захочет получить на выходе более быстроработающую программу, чем сэкономить пару минут на компиляции. Видимо, 6g и 8g будут использоваться во время разработки, а Gccgo для получения финальной версии, которая и будет распространяться.

Теперь что касается синтаксиса. Идеальный язык программирования — это, конечно, хорошо, но таким станет тот, что будет иметь примерно следующий синтаксис: "а заколбаська ты мне вот сюда такую вот гламурненькую кнопочку, которую нажимаешь и появляется окошко с этим вот рисунком". Вот это идеальный ЯП, а все остальное — профанация ;). А если бы это все еще можно было не печатать, а диктовать... Ладно, вернемся в настоящее.

В общем от описанного "идеала" Google Go далек — за его основу взят... С! Хотя правильнее будет сказать, что за основу взят С++ - Go нельзя назвать классическим объектно-ориентированным языком, но кое-какие намеки на классы и объекты в нем имеются.

Давайте взглянем на простой пример:

package main

import "fmt"

func main() {
  fmt.Printf("Hello, world ")
}

Что же мы здесь видим? Ключевые слова package и import? Привет Java! Функция main? Привет С/С++! Нет точки с запятой в конце строки с операцией? Привет Basic, Ruby, Python и другие! Конечно, многие операторы используются вовсе не так, как в уже существующих языках. Ну вот пример посложнее:

func sum(a []int) int { // returns an int
  s := 0;
  for i := 0; i < len(a); i++ {
    s += a[i]
  }
  return s
}

s := sum(&[3]int{1,2,3}); // a slice of the array is passed to sum

Это уже интереснее. Имена типов данных позаимствовали из C++/Java, расположение их за именем переменной напоминает Pascal. И комментарии точно такие же, как и в C++. Оператор ":=", как оказалось, вовсе не присвоение "а-ля Pascal" – это короткая форма инициализации. Вот, к примеру, "s := 0;" можно записать как "var s = 0;". Цикл for явно пришел из C/C++, как и операторы инкремента и декремента. Да и return оттуда же.

Разбирать подробно разницу и сходства синтаксиса Go и C++ я не стану — про это подробно написано вот на этой странице. А список основных различий между языками все-таки приведу:

  • в Go нет классов в том смысле как они понимаются в C++: нет конструкторов и деструкторов, нет виртуальных функций (прощай, полиморфизм!), нет иерархии наследования. Зато есть интерфейсы (Java, привет опять), которые все это дело кое-как заменяют, даже шаблоны C++;
  • имеется так называемый "сборщик мусора" — механизм, удаляющий из памяти переменные, оставшиеся от закрытых функций (в Java и C# есть аналогичный механизм);
  • поддерживаются указатели, но нет адресной арифметики, как в C/C++;
  • массивы в Go представлены как свойства класса, то есть передавая массив по параметру функция получает не указатель на него, а точную копию. Хотя в Go чаше используются так называемые "доли" (slices) – своеобразный указатель на отдельные участки массивов;
  • строки поддерживаются на уровне языка (как и в Pascal, Java, C#, PHP и других);
  • на уровне языка также поддерживаются ассоциативные массивы (или хэш-таблицы). Аналогичные возможности предоставляет PHP;
  • хорошо поддерживается разбиение на несколько потоков (такая операция в Go носит название "goroutines"), а также каналы для обмена информации между ними — явно прослеживается ориентация на многопоточные приложения и параллельные вычисления, что хорошо для современных многоядерных компьютеров;
  • некоторые типы (ассоциативные массивы и каналы) передаются по ссылке, а не по значению;
  • в Go нет заголовочных файлов, но есть пакеты — в них объединяются несколько исходных файлов (опять привет из Java);
  • не поддерживается неявная конвертация типов;
  • не поддерживаются спецификаторы const и volatile;
  • вместо NULL используется nil (а тут привет Pascal).

Короче те же яйца, только в профиль. Google Go мне напоминает результат компьютерной генетики, когда группа программистов решила скрестить C/C++, Java, PHP и Pascal, а заодно добавить кое-каких удобных фич, вроде встроенной поддержки параллелизма. То есть вышло что-то вроде C++ для бедных облегченного варианта Java, на выходе которого получается не байт-код для виртуальной машины, а обычный исполняемый файл, ура-ура.

Google Go я желаю только удачи — вероятно, он займет свою нишу, особенно в задачах, где требуется распараллеливать вычисления. Но на данный момент я так и не смог выяснить как установить компилятор для Windows – ссылок на официальном сайте на него нет. Но есть инструкции как инсталлировать под Linux. Про среду разработки и говорить нечего.

Кроме того пока еще Google ни одного своего проекта не перевела на Go. Для наиболее ресурсоемких задач все также используется C++. Да и нет пока для Go такого богатства библиотек, как под другие языки. Так что новый ЯП ждет долгая дорога. Если Google продолжит его финансирование, может она и не оборвется на середине пути. Но в любом случае Go не выглядит как серьезный коммерческий продукт, конкурент современным языкам. Для сравнения достаточно вспомнить выход C# и .NET Framework — кроме LLVM была представлена большая библиотека классов, причем как для прикладной, так и для веб-разработки. А тут небольшой анонс и тишина на ближайшие пару лет. Вероятно. Поживем - увидим.

Теги: Java

Комментарии
Добавить комментарий

Введите имя:
Войти от:
или
Ваш комментарий:


Введите код:

E-mail (не обязательно)
Адрес электронной почты не предназначен к показу и будет использован только для уведомлений об ответах



Обзор Android 9.0
Все об изменениях в Android 9
15 июля 2018 / 3
Обзор Samsung Galaxy J6 (2018)
Недорогой смартфон с вытянутым экраном
8 июля 2018 / 1
iOS 13. Первый взгляд
Что будет в iOS 13
3 июля 2018 /
Обзор Samsung Galaxy A6+ (2018)
Улучшенный вариант Galaxy A6
17 июня 2018 /
Обзор iOS 12
Изменений в системе немного, но обещают стабильность
9 июня 2018 /
 
 
Производитель чехлов Sanfeng выложил снимки бампера
Они будут аналогом Apple AirPods
В августе-ноябре они получат обновление GPU Turbo
Приложение станет одинаковым на всех платформах
Facebook тестирует синхронизацию между сервисами
Сторонний разработчик создал плагин с поддержкой Timeline
 
 

Опрос

Какими картами вы пользуетесь?
или оставить собственный вариант в комментариях





Статистика