[Из песочницы] Go vs Javascript. На чем писать IoT проекты
Какой язык программирования лучше для вашего IoT проекта? Ответ на этот вопрос неоднозначный и субъективный. Есть несколько аспектов, которые необходимо учитывать при рассмотрении этого вопроса: задачи, цели и потребности вашего проекта. Важную роль также играют ваши личные предпочтения, наличие и возможности квалифицированных разработчиков.
Существует мнение, что разработанный Google язык Golang, может в конечном итоге вытеснить JavaScript (или, лучше сказать, Node.js) из сферы IoT приложений. Правда ли суслик может победить в этой битве? Давайте подробнее рассмотрим, как Golang, так и JS, их преимущества и недостатки для IoT решений.
JavaScript
Языки программирования приходят и уходят, но похоже, что JavaScript останется надолго. Первоначально ненавидимый разработчиками, сегодня этот топовый язык программирования широко используется в Интернете вещей из-за его высокой ресурсоэффективности. Так как тема использования JavaScript в IoT приложениях достаточно обширная и может включать фронтенд, бэкенд и прочие этапы разработки, то давайте сузим ее до Node.js. Как известно, JavaScript — это язык, а Node.js — это программная платформа. Она позволяет устанавливать гибкое взаимодействие с устройствами ввода-вывода через свой API, а также подключать необходимые для решения задач библиотеки.
Node.js идеально подходит для управления сетями датчиков, радаров, маяков, микросистем и других подключаемых устройств. Кроме того, он отлично справляется с обработкой нескольких задач для поддержания взаимодействия между всеми этими IoT устройствами. Разработчики сходятся во мнении, что преимущества Node.js для программного IoT обеспечения — это простота использования и разумные требования к памяти.
Ведущие IoT компании, такие как Telefonica, Rightech и Salesforce IoT Cloud, продолжают внедрять Node.js в своих проектах, поэтому спрос на разработчиков JavaScript в ближайшее время, похоже, не упадет.
Golang
Go — это язык программирования с открытым исходным кодом. Он еще не так широко распространен, как JavaScript, но он уже успел захватить свой кусок IoT пирога. Подобно большинству платформ и языков программирования, он возник в результате неудовлетворенности разработчиков существующими решениями. Go создан для ускорения ввода в рабочий процесс новых разработчиков, поэтому одной из основных его особенностей являются, простота освоения, использования и чтения, то есть низкий порог входа для любого желающего начать разработку на незнакомом языке. Данный язык имеет сравнительно узкий набор функций, хотя он выигрывает в параллелизме и производительности.
Также к его особенностям относятся:
- Строгая типизация, типы данных устанавливаются на этапе компиляции, следовательно, их несоответствие можно отследить перед запуском;
- Так как язык более строгий в нем меньше громоздких конструкций и соответственно его легче читать;
- Данный язык активно используется при разработке инфраструктурного ПО вроде Docker, Kubernetes и т.д. Знание Go, при необходимости, позволит глубже изучить данные инструменты;
- Экосистема языка относительно молодая, то существует возможность обратиться к техподдержке разработчиков языка для решения проблемных моментов;
Программисты обычно выбирают Golang для построения коммуникационного уровня в системе IoT, поскольку параллелизм и возможность одновременного запуска ввода\вывода данных являются одними из ключевых преимуществ Go. Также этот язык отлично подходит для написания сервисов логирования и парсинга.
Другие не столь очевидные преимущества Go включают:
- инструменты: документирования — GoDoc и анализа кода — Race Detector;
- встроенный инструмент тестирования (если вы когда-либо пробовали выбрать фреймворк для тестирования проекта на JavaScript, вы понимаете выгоду);
- серьезный подход к параллельному программированию с помощью Data Race Detector;
- единое руководство по стилю для всех, которому нужно следовать, в отличие от множества инструментов и парадигм в JavaScript (они известны тем, что парализуют команду, когда пришло время принять решение о структуре, соглашениях, библиотеках тестирования и т. д.)
Сравним по отдельным критериям:
Как JavaScript, так и Go, похоже, хорошо подходят для IoT проектов. Поэтому давайте сравним функционал Node.js и Go, чтобы определить победителя.
Зрелость. Будучи относительно молодым, Go довольно зрелый язык, к тому же он изначально позиционировался как стабильный и обратно совместимый. Что касается Node.js, он имеет версию LTS (Long Time Support, долговременная поддержка), а также новейшую версию, которая имеет изменяющийся API, и обширное комьюнити, поддерживающее платформу.
Производительность.. В реальных условиях сетевого взаимодействия и взаимодействия с базой данных Go и Node.js показывают равные результаты.
Параллелизм. Здесь Go определенно выигрывает: он использует легкие потоки — goroutines, а Node.js унаследовал механизм цикла обработки событий JavaScript, который имеет свои недостатки.
Кривая обучения. Благодаря JavaScript, согласно недавнему опросу Node.js стал одним из самых быстрорастущих языков разработки. Причиной этому является проста освоения, обширная документация и большое открытое комьюнити. Go, также довольно легок в обучении. Опрос PW Engine показал, что большинство разработчиков считают его очень интуитивным, а это большой плюс если компании требуется как можно быстрее ввести новых сотрудников в рабочий процесс. Так что, здесь тоже ничья.
Обработка ошибок. Здесь мнения расходятся. Go использует явную проверку ошибок, в отличии от неявного try\catch. за счет этого проверок на ошибки становиться больше, но они понятней, так как находятся ближе к месту их возникновения и направлены на определение проблемы в конкретном месте, во второй версии Go обещают добавить check\handle. Node.js использует принцип try\catch, общий для многих языков, и обладающий определенными ограничениями.
Фронтенд и бэкенд. Go нацелен на разработку параллельных сервисов, поэтому он отлично подходит для серверной части. И хотя для Go есть фреймворки для создания веб-приложений, такие как Beego и gopherjs, гораздо удобнее создавать современный пользовательский интерфейс с JavaScript. К тому же исходя из факта, что JS господствует на фронтенде, то проще поддерживать и бэкенд и фронтенд на одном языке — JavaScript
Выбор разработчиков. Здесь нет сомнений: JavaScript остается наверху так как уже давно влился в рабочие процессы разработчиков во всем мире. Конечно, Go вошел в топ-20 самых популярных технологий, но, к сожалению, он по-прежнему далек от JavaScript с точки зрения популярности.
Sync/Async IO (синхронный/асинхронный ввод-вывод). Node.js славится своей неблокирующей моделью ввода-вывода, которая делает его легким и эффективным с точки зрения ресурсов. Но у него также есть недостатки, например, бесконечные обратные вызовы в коде и странные трассировки стека. С другой стороны, Go, используя свой планировщик, рекомендующий разработчикам использовать синхронные операции, опираясь на различные инструменты, предоставляемые ОС, для повышения эффективности и сокращения блокировки ресурсов.
Работа на устройствах. С менеджером пакетов NPM Node.js можно эффективно использовать в качестве среды программирования на одноплатниках, таких, как Raspberry Pi, Iskra Js или BeagleBone Black. NPM содержит около 80 пакетов с открытым исходным кодом для контроллеров Arduino, Intel IoT Edison, Raspberry Pi и более 30 пакетов для различных устройств и датчиков Bluetooth. Что касается Go, то он хорошо подходит плат Raspberry Pi, так как он запускает полную сборку Linux. Однако маломощные IoT-устройства, такие как Arduino, не могут работать с двоичным кодом Go. Вот почему был создан фреймворк Gobot. Он поддерживает множество платформ, Bluetooth LE устройств и даже интерфейс NeuroSky.
Библиотеки.По количеству библиотек JavaScript конечно же пока обходит своего оппонента, однако в определенных областях, например, в математике, для Go написаны более мощные инструменты по работе со сложной математикой и анализом данных.
Заключение
Golang — это компилируемый многопоточный язык программирования, который позволяет создавать целые системы подключенных контроллеров, и эффективно работать с базами данных. JavaScript идеально подходит для асинхронных операций, требующих низкого времени отклика. Сейчас эти два языка далеко не взаимозаменяемы. JavaScript остается самым популярным языком в мире, в том числе и конкретно в Интернете вещей. Он прочно удерживает свои позиции и вряд ли уступит Golang в ближайшем будущем. Однако, благодаря своему инновационному и надежному подходу, Go имеет очень яркие перспективы, чтобы возглавить топ технологий IoT разработки.