2009-12-07 16 views
19

最近、Javascriptコールバックを使用するイベントドリブンフレームワークであるNode.JSについての誇大宣伝があります。私の限られた理解のために、その主な利点は、段階的に段階的に待つ必要がないということです(例えば、SQL結果を、フェッチできる間に他の関数も呼び出します)。車輪の再発明:Node.JS /イベント駆動型プログラミングvs。機能プログラミング?

私の質問は、これはCL、Haskell、Clojureなどの機能的な言語とはどのように異なっているか、それとも優れているのでしょうか?もしそれほど良くないのであれば、なぜ人々は単に機能的な言語をやっていないのですか?(の代わりに、Javascriptでホイールを再作成するのですか?

私はNode.JSでも関数型プログラミングでも経験はありません。だから、いくつかの基本的な説明が役に立ちます。

答えて

10

私はNode.JSについて本当に知りませんが、(あなたの説明から)それと機能的なプログラミングの間にはっきりとした類似点はありません。あなたの説明から、Node.JSは非同期プログラミングを支援することを目的としているようです。「あなたは段階的に段階的に待つ必要はありません」と述べているように、長時間実行するタスクの1つとして、他のタスクを実行できます。

機能プログラミングはこれとは完全に直交しています。つまり、非同期性へのリンクは実際にはありません。あなたは、他の人がいなくても、両方とも一緒に存在していても、どちらも存在しなくてもかまいません。機能的プログラミングとは、プログラムの副作用を排除すること、および機能を他の値と同様に操作して構成する、ファーストクラスのメンバとして機能させることです。

+2

正直言って、機能プログラミングは純粋な言語を意味するものではありません。ハスケルはこれを行うことを選んだだけです。 – codebliss

+3

私はそれを主張したことはないことに注意してください。プログラミングスタイルは、私が定義した通りです。それについての少しの論争。スタイルを許す言語、主な目的がそのスタイルをサポートしている言語、または他のスタイルをサポートしていない言語のみを「関数型プログラミング言語」と呼ぶべきであることについて、進行中の議論があります。それは別の議論です。 – harms

3

これは実際には「ホイールを再発明する」というわけではありません。 Javascriptは本当に機能的な言語そのものではありませんが、それはLispに基づいていました。これは、それが行うように設計されたものです。 Javascriptは、私の意見ではOO言語であるよりも、Lisp-ish関数型言語として実際に強力です。そのため、jQueryのような強力な機能を備えたフレームワークは、言語にあまり適しています。

は(*注:スキームとほとんど同じ方法で、明らかに、純粋な、しかし、機能しません)ウェブサーバとしてノードで

0

のJavascriptの重要な役割は、主にイベント駆動型であるということです。

私は、関数型プログラミングは、他のものとの不変性のために並行性に利点があると考えています。

イベント駆動型の他の関数型言語は、ノードの利点の一部としてハイライトしたいだけです。

33

Node.JSドキュメント(と素敵なslide deck)を読んで、私はここで他の答えがそれについてのポイントを見逃していると思います:Node.JSは、我々がそれらを期待するプログラムを書くスタイルI/Oをブロックするのは間違っています。代わりに、I/O(データベースの読み込みやソケットの読み込みなど)を開始し、その要求と共にI/Oの結果を処理する関数を渡す必要があります。

そうではなく、この操作を行います。ノードの著者は、(

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

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

のNode.jsをこれを行うの考えに基づいています。JS)は、言語がクロージャーや匿名関数を持たず、ライブラリが主にI/Oをブロックしているため、このプログラミング方法は多くのシステムでは非常に扱いにくいと指摘しています。しかし、Javascriptは前者を提供しています(プログラマーはJSがブラウザのようなイベントでどのように使用されているかを前提としています)、Node.JSは後で入力します。ブロッキング呼び出しのない完全イベント駆動のI/Oライブラリまったく。

これは関数型プログラミングとどのように関連していますか?すべての関数型プログラミング言語は、Node.JSがJavascriptで何をしようとしているかを行うのに十分強力なクロージャー構造を提供します。クロージャを渡すことは一般的に言語にとって基本的なものなので、ほとんどの場合、コーディングがさらに簡単になります。

Monadsを使用しているHaskellの場合、この種のものは構築が非常に簡単です。たとえば:

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

コードのこれらの非常にシーケンシャル、不可欠の線は、実際にIOモナドの制御下で、クロージャのシーケンスです。このJavaScriptであなたが書かれたかのようである:関数型言語でモナドのコードを書くときに本質的に

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

を、あなたはすでにのNode.jsの作者は私たちが書きたい形でそれを書いている:各ステップ逐次計算のうちの1つは、クロージャとして前の計算に渡される。しかし、コードがHaskellでどれくらいうまく見えるかを見てください!高価なあなたが使用しているプロセスのフォーク、あるいはOSのプロセスとそのforkIOを混同しないでください

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

さらに、あなたは簡単に同時Haskellは簡単にこの非ブロック操作を実現する機能を使用することができますスレッド。これは基本的に、Node.JSが使用している軽量の実行スレッドと同じです(多少意味のあるセマンティクスでのみ)。 Node.JSが目指すのと同じように、1000年代のことができます。

つまり、Node.JSはJavaScriptに存在するファシリティに基づいて構築されていると思いますが、それは関数型言語ではもっと自然です。さらに、私はNode.JSにあるすべての要素がすでにHaskellとそのパッケージに存在していると考えています。私にとって、私はハスケルを使うだけです!

+1

+1 Haskellの例です。私は本当にそれを感謝します。 –

+0

まずは+1。これは明確でバランスの取れた答えです。しかし、両方を使用していると、厳密でコールバックの名前を付けることによって、厄介なことのいくつかがなくなることがわかりました。 JSはC言語の服を着ている機能的な言語の一種であり、あなたは両方のビットを使いこなす。私は哲学的な柔軟性がノードでJSでコーディングを素早く楽しくすることを発見します。それだけでも私です! – qubyte

1

私はまだnode.jsを使用していませんが、私は間違いなくそれに興味があり、すぐに試してみます。関数型プログラミングについてはすでにたくさんの素晴らしい答えがありますので、ここでは取り上げません。

あなたはなぜhaskell、Closureなどのサーバ上で他の言語を使用しないのか尋ねます。私にとって、node.jsの魅力は、それがjavascriptだということです。私のアプリケーションはすでにクライアントのJavaScriptに重いので、サーバーとクライアントの両方で1つの言語で作業できるということです。

私は、コンテキストを非常に切り替える必要がないため、開発を合理化して単純化することを希望します。クライアントとサーバーの両方で使用されるロジックが共有されている場合(おそらく検証コードなどを作成する場合)、作業量がいくらか削減されることさえあります。

0

クライアントとサーバーのギャップを埋める主な利点の1つは、クライアントとサーバーでコードを再利用できることです。たとえば、最新のブラウザ用に豊かでダイナミックなAJAX Webサイトを使用し、古いブラウザ用の古いバージョンを削除する場合は、同じ表示コードを使用してクライアントとサーバーの両方でデータをフォーマットできます。

これに加えて、HTML5/Google Gears/Adob​​e Airには、ローカルのストレージDBとサーバーを使用してオフラインでWebアプリケーションを実行できる機能が含まれています。利用不可。

関連する問題