Node.jsの新版について。ライアン・ダール氏による東京Node学園祭 基調講演(後編)
サーバサイドJavaScriptとして話題になっているNode.jsの開発者ライアン・ダール氏が来日し、都内で開催されたNode.jsのイベント「東京Node学園祭」で基調講演を行いました。
本記事は「Node.jsのコンセプトとは? ライアン・ダール氏による東京Node学園祭 基調講演(前編)」の続きです。
新バージョンではWindows版も登場

Nodeは2歳半になりました。(会場拍手)

来週、第3安定版となるv0.6を出します。これらの新機能をこれから紹介します。

v0.4は、WindowsではCygwinでしか実行できませんでした。Cygwinはエミュレーションレイヤですが、古くて遅くてバギーでした。そこでMicrosoft、Cloudkick、Joyentの4人のチームでWindows版に取り組んできました。
v0.4ではlibdevとliveioが使われていました。これらはUNIXでノンブロッキングと非同期I/Oを実現するライブラリですが、Windowsでは概念があまりに違っていて対応が難しいものでした。
一方、WindowsにはIOCP(I/O Completion Port)がありますが、IOCPはUNIXのファイル記述子のようなものではありません。UNIXのやり方では、ファイル記述子の状態が変わるのを待ってノンブロッキングI/Oを行いますが、IOCPではまったく違っていて、スケジューラがやってくれるので書き込むだけでいい。UNIXはノンブロッキング、Windowsは非同期、それがひとつの違いでした。
WindowsにはBSDソケットもありますが、多重化があまりできず、数千、数万コネクションをWinSock APIで行うのは難しいです。
そこでUNIXではいままでのAPIを使いWindowsではIOCPを使うライブラリ、libuvを作りました。

TCPソケットはもちろんノンブロッキングで、HTTPサーバを書くのに必要な機能は揃っています。

DNSの解決も非同期にできるようになり、非同期ファイルシステムAPIもあります。プラットフォームに依存しますが、Solarisならナノセカンドの分解能まで時刻がとれます。

Windowsターミナルはくそったれで、どこかでマイクロソフトは間違えてしまっています。テキストを表示して色を変えるのにシステムコールが必要。そこでエスケープコードをlibuvが解釈して使えるようにしました。変わらないAPIを提供するのが目的でもあるからです。

NodeがWindowsをサポートすることで、UNIXでの実行速度が遅くなるのではないかと心配されていました。しかし簡単なHello Worl的なベンチマークで計測したところ、速くなっています。その違いの多くはJavaScriptのV8が速くなったからですが。

そのほかにも、V8 3.7でCrankshaftがデフォルトになり、繰り返し実行される部分の最適化が行われます。
V8 Isolatesでは、1つのアドレススペースでプロセス内の複数のVMを利用可能になります。つまりV8の中でのマルチスレッドです。これからの数週間でこれを導入する予定。
ガベージコレクションが新しくなって、これまで1.7GBに制限されていたヒープサイズが無制限になりました。

Nodeの子プロセスを起動し、コミュニケーションを容易にする機能。

Clusterは、たくさんのモジュールを1つのファイル記述子を使って管理するようなものです。
このコードでは、マスタープロセスが2つの子プロセスをフォーク。子プロセスも同じスクリプトを使って、hello worldを実行。マシンのリソース全部を使うようなサーバを作れます。

(会場から質問)クラスタについて、ワーカーごとにメモリスペースを持っているとすると、それを共有する仕組みはありますか?
いまはそれぞれのワーカーがそれぞれのメモリを持っていて、共有する方法はありません。
この先V8 Isolatesを使って子プロセスを起動するときは、スレッドかプロセスかを指定できるようにするつもり。アドオンなどを開発するデベロッパーのために、JavaScriptのオブジェクトを共有できるようにもするつもりです。
ライアンダール氏の資料へのリンク