Прежде всего, я согласен с ТОЛЬКО МОИМ правильным ответом относительно изучения 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 и его сообщество обычно более склонны к веб и осведомлены о последних тенденциях в Интернете. Это вопрос выбора лучшего инструмента, и это будет зависеть от вашего опыта, типа проблемы и ваших предпочтений. В моем случае модель Эрланга очень хорошо подходит для моего мышления. Это не обязательно так для всех.
Надеюсь это поможет.