Erlang 학습과 학습 node.js [닫기]


41

Erlang이 상상할 수있는 모든 범주에서 node.js의 엉덩이를 걷어차는 방법에 대해 온라인에서 많은 쓰레기를 봅니다. Erlang을 배우고 싶은데 문제가 있습니다. node.js를 선택하는 것보다 Erlang을 선택하는 데 훨씬 더 어려운 시간이 있습니다. node.js를 사용하면 비교적 복잡한 프로젝트를 선택할 수 있었고 하루 만에 뭔가 효과가있었습니다. Erlang과 함께, 나는 장벽에 빠졌고 거의 빨리 가지 않고 있습니다.

더 많은 경험을 가진 사람들에게 Erlang은 배우기가 복잡합니까, 아니면 뭔가 빠졌습니까? Node.js가 완벽하지는 않지만 일을 끝낼 수있을 것 같습니다.


9
어쩌면 나는 뭔가를 놓치고 있지만 node.js는 JavaScript 라이브러리가 아니며 Erlang은 완전히 다른 언어입니까? 그들은 어떻게 비교할 수 있습니까?
FrustratedWithFormsDesigner

3
그들은 비교할 수 있도록 @FrustratedWithFormsDesigner은 Node.js를은 멀티 스레드 방식으로, 서버 측에서 자바 스크립트를 얻기의 최근 패션 / 과대 광고의 일부입니다
lurscher

5
@lurscher : Erlang (언어)과 Node.js (서버 측 JavaScript)를 비교할 수 없습니다. Java (언어)와 Django (서버 파이썬)를 비교하는 것과 같습니다. Erlang과 JS는 말할 것도없이 매우 다릅니다.
Josh K

10
얼랭과 노드를 모두 사용하는 사람으로서, 그들이 해결 한 문제들과 비교할 만하다
Dale Harvey

3
@ Noli는 node.js와 erlang의 차이점이 있습니다. node.js와 erlang 기반 웹 서버 간의 비교를 의미했습니다. Erlang에는 웹 서버 외부에 많은 사용자 가 있습니다.
Raynos

답변:


46

우선, 나는 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의 모델이 제 생각에 아주 잘 맞습니다. 반드시 모든 사람에게 해당되는 것은 아닙니다.

도움이 되었기를 바랍니다.


반응 형 프로그래밍 및 JS에서 수행하는 방법에 대한 자세한 내용 : blog.flowdock.com/2013/01/22/…
Bart

"이상한 타이밍 문제와 상태 변경으로 인해 발생하는 중요하지 않은 각 경우마다 다시 전화해야하기 때문입니다." -Erlang에서는 여전히 타이머를 처리해야하며 "수신이 수행되는 것과 같은 경우"에 수행한다는 사실은 복잡성을 전혀 바꾸지 않습니다. 필자의 관점에서 (하루에 수십억 건의 요청을 처리하는 시스템 설계자), 선택적 receive와 node.js 스타일의 유일한 현실적인 차이점은 (a) "기본적으로 무엇을하고 싶은가"(node.js로)라는 질문입니다. 기본적으로 이벤트 처리 및 일치하지 않는 경우 Erlang 연기 이벤트) ...
버그 없음 Hare

... (b) 상용구 양을 포함한 가독성 (클래식 node.js에서는 꽤 나쁘지만 새로 도입 된 대기 연산자를 사용하여 Erlang보다 훨씬 좋아지고 IMNSHO은 좋아졌습니다) ... 그리고 어쨌든 , 이러한 차이는 (다른면에서 설교하는 양쪽에 열광 자 임에도 불구하고) 매우 장식 적입니다.
No-Bugs Hare

38

Erlang은 배우기가 복잡하지 않고, 코딩의 Chambers Constant (99.44 %)가 프로그래밍 작동 방식으로 배운다는 사고 방식에 익숙하지 않습니다. 현재 직면하고있는 문제는 실제 복잡성이 아니라 개념적 혼란입니다.

다음은 전형적인 프로그래머를 물게 할 Erlang의 외계인 기능 중 일부입니다.

  • Erlang은 (주로) 기능적인 프로그래밍 언어입니다. 가장 일반적인 프로그래밍 언어는 거의 무장해야합니다.
  • Erlang의 동시성 모델은 Actor 모델입니다. 가장 일반적인 프로그래밍 언어는 잠금 기반 스레딩 또는 동시성에 대한 "반응기"기반 접근 방식을 사용합니다. (Node.js는 후자라고 생각하지만 전화하지 마십시오. 클라이언트 / 서버 관계의 모든 측면에서 JavaScript에 관심이 없습니다.)
  • Erlang은 이러한 충돌을 포착하고 진단하고 시스템이 실행되는 동안 핫 패치 할 수있는 강력한 런타임 기능을 사용하여 코딩하는 "충돌하자"접근 방식을 가지고 있습니다. 가장 일반적인 프로그래밍 언어는 매우 방어적인 프로그래밍 스타일을 보증합니다.
  • Erlang은 신뢰할 수 있고 안정적인 서버 (OTP)를 위해 일반적으로 사용되는 아키텍처의 크고 약한 두뇌 왜곡 라이브러리와 거의 불가분의 관계가 있습니다. (Erlang을 일반적으로 Erlang / OTP라고하는 이유가 있습니다.) 또한이 라이브러리는 앞서 언급 한 외계인 기능을 기반으로하므로 신규 사용자에게는 불투명합니다. 대부분의 프로그래밍 언어에는 작업에 필요한 모든 라이브러리 (Java EE는 아님)가 적으며, 대부분의 프로그래머에게 친숙한 개념을 기반으로하는 라이브러리입니다.

따라서 Erlang을 배우는 것은 Node.js를 배우는 것보다 대부분의 프로그래머에게 더 어려운 과제가 될 것입니다. 특히 프로그래머가 이미 JavaScript에 익숙한 경우. 결국 개념적인 장벽을 넘어 서면 Erlang 코딩은 동등한 Node.js 코딩보다 복잡 할 것입니다. 몇 가지 이유가 있습니다.

  • Erlang의 동시성 모델은 일반적인 "리액터"스타일의 동시성보다 논리 흐름을 훨씬 더 명확하게하고 일반적인 잠금 기반 동시성보다 훨씬 안정적이며 동시성을 만듭니다. Erlang 프로그래머가 전형적인 프로그램에서 문자 그대로 수천 개의 프로세스를 삭제하는 반면, 수천 개의 스레드를 삭제하는 것은 전혀 문제가 되지 않습니다. "리액터"기반 설정에서 수천 개의 개별 상태를 유지하는 것은 읽기에 악몽 일 것입니다.
  • Erlang은 (주로) 기능적인 언어이기 때문에 "보이는 것이 얻는 것"입니다. 한 번 설정된 변수는 변경되지 않습니다. 이제까지. 혼란 스러울 수있는 OOP "원거리에서의 스푸키 액션 (spooky action)"은 없습니다. X로부터 상속받은 변수는없고 Y의 클래스 변수와 Z의 전역 변수는 없습니다. (이 후자의 요점은 100 % 사실은 아니지만 학습 단계에 충분할 정도로 많은 경우에 해당됩니다.)
  • Erlang이 오류를 처리 할 수있는 강력한 기능은 덜 방어적인 프로그래밍으로 코드를 복잡하게하여 논리를 명확하게 유지하고 코드를 작게 유지하는 것을 의미합니다.
  • OTP 라이브러리는 일단 익히면 전체 응용 프로그램을 정기적으로 유지하고 너무 늦을 때까지 생각하지 않을 오래 지속되는 서버의 많은 문제와 사용 사례를 다루는 엄청나게 강력한 공통 코드 스택입니다. OTP 라이브러리 자체는 IM (ns) HO Erlang을 배울만한 충분한 이유입니다.

얼랑 할 수 있다면 멀리 강타 계속, 당신은 그래서 아직 수행하지 않은 경우, 방문 갈 위대한 좋은 당신에게 어떤 얼랑 알아 얼랑의 개념 부드러운 및 (mostly-) 재미 도입.


이 게시물에 감사드립니다. 나는 지금 당신에게 Erlang을 배우고 있습니다. 그리고 나는 책을 반쯤 읽었습니다. 그러나 나는 적당히 무언가를 실제로 시작할 수 있기 전에 모든 것을 알아야한다는 느낌을 받고 있습니다. 중요하며, 한 조각 씩 가져가는 것이 아니라
Noli

1
실제로 책의 동시성 부분에 들어가면 적당히 중요한 일을 쉽게 할 수 있습니다.
저의 정확한 의견 JUIN

"Erlang의 동시성 모델은 일반적인"반응기 "스타일의 동시성보다 논리 흐름을 훨씬 더 명확하게합니다."-원자로 비동기 처리는 수십 년 동안 엉망 이었지만 미래의 도래와 함께, 특히 운영자를 기다리는 것은 아닙니다. 더 이상 사건. 그들이 좀-스레드이야 "처럼"await를 사용하면 초경량 코 루틴의 역할을 할 수 있습니다 (내가 JS에 대해 잘 모르겠지만, C ++ co_await에 불과 수천하지 확장하도록 설계되어 있지만,에 수십억 우수의 코 루틴).
No-Bugs Hare

"Chambers Constant (99.44 %)라는 사고 방식에 익숙하지 않습니다."– 그리고 모든 산업 프로젝트에서 이것은 큰 뚱뚱한 문제의 자격이됩니다. 이 큰 뚱뚱한 문제는 기능적 언어의 인기가 없기 때문에 객관적인 이유가 없을지라도 서있을 것입니다.
No-Bugs Hare

10

Erlang과 Node 사이에는 몇 가지 중요한 차이점이 있습니다.

첫 번째는 노드가 Javascript라는 것인데, 이는 더 많은 사람들이 익숙한 언어와 많은 특성을 공유하는 매우 일반적인 언어이므로 일반적으로 시작하고 실행하는 것이 훨씬 쉽습니다. Erlang은 대부분 신기하고 생소한 구문을 가지고 있으며, 언어가 자바 스크립트보다 훨씬 단순하지만 고유성으로 인해 익숙해지는 데 조금 더 걸립니다.

두 번째는 Erlang은 매우 특별한 공유 없음 동시성 모델을 가지고 있기 때문에 문제를 해결하기 위해 다른 방식으로 생각해야한다는 것입니다.

마지막으로 중요한 것은 Erlang이 상업 회사에 의해 개발되었고 사실 이후 오픈 소스가 된 것입니다 .2 년 전만해도 사람들이 실제로 소스 제어에서 개별 커밋을 볼 수 있었고 지금은 모든 Erlang 개발자가 이사했다고 생각하지 않습니다. 개발을 위해 공개 github 저장소에. node.js는 처음부터 커뮤니티 내부에 구축되었으므로 커뮤니티 지원이 훨씬 우수합니다. 노드에 대한 라이브러리, 커뮤니티 문서, 라이브 예제, 유비쿼터스 패키지 관리자 등이 훨씬 많습니다. Erlang이 따라 잡고 있습니다. 이와 관련하여 그러나 여전히 훨씬 더 큰 램프입니다.

Node를 사용하면 재미있는 것을 꽤 빠르고 비교적 쉽게 프로그래밍 할 수 있으며, erlang이 오랫동안 해결 한 대규모 응용 프로그램과 관련하여 여전히 고통이 커지고 있습니다. Erlang은 프로그래밍 방식을 바꾸고 (imo) 더 나은 프로그래머를 만들지 만, 처음에는 인생을 쉽게 만들 수는 없습니다. 둘 다 다른 방식으로 재미 있습니다.


2
노드의 스레드도 '아무것도 공유하지 않는다'고 언급 할 가치가 있습니다.
Tamlyn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.