Перш за все, я погоджуюсь з ПРОСТО МОЄМО правильною відповіддю на думку ЕРланг. Це здебільшого функціональна мова (хоча паралельність відіграє велику роль), і всі її особливості були додані для досягнення відмовостійкості та стійкості, що в першу чергу не є такими ж цілями дизайну, як Javascript.
По-друге, залишати Node.js потрапити в Ерланг дещо не так. Node.js - це єдиний сервер / фреймворк, який робить свій шлях робити все керованим подіями за допомогою зворотних викликів. У Erlang є своя структура (OTP), але вона зовсім не на одному рівні.
Якщо ви плануєте вивчати Ерланг, я пропоную свій запис у блозі Відкритий лист для початківця Ерланга (або Onlooker) як вступне читання перед тим, як зануритися в навчальні посібники.
Єдине, у чому можна порівняти Erlang та Node.js, з точки зору моделей та використання, - це те, як вони керуються подіями. Однак тут є дві великі різниці. Модель Node.js заснована на зворотних викликах, пов'язаних з подіями. Erlang заснований на черзі повідомлень та вибірковому отриманні. Які наслідки є там?
Перш за все, якщо ви робите речі на основі зворотного виклику, єдиний спосіб, коли ви переносите стан, - це або мати його глобальним, або перейти до програмування стилю продовження. По-друге, ви повинні піклуватися про повну матрицю подій самостійно. Одним із прикладів цього є те, що якщо ми уявляємо собі дуже просту машину з кінцевим станом: мутексний семафор, керований подіями.
Мутаксичний семафор має два стани: заблокований та вільний. Кожен раз, коли певна одиниця обчислення (працівник, процес, функція або потік) хоче отримати доступ до файлу mutex, вона повинна запустити подію, яка каже йому, що я зацікавлений. Тепер вам належить подбати про такі типи подій:
- Мутекс безкоштовний, і ви попросите отримати замок
- Мутекс заблокований кимось іншим, і ви хочете отримати замок
- Мютекс заблокований вами, і ви хочете звільнити його
Тоді вам слід врахувати додаткові події, такі як тайм-аут, щоб уникнути тупиків:
- Мутекс був заблокований, і ви занадто довго чекали, таймер відмовився від пожеж
- Мутекс був заблокований, і ви чекали занадто довго, дістали замок, після чого тайм-аут вимкнувся
Тоді ви також маєте позав'язані події:
- Ви просто заблокували мютекс, тоді як якийсь робітник очікував, що це буде безкоштовно. Тепер цей запит працівника повинен бути поставлений у чергу, щоб після його безкоштовного оброблення
- Потрібно зробити всю роботу асинхронною
Матриця подій дуже складна. Наш FSM тут має лише 2 штати. У випадку з Erlang (або будь-якою мовою з селективними прийманнями та асинхронізацією з потенційно синхронними подіями) вам потрібно подбати про кілька випадків:
- Мутекс безкоштовний, і ви попросите отримати замок
- Мутекс заблокований кимось іншим, і ви хочете отримати замок
- Мютекс заблокований вами, і ви хочете звільнити його
І це все. Таймери обробляються в тих же випадках, що і прийоми, і для всього, що має відношення до "зачекайте, поки воно буде безкоштовним", повідомлення автоматично ставлять у чергу: працівник повинен лише чекати відповіді. Модель у цих випадках набагато, набагато простіша.
Це означає, що в загальних випадках CPS і моделі на основі зворотного виклику, такі як одна в node.js, або просять вас бути дуже розумними в обробці подій, або просять вас подбати про всю складну матрицю подій в повному обсязі, оскільки вам потрібно передзвонити за кожним невпливним випадком, який виникає із-за дивних проблем із тимчасовим терміном та змін у стані.
Вибірковий прийом, як правило, дозволяє вам зосередитись лише на підгрупі всіх потенційних подій, і дозволяє міркувати з набагато більшою легкістю про події в цьому випадку. Зауважте, що Ерланг має поведінку (модель дизайну / реалізація рамки) чогось, що називається gen_event
. Реалізація gen_event дозволяє вам мати механізм, дуже подібний до того, що використовується у node.js, якщо це те, що ви хочете.
Будуть і інші моменти, що їх розмежовують; У Erlang передбачено попереднє планування, в той час як node.js робить його кооперативним, Ерланг - більш придатний до деяких дуже масштабних додатків (дистрибуції та всіх), але Node.js та його спільнота зазвичай більш придатні для веб-пошуку та знають про останні тенденції веб-сторінок. Це питання вибору найкращого інструменту, і це залежатиме від вашого фону, типу проблеми та ваших уподобань. У моєму випадку модель Ерланга дуже добре відповідає моєму мисленню. Це не обов'язково так для всіх.
Сподіваюсь, це допомагає.