Przede wszystkim zgadzam się z TYLKO poprawną odpowiedzią OPINII na temat nauki Erlanga. Jest to głównie język funkcjonalny (choć współbieżność odgrywa dużą rolę), a wszystkie jego funkcje zostały dodane, aby zapewnić odporność na awarie i niezawodność, co nie jest dokładnie tymi samymi celami projektowymi, co JavaScript.
Po drugie, pozostawienie Node.js, aby dostać się do Erlang, jest nieco niewłaściwe. Node.js jest pojedynczym serwerem / strukturą, która robi wszystko, aby sterować zdarzeniami za pomocą wywołań zwrotnych. Erlang ma swój własny framework (OTP), ale wcale nie jest na tym samym poziomie.
Jeśli planujesz uczyć się Erlanga, proponuję, aby mój wpis na blogu „List otwarty do początkującego Erlanga” (lub „Obserwatora”) był wstępem przed zanurzeniem się w tutoriale.
Jedyną rzeczą, w której można porównać Erlang i Node.js, pod względem wzorców i użycia, jest sposób, w jaki są one sterowane zdarzeniami. Istnieją jednak dwie duże różnice. Model Node.js opiera się na wywołaniach zwrotnych powiązanych ze zdarzeniami. Erlang opiera się na kolejkach wiadomości i selektywnych odbiorze. Jakie są tam implikacje?
Przede wszystkim, jeśli robisz rzeczy w sposób oparty na wywołaniu zwrotnym, jedynym sposobem przenoszenia stanu jest albo globalne, albo przejście do programowania stylu kontynuacji. Po drugie, musisz sam zadbać o pełną matrycę zdarzeń. Jednym z przykładów jest to, że jeśli wyobrażamy sobie bardzo prostą maszynę skończoną: semafor mutex, sterowany zdarzeniami.
Semafor mutex ma dwa stany: zablokowany i wolny. Ilekroć dana jednostka obliczeniowa (proces roboczy, proces, funkcja lub wątek) chce uzyskać dostęp do muteksu, musi uruchomić zdarzenie, które mówi „jestem zainteresowany”. Teraz musisz zadbać o następujące typy wydarzeń:
- Muteks jest darmowy i poprosisz o uzyskanie blokady
- Muteks jest zablokowany przez kogoś innego i chcesz uzyskać blokadę
- Muteks jest zablokowany przez ciebie i chcesz go uwolnić
Następnie musisz wziąć pod uwagę dodatkowe zdarzenia, takie jak przekroczenie limitu czasu w celu uniknięcia impasu:
- Muteks został zablokowany, a ty czekałeś zbyt długo, odliczając czas do oddania ognia
- Muteks został zablokowany, a ty czekałeś zbyt długo, uzyskałeś blokadę, a następnie upłynął limit czasu
Następnie masz również zdarzenia niezwiązane:
- właśnie zablokowałeś muteks, podczas gdy jakiś pracownik oczekiwał, że będzie wolny. Teraz zapytanie pracownika musi zostać umieszczone w kolejce, aby kiedy było wolne, było obsługiwane
- Musisz uczynić całą pracę asynchroniczną
Macierz zdarzeń bardzo szybko się komplikuje. Nasz FSM ma tutaj tylko 2 stany. W przypadku Erlang (lub dowolnego języka z selektywnym odbieraniem i asynchronizacji z potencjalnie synchronicznymi zdarzeniami) musisz zadbać o kilka przypadków:
- Muteks jest darmowy i poprosisz o uzyskanie blokady
- Muteks jest zablokowany przez kogoś innego i chcesz uzyskać blokadę
- Muteks jest zablokowany przez ciebie i chcesz go uwolnić
I to wszystko. Liczniki czasu są obsługiwane w tych samych przypadkach, w których wykonywane są odbieranie, a dla wszystkiego, co ma związek z „czekaniem, aż będzie za darmo”, wiadomości są automatycznie kolejkowane: pracownik musi tylko czekać na odpowiedź. Model jest znacznie prostszy w tych przypadkach.
Oznacza to, że w ogólnych przypadkach CPS i modele oparte na wywołaniach zwrotnych, takie jak ten w node.js, albo proszą cię o bardzo sprytne obchodzenie się ze zdarzeniami, albo proszą o zajęcie się całą złożoną macierzą zdarzeń, ponieważ musisz być oddzwaniany w każdej nieistotnej sprawie, która wynika z dziwnych problemów z czasem i zmian stanu.
Odbiory selektywne zwykle pozwalają skupić się tylko na podgrupie wszystkich potencjalnych zdarzeń i pozwalają znacznie łatwiej uzasadniać zdarzenia w tym przypadku. Zauważ, że Erlang ma zachowanie (wzorzec projektu / implementacja struktury) czegoś o nazwie gen_event
. Implementacja gen_event pozwala mieć mechanizm bardzo podobny do tego, który jest używany w node.js, jeśli tego chcesz.
Będą inne punkty, które je różnicują; Erlang ma zapobiegawcze planowanie, podczas gdy node.js sprawia, że współpracuje, Erlang jest bardziej odpowiedni do niektórych bardzo dużych aplikacji (dystrybucji i wszystkich), ale Node.js i jego społeczność są zwykle bardziej zdolni do Internetu i mają wiedzę na temat najnowszych trendów internetowych. To kwestia wyboru najlepszego narzędzia, a to zależeć będzie od twojego pochodzenia, rodzaju problemu i twoich preferencji. W moim przypadku model Erlanga bardzo dobrze pasuje do mojego sposobu myślenia. Niekoniecznie dotyczy to wszystkich.
Mam nadzieję że to pomoże.