우선, 나는 Erlang을 배우는 것에 대한 나의 올바른 OPINION의 대답에 동의합니다. 대부분의 기능적 언어이지만 (동시성이 큰 역할을하지만) 내결함성과 견고성을 위해 모든 기능이 추가되었습니다. 이는 처음에는 Javascript와 정확히 같은 디자인 목표가 아닙니다.
둘째, Node.js가 Erlang에 들어가는 것은 약간 잘못되었습니다. Node.js는 단일 서버 / 프레임 워크로 콜백을 통해 모든 이벤트를 이벤트 중심 방식으로 수행합니다. Erlang은 자체 프레임 워크 (OTP)를 가지고 있지만 전혀 같은 수준이 아닙니다.
Erlang을 배울 계획이라면 튜토리얼에 들어가기 전에 블로그 글 을 Erlang Beginner (또는 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 및 해당 커뮤니티는 일반적으로 최신 웹 트렌드에 대해 더 잘 적응하고 있습니다. 최상의 도구를 선택하는 데 대한 질문이며 배경, 문제 유형 및 기본 설정에 따라 다릅니다. 제 경우에는 Erlang의 모델이 제 생각에 아주 잘 맞습니다. 반드시 모든 사람에게 해당되는 것은 아닙니다.
도움이 되었기를 바랍니다.