sourcecode

바퀴의 재창조: 노드.JS/이벤트 기반 프로그래밍 대.기능적 프로그래밍?

codebag 2023. 10. 25. 23:19
반응형

바퀴의 재창조: 노드.JS/이벤트 기반 프로그래밍 대.기능적 프로그래밍?

요즘 노드에 대한 모든 광고가 있어요.자바스크립트 콜백을 이용한 이벤트 기반 프레임워크인 JS.제가 알기로는, 그것의 주된 장점은 순차적으로 기다릴 필요가 없다는 것입니다(예를 들어, 다른 함수를 호출하면서 SQL 결과를 가져올 수 있습니다).

그래서 제 질문은 이것이 CL, 하스켈, 클로저 등과 같은 단순히 기능적인 언어들보다 어떻게 다르거나 더 나을까 하는 것입니다.더 나아지지 않는다면, 사람들은 (자바스크립트로 바퀴를 다시 만드는 대신) 기능적인 언어만 사용하면 어떨까요?

저는 어느 노드도 경험이 없으니 참고하시기 바랍니다.JS 또는 함수 프로그래밍.그래서 약간의 기본적인 설명이 도움이 될 수 있습니다.

노드를 다 읽었습니다.JS 문서(그리고 멋진 슬라이드 데크), 여기 있는 다른 답변들은 그것에 대한 요점을 놓치고 있다고 생각합니다: 노드.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를 차단하기 때문입니다.그러나 자바스크립트는 전자(JS가 브라우저에서 사용되는 것과 같은 이벤트에서 사용되는 방식을 고려할 때 프로그래머들이 사용됩니다)와 노드를 제공합니다.JS는 나중에 완전히 이벤트 기반 I/O 라이브러리가 되어 통화를 차단하지 않습니다.

이것이 기능적 프로그래밍과 어떤 관련이 있습니까?모든 기능적 프로그래밍 언어는 노드가 수행할 수 있을 정도로 강력한 폐쇄 구조를 제공합니다.JS는 자바스크립트로 하려고 합니다.대부분은 코드를 더 쉽게 만들 수 있는데, 지나가는 폐쇄가 일반적으로 언어의 기본이기 때문입니다.

해스켈의 경우 모나드를 사용하면 이런 종류의 것은 매우 쉽게 만들 수 있습니다.예를 들어,

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

이러한 매우 순차적이고 명령적인 코드 라인들은 실제로 제어되는 일련의 폐쇄들입니다.IO 마치 에서 monad를 쓴 과 같습니다 마치 당신이 자바스크립트로 작성한 것과 같습니다.

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

본질적으로, 모나딕 코드를 함수 언어로 작성할 때, 이미 노드 형태로 작성하고 있는 것입니다.JS 저자들은 다음과 같이 적길 원합니다.순차적 계산의 각 단계가 이전 단계에 대한 종결로 전달되는 경우.하지만, 그 코드가 하스켈에게 얼마나 더 멋지게 보이는지 보세요!

또한 동시 Haskell 기능을 쉽게 사용하여 이러한 무중단 운영을 쉽게 달성할 수 있습니다.

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

헷갈리지 마세요.forkIO값비싼 프로세스 포크를 사용하거나 OS 프로세스 스레드를 사용할 수도 있습니다.기본적으로 노드와 동일한 경량 실행 스레드입니다.JS는 (다소 의미론이 풍부한 경우에만) 사용하고 있습니다.노드처럼 1,000개를 가질 수 있습니다.JS의 목표는.

그래서 간단히 말해서 노드라고 생각합니다.JS는 자바스크립트에 존재하는 기능을 기반으로 구축하고 있지만 기능 언어에서는 훨씬 더 자연스럽습니다.게다가 노드에 있는 모든 요소들이 다 그런 것 같아요.JS는 이미 Haskell과 그 패키지에 존재하고 있고, 그리고 일부는.저라면 그냥 해스켈을 쓰겠어요!

노드에 대해서는 잘 모릅니다.JS도 그렇지만, 저는 (당신의 설명에서) 그것과 기능적 프로그래밍 사이에 두드러진 유사성을 발견하지 못합니다.설명을 들어보니 노드.JS는 비동기식 프로그래밍을 돕는 것을 목표로 하는 것 같습니다. "순차적으로 한 단계씩 기다릴 필요가 없다."라고 말할 때, 오래 실행되는 하나의 작업이 자신의 작업을 수행하는 것처럼 다른 작업을 수행할 수 있습니다.

함수적 프로그래밍은 이것과 완전히 직교합니다. 즉, 비동기성에 대한 링크가 없습니다.다른 것 없이 하나를 가질 수도 있고, 둘 다를 가질 수도 있고, 둘 다 가질 수도 있고, 둘 다 가질 수도 없습니다.함수 프로그래밍은 프로그램에서 부작용을 제거하고 언어의 일급 구성원으로서 함수를 다른 값과 유사하게 조작하고 구성할 수 있도록 하는 것입니다.

이것은 정말로 "바퀴를 새로 만드는 것"이 아닙니다. 자바스크립트는 그 자체로 기능적인 언어는 아니지만, 이것은 Lisp에 기반을 두었고, 이것은 이것이 하도록 고안된 것입니다.제 생각에는 자바스크립트가 OO언어보다 리스프어의 기능어로서 더 강합니다.그렇기 때문에 jQuery와 같은 강력한 기능* 디자인의 프레임워크가 언어에 매우 적합합니다.

(* 참고:분명 순수하지는 않지만 Scheme과 거의 동일한 방식으로 작동합니다.)

아직 node.js를 사용하지는 않았지만, 확실히 관심이 있어서 곧 사용해 볼 예정입니다.여기에는 이미 기능적 프로그래밍 등에 대한 훌륭한 답변들이 많이 있기 때문에 그 부분에 대해서는 말씀드리지 않겠습니다.

왜 서버에서 해스켈, 클로저 등 다른 언어를 사용하지 않느냐고 묻습니다.저에게 node.js의 매력은 javascript라는 점입니다.이미 클라이언트에서 자바스크립트를 많이 사용하고 있어서 서버와 클라이언트 모두에서 하나의 언어로 작업할 수 있습니다.

이를 통해 개발을 간소화하고 간소화할 수 있기를 희망합니다. 왜냐하면 컨텍스트를 그렇게 급격하게 전환할 필요가 없기 때문입니다.클라이언트와 서버 모두에서 사용되는 일부 로직을 공유할 수 있다면(아마도 유효성 검사 코드 등) 작업이 다소 줄어들 수도 있습니다.

자바스크립트가 웹 서버로서 노드에서 핵심적인 역할을 하는 것은 그것이 주로 이벤트 중심이라는 것입니다.

기능적 프로그래밍은 무엇보다 불변성 때문에 동시성에 장점이 있다고 생각합니다.

다른 기능 언어들이 얼마나 이벤트 중심적인지는 확실하지 않습니다. 단지 노드의 장점의 일부로서 그것을 강조하고 싶었을 뿐입니다.

클라이언트와 서버 사이의 간격이 줄어드는 주된 이점 중 하나는 클라이언트와 서버에서 코드를 재사용할 수 있다는 것입니다.예를 들어 현대 브라우저용으로 풍부하고 동적인 AJAX 웹 사이트를 사용하고 이전 브라우저용으로 풀다운 버전을 사용하려면 클라이언트와 서버 모두에서 동일한 디스플레이 코드를 사용하여 인컴 데이터를 포맷할 수 있습니다.

웹 앱을 오프라인으로 실행할 수 있는 로컬 스토리지 DB 및 서버를 보유할 수 있는 HTML5/Google Gears/Adobe Air의 다른 이점도 있습니다. 서버를 사용할 수 없을 때 기존에는 로컬에 저장되어 있던 코드를 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1862861/reinventing-the-wheels-node-js-event-driven-programming-v-s-functional-program

반응형