3 альтернативы Javascript

Многие ненавидят джаваскрипт, но в браузере-то больше ничего нет! Или есть? Сегодня рассмотрим три альтернативы джаваскрипту, которые успешно работают в браузере. И я говорю не про тайпскрипт.

В этой статье мы сравним три языка:

  • Elm
  • ClojureScript
  • ReasonML

Так как все три языка на удивление оказались функциональными, то и годность языка будем измерять в монадках.

Сравнивать языки мы будем по пяти параметрам: легкость установки, идеология, взаимодействие с джаваскриптом, сообщество и компания спонсор.

  1. Начнем с установки
    • Проще всего установить Reason: npm install bs-platform а так как npm установлен на компе любого Алёшки, то за простоту установки Reason получает заслуженную монадку.
    • Elm https://guide.elm-lang.org/install/elm.html установить чуть сложнее, нужно скачать установщик и запустить его. В документации есть отдельный раздел как это сделать поэтому элм получает пол монадки за документацию.
    • ClojureScript не получает ни одной монадки. Мало того, что нет явного раздела в документации, как его установить. Так и когда вы эту документацию найдете, то вас попросят установить Clojure, что может немного сбить с толку неподготовленного сеньора, поэтому Clojurescript не получает ни одной монадки. https://clojurescript.org/news/2018-03-26-clojurescript-command-line
  2. Когда мы разобрались с установкой, самое время разобраться нафига мы это сделали. Что такого нам обещают эти языки, чего нет в джаваскрипте.
    • Первым рассмотрим предвыборные обещания языка Elm. Элм нам обещает что наш код никогда не свалится с ошибкой у наших пользователей. И элм таки свое обещание выполняет. Чего стоит опыт компании No Red Ink, 2 года без единого разрыва. Почти.За это элм получает просто монадищу! Две монадки элму!

      Screenshot_2020-05-02_at_18.34.48.png

    • Reason же обещает, что мы будем писать простой, быстрый и качественный типизированный код используя мощь обеих экосистем Javascript и OCaml. Конечно я хочу писать простой, быстрый и качественный код, но как то слабо верится, что это возможно. К тому же мне ничего не известно про мощь экосистемы Ocaml. Это предвыборное обещание не покупает языку Reason ни одной монадки, увы.
    • ClojureScript говорит, что Javascript очень неказистый язык и не подходит для сложных современных фронтендов. А вот язык Clojure лишен этих недостатков. Помимо этого он еще обещает не мешать использовать всю мощь платформы Javascript. Reason вроде тоже это обещал, но немного опарафинился, как мы увидим дальше. Обещания колжи прагматичные, но без киллер фичи. Поэтому кложа получает пол монадки за идеологию.
  3. Интероп или взаимодействие означает как язык умеет говорить с Javascript и наоборот. Как бы мы не старались не вляпаться, но влазить в джаваскрипт все же придется. И хорошо бы чтобы язык позволял это делать без лишней возни. Можно ли использовать Javascript библиотеки, нужно ли их адаптировать и можно ли смешивать код в одном приложении? Вот это все интероп.
    • У Elm – свой маленький мир. Он полностью огораживается забором от джаваскрипта. Нужно явно прокидывать все общение через так называемые порты. Порты в элме это функции на джаваскрипте которые стараются завернуть типы джаваскрипта в типы элма, чтобы элм не поперхнулся. Это конечно же все идет от главной цели. Джаваскрипт – опасен и от него нужно отгородиться. Иначе можно поймать ошибку. Работать с джаваскриптом из элма довольно болезненно поэтому за интероп элм не получает ни одной монадки. Хотя если подумать, то с приложением на элме можно работать из джаваскрипта. Т.е. вы можете переписать маленький кусочек на элм и внедрить его в больше приложение на jQuery. Я не уверен можно ли это легко сделать с другими двумя, поэтому давайте дадим элму пол монадки.
    • В reasonML – можно месить Javascript код прямо внутри кода reasonMl через [%bs.raw {| ... |}]; Но чур не ныть когда эта лапша взорвется вам в лицо. Если понадобится подключить библиотеку – придется джаваскрипт какаху завернуть в приятный фантик, чтобы reasonML согласился ее переварить. К счастью популярные библиотеки уже завернули за вас и выложили в открытый доступ. Если же хочется использовать глобальные объекты джаваскрипта не через bs.raw то придется прописать все интерфесйы и типы с помощью [@bs.val] external И тут я не знаю, есть ли ризон давать ризону пол монадки за интероп. С одной стороны можно намесить джаваскрипта прямо посреди высокодуховного типизированного кода. С другой стороны к глобальным объектам так просто не дотянешься. Так и быть. Пол монадки.
    • ClojureScript – предлагают несколько вариантов подключения сторонних джаваскрипт библиотек. Начиная с вызова функций по имени и заканчивая написанием оберток, чтобы использовать оптимизации компилятора Google Closure Compiler на полную катушку. ClojureScript так же не станет спрашивать документики если вам надо залезть в API браузера. Все доступно в неймспейсе (js/...) например через (js/window) можно обратиться к глобальному объекту window и делать все что требуется. В конце концов, создатели языка никогда не собирались вас огораживать от ногострела. Вот он, всегда под рукой, используйте на свой страз и риск. За прагматичный подход ClojureScript получает одну монадку.
  4. Сообщество Не так просто оценить сообщество. Я принял во внимание количество репозиториев на гитхаб и активность на Stackoverflow и кому разрешено принимать участие в разработке языка.
    • Elm – 8,937 repos / 1668 вопросов – ни одной монадки
    • ReasonML – 391 вопрос – одну монадку
    • Clojurescript – 33,995 repos for Clojure / 2031 вопрос – пол монадки
  5. Компания-спонсор
    • Elm – no red ink – пол монадки
    • ReasonML – Facebook – 1 монадка
    • Clojurescript – Cognitect – пол монадки

Итоги:

  • Elm – 3.5
  • ReasonML – 3,5
  • Clojurescript – 2,5