Clojure, Erlang или Go?

09/05/2013

В начале года я начал интересоваться другими языками, в мой арсенал был нужен монстр, который будет быстро обрабатывать огромное количество данных. В поле зрения попали Clojure, Erlang и Go. Все три языка я изучил очень и очень поверхностно, но уже мог что-то ‘написать’.

Даже твит оставил, ждал помощи от комьюнити в выборе языка. За задачей далеко ходить не надо. Сейчас она решена с помощью NodeJS, тянет за собой 37 Кб кода для клиента и поддерживает fallback для веб сокетов. Проект не ориентирован на корпоративного клиента, потому старых браузеров будет очень мало, да и режим реального времени скорее как дополнительный функционал, если его не будет – не критично.

Для решения поставленной задачи в языке должны быть следующие библиотеки:

  • WebSocket
  • TCP (Unix) Socket
  • Redis

Задача простая:

  • Поддержка каналов: подписаться/отписаться/отправить сообщение
  • Коллбеки на подключение/отключение клиента у вебсокетов
  • В Редисе храним состояние пользователя онлайн/оффлайн

Реализовать это на NodeJS не составило труда, написал около 300 строк кода, использовал SockJS и websocket-multiplex для поддержки каналов.

Каждый из языков я изучал поверхностно, мог писать только с открытой документацией, примерно как script kiddie у кулхацкеров. Старался изучить не только язык, но и его философию, комьюнити, сторонние библиотеки. Я хочу поведать свое мнение о каждом из этих ЯП, вдруг это поможет мне определиться и будет полезным моему читателю. Писанина ниже не претендует на правильность, это лишь мои знания, буду рад за наставление на путь истинный.

Go

Иногда кажется что это компилируемый Python, язык сам по себе очень простой, необходимые библиотеки есть, его разрабатывают крутые ребята, уже используется в продакшне, а еще он компилируется в привычный бинарник, который работает почти везде.

Чтиво:

Erlang

Поддерживает модель акторов. «Программист не может написать идеальную программу» – философия процессов в Эрланге, следуя ей нам не надо отлавливать ошибки, если процесс завершился с ошибкой – мы плюем на это и забываем или перезапускаем процесс.

Хорошие статьи об Эрланге:

Clojure

Sexp – это круто, почему все его избегают? Это не точки и не запятые в Эрланге, скобочки делают код более выразительным и понятным, но к ним надо привыкнуть. Одно меня спугнуло – количество библиотек, их много, но почти все мертвы. Есть звезды типа Aleph или Ring, но первый тянет за собой кучу зависимостей, а второй не покрывает все требования поставленной задачи. Я очень долго искал рецепт для TCP сервера, в итоге в своей ‘софтине’ остановился на Aleph и теперь мне приходится ждать около 2-3 секунд перед запуском программы (там, видимо, много кода).

Почитать о языке:

Заключение

Сам больше склоняюсь к Go, он простой и Google. Clojure – красивый, функциональный, но еще развивается, в будущем обязательно возьмусь за него. Erlang под вопросом, язык мне понравился, нравится его работа с процессами (акторами).

А теперь я призываю вас к обсуждению, я с радостью выслушаю мнения разработчиков на этих языках, это поможет мне с выбором. Спасибо :)