2009-12-07 3 views
19

요즘에는 약 Node.JS에 대한 과장된 내용이 있습니다. 이벤트 중심 프레임 워크는 자바 스크립트 콜백을 사용합니다. 내 제한된 이해로, 그것의 주요 장점은 순차적으로 단계별로 기다릴 필요가없는 것 같습니다 (예를 들어, 다른 기능을 호출하는 동안) SQL 결과를 가져올 수 있습니다.바퀴 재발 명 : Node.JS/이벤트 중심 프로그래밍 v.s. 함수 프로그래밍?

내 질문은 : 어떻게 다르고, 또는 CL, 하스켈, Clojure 같은 그냥 기능적인 언어보다 더 나은 무엇입니까? 그다지 좋지 않다면 왜 사람들은 그냥 기능 언어를하지 않습니까 (대신에 자바 스크립트)?

Node.JS 또는 기능 프로그래밍 중 어느 것에도 경험이 없습니다. 그래서 몇 가지 기본적인 설명이 도움이 될 수 있습니다.

답변

10

나는 Node.JS에 관해서는 잘 모르겠다. 그러나 나는 (당신의 설명으로부터) 그것과 기능적 프로그래밍 사이에 어떤 현저한 유사성을 보지 못했다. 귀하의 설명에서, Node.JS는 비동기식 프로그래밍을 돕는 것을 목표로합니다. "순차적으로 단계적으로 대기 할 필요가 없습니다"라고 말하면서 하나의 장기 실행 작업이 그 일을하는 것처럼 다른 작업을 수행 할 수 있습니다.

기능 프로그래밍은 완전히 직각입니다. 즉, 비동기에 대한 링크가 없습니다. 당신은 다른 사람없이, 또는 함께 또는 어느 누구도 가질 수 없습니다. 기능적 프로그래밍은 프로그램의 부작용을 제거하고 언어의 일류 구성원으로서 기능을 다른 값과 비슷하게 조작하고 구성하는 것에 관한 것입니다.

+2

기능 프로그래밍은 순수한 언어를 의미하지 않습니다. 하스켈은 이것을 선택합니다. – codebliss

+3

나는 그것이 결코 주장하지 않았다는 것을 유의하십시오. 프로그래밍 스타일은 그 정의대로입니다. 그것에 관한 약간의 논쟁. 스타일을 허용하는 언어, 주요 초점이 해당 스타일을 지원하는 언어 또는 다른 스타일을 지원하지 않는 언어 만 허용하도록 허용해야하는 기능적 프로그래밍 언어에 대해 계속 논의가 있습니다. 그것은 다른 토론입니다. – harms

3

이것은 실제로 "바퀴를 재발 명하지 않습니다." Javascript는 실제로는 기능적 언어 그 자체가 아니지만 Lisp을 기반으로했으며 이것은 설계된 것입니다. Javascript는 제 의견으로는 OO 언어보다 Lisp-ish 기능적 언어로서 더 강합니다. 그렇기 때문에 jQuery와 같이 강력하게 기능이 뛰어난 디자인이있는 프레임 워크가 언어에 잘 어울리는 이유입니다.

는 (* 참고 :. 계획과 거의 같은 방법으로 분명, 순수,하지만 작동하지 않습니다) 웹 서버와 같은 노드에서

0

자바 스크립트의 핵심적인 역할은 크게 이벤트 기반 것입니다.

필자는 함수 프로그래밍이 다른 것들과의 불변 성으로 인해 동시성에 이점이 있다고 생각합니다.

다른 기능 언어가 이벤트를 주도하는 방식을 잘 모르는 경우 노드의 장점 중 일부로이를 강조하고 싶습니다.

33

Node.JS 문서 (및 멋진 slide deck)를 통해 읽었을 때, 여기에 대한 다른 대답은 그것에 대한 요점이 누락되어 있다고 생각합니다. Node.JS는 우리가 기대하는 프로그램 작성 스타일 I/O를 차단하는 것은 잘못된 것이며 대신에 I/O (예 : 데이터베이스 읽기 또는 소켓 읽기)를 시작하고 요청과 함께 I/O 결과를 처리하는 함수를 전달해야합니다.

그래서보다는 이렇게 :

var result = db.query("select.."); // blocking 
// use result 

Node.js를이 일을 생각을 기반으로합니다

db.query("select..", function (result) { 
    // use result 
}); 

저자를 (노드의.JS)는 언어가 클로저 나 익명의 함수를 가지지 않고 라이브러리가 주로 I/O를 차단하기 때문에 이러한 프로그래밍 방식이 많은 시스템에서 매우 어색하다는 것을 지적했다. 그러나 Javascript는 전자를 제공합니다 (프로그래머는 JS가 브라우저의 방식과 같은 이벤트에서 사용되는 방식을 감안할 때 익숙합니다). Node.JS는 블로킹 콜이없는 완전히 이벤트 기반의 I/O 라이브러리입니다. 조금도.

함수 프로그래밍과 어떤 관련이 있습니까? 모든 함수형 프로그래밍 언어는 Node.JS가 Javascript로 수행하려고하는 것을 수행 할 수있는 강력한 클로저 구조를 제공합니다. 대부분 클로저는 일반적으로 언어의 기본이므로 코드 작성이 더 쉽습니다.

모나드를 사용하는 하스켈의 경우 이런 종류의 일은 매우 쉽게 구성 할 수 있습니다. 예를 들어 :

doQuery :: DBConnection -> IO() 
doQuery db = do 
    rows <- query db "select..." 
    doSomething rows 
    doSomethingElse rows 

코드이 매우 순차적 필수적 라인은 실제로 IO 모나드의 통제하에 폐쇄의 순서입니다. , 기능적인 언어로 모나드 코드를 작성할 때, 당신은 이미 양식을 작성하는 본질적으로

db.query("select...", function (rows) { 
    doSomething(rows, function() { 
     doSomethingElse(rows, function() { /* done */ }) 
    }) 
}) 

Node.js를 저자는 우리가 쓰고 싶은 : 자바 스크립트에서 당신이 쓴 것처럼 그것은 어디 각 단계 순차 계산의 결과는 종결 점으로 전달됩니다. 그러나 코드가 하스켈에서 얼마나 멋지게 보이는지보십시오! 비싼 당신이 사용하고 프로세스 포크, 또는 OS 프로세스와 그 forkIO을 혼동하지 마십시오

forkQuery :: DBConnection -> IO ThreadId 
forkQuery db = forkIO $ do 
    rows <- query db "select..." 
    doSomething rows 
    doSomethingElse rows 

:

또한, 당신은 쉽게 동시 하스켈은 쉽게 비 차단 작업을 달성하기 위해 기능을 사용할 수 있습니다 스레드. 이것은 기본적으로 Node.JS가 사용하는 경량 실행 스레드와 같습니다 (다소 풍부한 의미로만). Node.JS가 목표로하는 것과 같이 1,000 대를 가질 수 있습니다.

간단히 말해서 Node.JS가 JavaScript에있는 기능을 기반으로하고 있다고 생각하지만 기능 언어에서는 훨씬 자연 스럽습니다. 게다가 Node.JS에있는 모든 요소는 이미 Haskell과 그 패키지에 존재한다고 생각합니다. 나를 위해, 나는 단지 하스켈을 사용할 것입니다!

+1

+1 하스켈 예제. 정말 고맙습니다. –

+0

우선 +1. 이것은 명확하고 균형 잡힌 대답입니다. 그러나 두 가지 모두를 사용하면서 엄격한 이름 지정 및 콜백 명명을 통해 어색함이 사라집니다. JS는 C 계열 언어의 옷을 입은 기능적 언어의 일부이며, 둘 다의 비트로 마무리됩니다. 나는 철학적 인 유연성이 노드에서 JS로 코딩하는 것을 더 빠르고 재미있게 만든다는 것을 알았다. 그게 나 일 뿐이야! – qubyte

1

나는 아직 node.js를 사용하지 않았지만, 나는 그것에 관심이 많으며 곧 시도 할 것입니다. 함수 프로그래밍과 여기에 대해서는 이미 많은 답변을 얻었으므로 여기서는 다루지 않을 것입니다.

당신은 haskell, Closure 등의 서버에서 다른 언어를 사용하지 않는 것이 좋습니다. 나에게있어서 node.js의 매력은 자바 스크립트라는 것입니다. 내 응용 프로그램은 이미 클라이언트에서 자바 스크립트로 무겁기 때문에 서버와 클라이언트 모두에서 하나의 언어로 작업 할 수 있음을 의미합니다.

내 생각에 컨텍스트를 너무 크게 전환 할 필요가 없기 때문에 개발이 간소화되고 간소화됩니다. 클라이언트와 서버 모두에서 사용되는 일부 로직을 공유 할 수있는 경우 (아마도 유효성 검사 코드 등을 형성 할 때) 작업량이 약간 감소 할 수도 있습니다.

0

클라이언트와 서버 사이의 갭을 줄이는 주요 이점 중 하나는 클라이언트와 서버에서 코드를 재사용 할 수 있다는 것입니다. 예를 들어, 최신 브라우저를위한 풍부하고 역동적 인 AJAX 웹 사이트를 원하고 오래된 브라우저의 경우 제거 된 버전을 사용하려는 경우 동일한 표시 코드를 사용하여 클라이언트와 서버 모두에서 데이터를 포맷 할 수 있습니다.

기타 이점으로는 HTML5/Google Gears/Adobe Air를 사용하여 로컬 저장소 DB 및 서버에서 웹 응용 프로그램을 오프라인으로 실행할 수있는 기능을 제공합니다. 서버가있을 때 로컬로 저장되는 서버에 기존 코드가있을 수 있습니다. 사용 불가.