読者です 読者をやめる 読者になる 読者になる

Node.jsがどうして注目されているのか、もしくはどうして他のサーバサイドJavaScriptはスルーされているのか

サーバサイドJavaScriptにはNode.js以前にもいくつかの実装がある。ちょっと前に注目されかけたものだと、現在はAppcelerater社に買収されたAptana社が出していたJaxerなどがあるが、きちんと調べるとRingoJsnarwhalv8cgiなど選択肢の一つとして数えられるサーバサイドJavaScript実装がいくつかある。ただ、これらはNode.jsのように注目を浴びているわけではない。

Node.jsとこれらの既存のサーバサイドJavaScriptの違いは、他のサーバサイドJSの動作モデルが既存のサーバサイドのものと変わらないのに対して、Node.jsの場合はそうではないから。具体的には、HTTPコネクションのハンドリング戦略が違っていて、既存の動作モデルが1コネクションに対して1プロセス/スレッド消費するのに対して、Node.jsの場合は非同期I/Oを用いて一つのプロセスでいくつものHTTPコネクションを扱う。この動作モデルのおかげでNode.jsは多数のHTTPコネクション(=ユーザ)=高トラフィックを効率良く扱える。これは既存のサーバサイドJavaScriptの利点でよく言われるようなクライアントサイドで使っているJavaScriptでサーバサイドも記述できるよ、という利点とは全く別ものである。

Node.jsのサイトのトップページを見ると、「Evented I/O for V8 javascript」と書いてある。Evented I/Oとはイベント化されたI/O、要するに非同期入出力のことで、Node.jsではひとつのプロセスで多くのHTTPコネクションを扱う動作モデルを取っているので、入出力処理で処理がブロックされないように入出力処理を全て非同期で扱うようになっている。クライアントサイドでのJavaScriptでもよく見る例で言うと、ajaxでHTTPレスポンスが返ってきた時の振る舞いをコールバックとして予め登録してレスポンスを非同期に処理するのと似ている。

ちなみに、言語処理系としてのV8はPHPPerlPythonRubyなどの各言語の最もポピュラーな実装よりもおおむね速い。これは言語処理系としてのアーキテクチャがV8とこれらは違うからで、V8は正規表現も含めてJavaScriptのコードがJITコンパイルされて実行時には機械語をそのまま実行する形になるのに対して、PHPPerlPythonRubyはコードを内部の仮想マシン(例えばPHPだとZendEngine、RubyだとYARV)で実行出来るコードにコンパイルして実行時にはそのコードを仮想マシンで実行していくという形をとっているからと考えられる。またこれらの実装で使われている正規表現エンジンである鬼車やPCREも、与えられた正規表現を内部の仮想マシン向けのコードにコンパイルして実行するという同様の形を取っている。

というわけでNode.jsの動作モデルについて興味持った方は以下のリンクを参照するとより正しくより詳しい記述を見ることができる。

単にNode.jsでアプリ作ってみたいとかだったら、よくあるNode.js入門記事とか見つつNode.js入れてnpm(Node.jsのライブラリのパッケージマネージャ)入れてnode-dev(スクリプトを更新したら自動的に再起動してくれる開発必須ツール)入れてExpress入れたりしてみるとよいと思う、まる。