Как стать автором
Обновить

Язык Go с точки зрения PHP-разработчика

Разработка веб-сайтов *
Go — это язык, придуманный Робертом Гризмером (Robert Griesemer), Робом Пайком и Кеном Томпсоном, который был анонсирован в ноябре 2009 с версиями под Linux и Mac OS X. Сейчас разработчики работают в Google, но и задолго до этого были очень известными и уважаемыми людьми (к примеру, кодировка UTF-8 была изобретена Томпсоном и Пайком для использования в качестве основной кодировки в Plan 9).

Лично я решил посмотреть, что это за язык после того, как тут опубликовали вот это видео выступления Роба Пайка. Я изучаю Go не очень долго, но даже за те две недели, что я потратил на его изучение, я успел сделать несколько проектов на нём, например backend для библиотеки JsHttpRequest (JsHttpRequest; мой backend на Go). Я до сих пор использую JsHttpRequest из-за её удобства (как со стороны JS, так и со стороны PHP). В статье я хочу рассказать исключительно о моих ощущениях после программирования на PHP и JavaScript, практически без примеров кода.

В двух словах о языке


Официальный сайт проекта — http://golang.org. Там есть краткий tutorial, описание языка и встроенных пакетов (packages), а также ссылки на Wiki, бенчмарки и на список сторонних пакетов.

Go — статически типизированный язык со сборщиком мусора, который по ощущениям похож как на Си, так и на Javascript (многие конструкции также напоминают другие языки, например Python, Pascal и Java). Go — это компилируемый язык, причём компилируемый в нативный исполняемый код (в отличие от Java и .NET) и по производительности он достаточно близок к Си.

У языка немного странноватый синтаксис (например, определение строки str выглядит как str string, а не string str, как почти во всех других языках), встроенная поддержка UTF-8, immutable strings (неизменяемые строки) и поддержка динамической типизации с помощью интерфейсов (не путать с интерфейсами в других ООП языках)

Примеров кода я буду приводить минимум — если хотите взглянуть на код на Go, рекомендую ознакомиться с туториалом.

Почему язык рассматривается с точки зрения PHP-разработчика, а не <Java, .NET, Ruby, Python, ...>?


Я невольно сравниваю с PHP потому, что я начинал программировать на PHP, до сих программирую на нём на протяжении порядка 7 лет с небольшими перерывами и мне хотелось увидеть какой-нибудь язык, который бы принципиально чем-то отличался от PHP, но при этом был пригоден для веба. Конечно, язык от Google второму критерию не может не удовлетворять, поэтому я решил обратить на него внимание :).

Не совсем корректно сравнивать PHP и Go, поскольку это языки различного назначения — они скорее дополняют друг друга, но я всё же решил сравнивать Go и PHP в той сфере, для которой PHP заточен — для создания веб-сайтов

Достоинства по сравнению с PHP


— Компилируемый язык со статической типизацией, что позволяет достичь превосходной производительности (в 10-100 раз быстрее, чем PHP)
— Как нельзя лучше подходит для написания системных утилит и демонов
— Исключение огромного числа runtime ошибок за счёт строгой типизации
— Исключительная поддержка Unicode и UTF-8: исходные тексты и строки обязательно в UTF-8, богатые встроенные механизмы для работы с UTF-8
— Отличные возможности многопоточного и параллельного программирования (concurrent and parallel)
— Тесная интеграция с API *nix-систем, грамотно организованные внутренние структуры данных для работы с системой и файлами
— Хорошая поддержка последних веб-стандартов, например WebSocket API

Недостатки по сравнению с PHP


— Недостаточная интеграция с Apache (только работа как standalone веб-сервер или FastCGI от сторонних разработчиков)
— Язык с не до конца устоявшимся синтаксисом и возможностями — некоторые проекты на Go, которым меньше года, уже не компилируются
— Отсутствие динамического подключения кода (невозможность загрузки и выгрузки, скажем, *.so-файлов на лету)
— Намного менее удобные в использовании динамические возможности
— Мало сторонних библиотек — кроме как к MySQL, PostgreSQL и NoSQL-базам не подключишься
— Отсутствие официальной поддержки Microsoft Windows®
— Желательно иметь опыт программирования на Си, чтобы лучше понимать семантику языка

Ощущения в целом


Go — это первый язык со статической типизацией, который я видел, где она не очень мешает программировать и не заставляет писать в 2-3 раза больше кода, чем на PHP или JavaScript. Также, Go компилируется в нативный код, и позиционируется как язык для написания системных утилит и демонов. Язык и компилятор не вызывают ощущения чего-то монстрообразного и неповоротливого, как Java или .NET (что, собственно, и является основной причиной, почему я не пишу на Java).

С другой стороны, чувствуется, что язык всё ещё бурно развивается (например, на моих глазах за один день нарисовался package под названием html, который появился почти сразу после того, как я скачал и установил себе Go-окружение, так что пришлось собирать его заново :)). Также, как замена PHP он подходит не очень хорошо, потому что для каждого хоста приходится писать целый веб-сервер и следить за тем, чтобы он случайно не упал :), а также нужно отдельно заморачиваться с запуском этих демонов при перезагрузке сервера, к примеру. Я молчу, что на виртуальном хостинге максимум, что у вас получится сделать на Go — это подключить свои CGI-обработчики на Go, что будет работать не сильно быстрее PHP, если будет работать быстрее вообще.

В целом, сам по себе язык и встроенныие библиотеки являются достаточно стабильными, чтобы Go можно было использовать на продакшне (например golang.org сам работает под управлением сервера на Go, а именно — это просто godoc, запущенный с ключиком -http="...:80"). Но, поскольку опыта в сетевом и системном программировании у меня не так много, как мне хотелось бы, я довольно часто натыкаюсь на ошибки в использовании библиотек, которых можно было бы избежать, если бы у меня был опыт сетевого программирования и написания демонов. Но, в целом, как мне кажется, если вы хотели изучать Java или ASP.NET, попробуйте лучше Go — вряд ли этот язык оставит вас равнодушным.
Теги:
Хабы:
Всего голосов 91: ↑57 и ↓34 +23
Просмотры 16K
Комментарии Комментарии 107