Изучение Erlang против обучения node.js [закрыто]

41

Я вижу много дерьма в Интернете о том, как Эрланг пинает задницу node.js практически во всех мыслимых категориях. Так что я хотел бы выучить Эрланг и дать ему шанс, но вот проблема. Я обнаружил, что мне гораздо сложнее забрать Эрланга, чем я взял нод.js. С помощью node.js я мог выбрать относительно сложный проект, и через день у меня было что-то работающее. С Эрлангом я сталкиваюсь с барьерами, и не так быстро.

Так ... для тех, у кого больше опыта, сложно ли учить Эрланга или я что-то упускаю? Node.js может быть не идеальным, но я, кажется, могу с этим справиться.

недотрога
источник
9
Может быть, я что-то упускаю, но не является ли node.js библиотекой JavaScript, а Erlang - совершенно другим языком? Как они даже сопоставимы?
FrustratedWithFormsDesigner
3
@FrustratedWithFormsDesigner, node.js - это часть недавней моды / шумихи, связанной с получением javascript на стороне сервера, с многопоточным подходом, поэтому они сравнимы
lurscher
5
@lurscher: Вы не можете сравнить Erlang (язык) с Node.js (серверный JavaScript). Это все равно что сравнивать Java (язык) с Django (серверный питон). Не говоря уже о том, что Erlang и JS очень разные.
Джош К
10
Как те, кто использует и erlang, и нод, они определенно сопоставимы в задачах, которые они решают
Дейл Харви
3
@Noli есть разница между node.js и erlang. Вы имели в виду сравнение между node.js и веб-серверами на основе erlang. У Erlang много пользователей за пределами веб-серверов.
Рэйнос

Ответы:

46

Прежде всего, я согласен с ТОЛЬКО МОИМ правильным ответом относительно изучения Erlang. Это в основном функциональный язык (хотя параллелизм играет большую роль), и все его функции были добавлены для обеспечения отказоустойчивости и надежности, что, в первую очередь, не совсем те же цели, что и Javascript.

Во-вторых, оставить Node.js для входа в Erlang немного неуместно. Node.js - это единый сервер / фреймворк, который делает все возможное, основываясь на событиях, с помощью обратных вызовов. Erlang имеет свою собственную платформу (OTP), но она совсем не на одном уровне.

Если вы планируете изучать Erlang, я предлагаю свою запись в блоге Открытое письмо начинающему Erlang (или Onlooker) в качестве ознакомительного чтения, прежде чем углубляться в учебники.


Единственное, в чем вы можете сравнить Erlang и Node.js с точки зрения шаблонов и использования, это то, как они управляются событиями. Однако здесь есть два больших отличия. Модель Node.js основана на обратных вызовах, привязанных к событиям. Erlang основан на очередях сообщений и выборочных приемах. Каковы последствия там?

Прежде всего, если вы делаете вещи на основе обратного вызова, единственный способ перенести состояние в другое - это сделать его глобальным или войти в программирование в стиле продолжения. Во-вторых, вы должны позаботиться о полной матрице событий самостоятельно. Одним из примеров этого является то, что если мы представим очень простой конечный автомат: семафор мьютекса, управляемый событиями.

Семафор мьютекса имеет два состояния: заблокировано и свободно. Всякий раз, когда определенная единица вычислений (рабочий, процесс, функция или поток) хочет получить доступ к мьютексу, она должна вызвать событие, которое говорит ему «я заинтересован». Теперь вам нужно позаботиться о следующих типах событий:

  • Мьютекс свободен, и вы просите получить блокировку
  • Мьютекс заблокирован кем-то другим, и вы хотите получить блокировку
  • Мьютекс заблокирован вами, и вы хотите освободить мьютекс

Затем у вас есть дополнительные события, такие как тайм-аут, чтобы избежать тупиков:

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

Тогда у вас также есть вне связанных событий:

  • Вы только что заблокировали мьютекс, пока какой-то рабочий ожидал, что он будет свободен. Теперь этот рабочий запрос должен быть поставлен в очередь, чтобы, когда он свободен, он обрабатывался обратно
  • Вы должны сделать всю работу асинхронной

Матрица событий очень быстро становится сложной. Наш FSM здесь имеет только 2 государства. В случае Erlang (или любого языка с селективным получением и асинхронностью с потенциально синхронными событиями) вам нужно позаботиться о нескольких случаях:

  • Мьютекс свободен, и вы просите получить блокировку
  • Мьютекс заблокирован кем-то другим, и вы хотите получить блокировку
  • Мьютекс заблокирован вами, и вы хотите освободить мьютекс

Вот и все. Таймеры обрабатываются в тех же случаях, что и при получении, и для всего, что связано с «дождаться освобождения», сообщения автоматически ставятся в очередь: рабочий должен только ждать ответа. Модель намного, намного проще в этих случаях.

Это означает, что в общих случаях CPS и модели, основанные на обратном вызове, такие как модель в node.js, либо просят вас быть очень умными в том, как вы обрабатываете события, либо просят вас полностью позаботиться о всей сложной матрице событий, потому что Вам нужно будет отозвать по каждому несущественному делу, которое возникает из-за странных проблем с синхронизацией и изменений состояния.

Выборочные приемы обычно позволяют вам сосредоточиться только в подгруппе всех потенциальных событий и позволяют гораздо легче рассуждать о событиях в этом случае. Обратите внимание, что Erlang имеет поведение (реализация шаблона проектирования / фреймворка) того, что называется gen_event. Реализация gen_event позволяет вам иметь механизм, очень похожий на то, что используется в node.js, если вы этого хотите.


Будут другие пункты, которые дифференцируют их; Erlang имеет упреждающее планирование, в то время как node.js делает его совместным, Erlang более склонен к некоторым очень крупномасштабным приложениям (дистрибуция и все), но Node.js и его сообщество обычно более склонны к веб и осведомлены о последних тенденциях в Интернете. Это вопрос выбора лучшего инструмента, и это будет зависеть от вашего опыта, типа проблемы и ваших предпочтений. В моем случае модель Эрланга очень хорошо подходит для моего мышления. Это не обязательно так для всех.

Надеюсь это поможет.

Я даю ужасные советы
источник
Подробнее о реактивном программировании и его выполнении в JS: blog.flowdock.com/2013/01/22/…
Барт,
«потому что вам нужно будет перезвонить по каждому несущественному делу, которое возникает из-за странных проблем со временем и изменений состояния». - в Erlang вам все еще нужно работать с таймерами, и тот факт, что вы делаете это «в тех же случаях, что и получение», не меняет сложности (вообще). С моей точки зрения (как архитектор систем, обрабатывающих миллиарды запросов в день), единственными реальными различиями между селективным приемом и стилем node.js являются (а) вопрос «что мы хотим сделать по умолчанию» (с помощью node.js) обработка событий по умолчанию, и Erlang откладывает события, если не происходит совпадение) ...
No-Bugs Hare
... и (b) удобочитаемость, включая количество шаблонов (что довольно плохо в классическом node.js, но стало намного лучше - и IMNSHO лучше, чем у Erlang - с недавно введенным оператором await) ... И в любом случае эти различия в значительной степени являются косметическими (несмотря на то, что фанатики с обеих сторон проповедуют иначе).
No-Bugs Hare
38

Erlang не сложен в изучении, он просто чужд мышлению, которое констант Chambers (99,44%) программистов усвоили как работает программирование. Проблема, с которой вы сталкиваетесь, скорее всего, просто концептуальная дезориентация, а не фактическая сложность.

Вот некоторые из инопланетных особенностей Erlang, которые собираются укусить типичного программиста:

  • Erlang - это (в основном) функциональный язык программирования. Наиболее распространенные языки программирования почти воинственно обязательны.
  • Модель параллелизма Эрланга - это модель актера. В большинстве распространенных языков программирования используется либо многопоточность, основанная на блокировке, либо какой-либо другой подход к параллелизму, основанный на «реакторе». (Я думаю, что Node.js - последний, но не называйте меня по этому поводу - у меня нулевой интерес к JavaScript на любой стороне отношений клиент / сервер.)
  • У Erlang есть подход «позволяй ему падать» к кодированию с мощными функциями времени выполнения, доступными для обнаружения этих сбоев, их диагностики и оперативного исправления во время работы системы. Большинство распространенных языков программирования поддерживают очень оборонительный стиль программирования.
  • Erlang почти, но не совсем, неразрывно связан с большой и слегка извилистой библиотекой часто используемых архитектур для надежных и стабильных серверов (OTP). (Существует причина, по которой Erlang обычно называют Erlang / OTP.) Кроме того, эта библиотека построена на инопланетных функциях, упомянутых ранее, и поэтому непрозрачна для новичков. Большинство языков программирования имеют менее всеобъемлющие библиотеки (несмотря на Java EE) для работы, и эти библиотеки, естественно, построены на концепциях, более знакомых большинству программистов.

Таким образом, изучение Erlang будет более сложной задачей для большинства программистов, чем изучение Node.js, особенно если программист уже знаком с JavaScript. В конце концов, однако, как только вы преодолеете концептуальный барьер, я утверждаю, что кодирование Эрланга будет менее сложным, чем эквивалентное кодирование Node.js. Это по нескольким причинам:

  • Модель параллелизма Эрланга делает логический поток намного более четким, чем типичный параллелизм в стиле «реактора», и делает параллелизм гораздо более стабильным и корректным, чем типичный параллелизм на основе блокировки. Для программиста на Erlang почти нет проблем буквально отбросить тысячи процессов в типичной программе, в то время как отбрасывание тысяч потоков в, скажем, Java было бы кошмаром раздора (не говоря уже о затратах памяти и процессора) и эквивалентно поддержанию тысяч отдельных состояний в «реакторной» установке было бы кошмаром для чтения.
  • Будучи (в основном) функциональным языком, Erlang очень похож на «то, что вы видите, это то, что вы получаете». Переменные, однажды установленные, не меняются. Когда-либо. Там нет ООП "жуткое действие на расстоянии", чтобы сбить вас с толку: все, с чем вы работаете, явно выложено перед вами. Там нет унаследованных переменных от X и нет переменных класса от Y, и нет глобальных переменных от Z, к которым можно позаботиться. (Это последнее утверждение не на 100% верно, но оно верно в таком подавляющем числе случаев, что этого достаточно для вашей фазы обучения.)
  • Мощные средства, которые есть в Erlang для обработки ошибок, означают, что вы загромождаете свой код менее защищенным программированием, таким образом сохраняя логику более ясной и сохраняя код небольшим.
  • Библиотека OTP, как только вы ее взяли, представляет собой невероятно мощный стек общего кода, который поддерживает работу всего вашего приложения на регулярной основе и покрывает многие проблемы и случаи использования долгоживущих серверов, о которых вы, скорее всего, не подумаете, пока не станет слишком поздно. Сама библиотека OTP является, IM (ns) HO, достаточно хорошей причиной для изучения Erlang.

Если можете, продолжайте шлёпать по Erlang, а если вы еще этого не сделали, зайдите в « Learn You Some Erlang for Great Good», чтобы получить нежное и (в основном, забавное) введение в концепции Erlang.

ПРОСТО МОЕ правильное мнение
источник
Спасибо тебе за этот пост. Я сейчас читаю «Изучаю тебя» на «Эрланге», и на полпути к книге, но у меня возникает ощущение, что мне нужно знать все это, прежде чем я действительно смогу начать что-то умеренно значительный, а не просто взять его по частям
Ноли
1
На самом деле, как только вы войдете в разделы, посвященные параллелизму, вы сможете достаточно легко выполнять умеренно важные вещи.
Просто мое правильное мнение
«Модель параллелизма Эрланга делает логический поток намного более ясным, чем типичный параллелизм в стиле« реактора »- я бы сказал, что хотя асинхронная обработка реактора действительно была беспорядочной в течение десятилетий, с появлением фьючерсов и особенно оператора ожидания это не дело больше. С помощью await ваши ультралегкие сопрограммы могут вести себя «как будто», они как бы потоковые (и я не уверен насчет JS, но в C ++ co_await спроектирован так, чтобы масштабироваться не до тысяч, а до миллиардов выдающихся). сопрограммы).
Заяц без ошибок
«для мышления просто чуждо постоянство камер (99,44%)» - и для любого промышленного проекта это квалифицируется как проблема большого жира. Эта проблема с большой жирностью стояла бы, даже если бы не было объективной причины непопулярности функциональных языков (с которыми я не согласен, но это совсем другая и длинная история).
No-Bugs Hare
10

Есть несколько существенных различий между Erlang и Node

Во-первых, этот узел - это Javascript, что означает, что он является очень распространенным языком, который имеет много общих черт с языками, с которыми знакомо больше людей, поэтому его обычно легче запустить и запустить. Эрланг имеет часто странный и незнакомый синтаксис для большинства, и, хотя язык намного проще, чем javascript, он требует немного больше привыкания из-за своей уникальности

Во-вторых, у Erlang есть очень специфическая модель параллелизма без совместного использования, она требует от вас другого подхода к решению проблем, и это хорошо (TM)

Последнее, что важно, это то, что Erlang был разработан коммерческой компанией и открытыми источниками после того, как это было, только 2 года назад или около того, что люди могли видеть отдельные коммиты в системе контроля версий, и даже сейчас я не думаю, что все разработчики Erlang переехали для публичного репозитория github для их развития. node.js был создан внутри сообщества с самого начала, это означает, что его поддержка сообщества намного лучше, уже есть гораздо больше библиотек для узла, больше документации сообщества, больше примеров из жизни, вездесущий менеджер пакетов и т. д. и т. д. Erlang догоняет в этом отношении, но его все еще гораздо больше, чтобы подняться.

Node позволит вам программировать забавные вещи довольно быстро и относительно безболезненно, он все еще испытывает трудности с большими приложениями, которые Erlang уже давно решал. Erlang изменит способ программирования и (imo) сделает вас лучшим программистом, однако вначале он не облегчит вам жизнь. Оба забавны по-разному.

Дейл Харви
источник
2
Стоит отметить, что темы Node также «ничего не делятся».
Тамлин