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과 그 패키지에 존재한다고 생각합니다. 나를 위해, 나는 단지 하스켈을 사용할 것입니다!
기능 프로그래밍은 순수한 언어를 의미하지 않습니다. 하스켈은 이것을 선택합니다. – codebliss
나는 그것이 결코 주장하지 않았다는 것을 유의하십시오. 프로그래밍 스타일은 그 정의대로입니다. 그것에 관한 약간의 논쟁. 스타일을 허용하는 언어, 주요 초점이 해당 스타일을 지원하는 언어 또는 다른 스타일을 지원하지 않는 언어 만 허용하도록 허용해야하는 기능적 프로그래밍 언어에 대해 계속 논의가 있습니다. 그것은 다른 토론입니다. – harms