Noderから見たJSXについて

JSXアドカレの最後のエントリです。

なんとなくXXから見たYYというタイトルが流行りそうな気がしてきているのでまとめます。

Noderから見たJSXについて

今の会社に入って9月位になったらサーバーサイドのNode.jsをJSXで書いてました。具体的にはJSXでゲームを書いたり、運用のためのライブラリを書いてます。

以下の記事に触発されて書きます。

「Haxerから見たJSX」という感想文を書いてみた。

JSXすげーと思う所

profiler

僕が個人的に一番好きなのはJSXのプロファイラですね。どこのメソッドを何回コールして、どのメソッドでどれくらい時間がかかっているのかまで見れます。Node.jsのプロファイラもいくつかあるんですが、httpリクエストベースで見たり、その時のCPU、メモリ使用率が分かる程度で、メソッドの時間までは取れません。v8のprofilerでかなり細かく見れますが、JSXの方が手軽で多くの情報が得られます。(※その反面、profile時に重くなるというデメリットはあるので、JSX profilerのオーバーヘッドすらも無視できない場合はv8 profilerを見る羽目になりますが。)

コンパイル時にメソッド開始と終了にコードを埋め込んで時間と回数を測れるようにしているんですが、ここは他のaltJSではあまり実装されているのを見ないので、JSXならではの利点と言えると思います。

ちなみにProfilerについては@mootohさんがまとめてくれました。

Profiling JSX App

あらびきさんの日記も参考になります。

JSX のプロファイラが素晴らしい!

test

テストライブラリを言語が機能としてサポートしてくれているのはありがたいですね。簡単に動作確認ができますし、JSXの既存コードを触るときもクラスと同じファイルにtestスクリプトを書いて実行して確認する、うまく行ったらまた実装する、という実装=>コンパイル=>テスト(動作確認)のイテレーションを細かく繰り返せます

node.jsにもassertはありますが、テストライブラリとなるとmocha使ったり、jasmine使ったりする必要があって若干面倒。

ある程度言語に慣れるまでは小さな粒度で実装=>コンパイル=>動作確認=>実装を繰り返していったほうが効率的になると思うので、testの機能が組み込まれているのは初心者への優しさを感じます。

ちなみにテストについては以下の記事が参考になるかと。

JSX テストチュートリアル

JSX Advent Calendar 13th

最適化

人間が読みやすいコードよりも愚直に書かれたコードのほうが早い時があります。ただ愚直に書かれたコードは見難いものです。JSXだとうまく最適化コードに落としこんでくれてコードの可読性も性能も良い所どりができるという嬉しい機能。特にNode.jsからすると、NodeはCPUヘビーな処理に弱いという側面があるので少しでも最適化でリソースを効率化できるなら嬉しい限り。

最適化の詳細に関しては @kazuho さんのこのエントリが参考になります。

JavaScriptで高速なコードを書く際の注意点。または私は如何にして心配するのを止めてJSXを作ることにしたか

JSX これはつらぽよと思う所

node.jsのコアモジュールでメソッドが対応しきれていなかったり

コアモジュールに存在するはずのメソッドが使えなくて辛い時がありますね。参加当初、EventEmitteremitのメソッドが無くてEventEmitterなのに!!!と思ったことがあります。(今では呼べるようにしましたが。)

他にも clusterモジュールが無かったり、fsモジュールの非同期系メソッドが無かったりと色々ありますが、これらに関しては書いてて俺の仕事なのかもと思ってきたので、いつか対応します。

※ちなみにdomainは呼べるようにしました。

あと、やっぱりNode.jsのfunctionは基本的に引数が動的だし、型もバラバラなので、普通にJSXでバインドしようとすると overload するfunctionが多くなってしまいます。ここはJSXとNode.jsの相性の問題というよりも、静的型付けと動的型付けの問題なので、しょうがない部分が多いですね。

npmモジュールとのバインディング

やっぱりnpmにある人類の叡智を使いたい時があります。npmモジュールを使う場合、JSXではNode.jsのライブラリに存在する型やメソッドをJSXのnativeクラスとして定義する必要があります。これに関しては僕が参加した時には結構整備されていました。nativeクラスがサポートされていますし、それを使ったライブラリも色々存在しているので助かりました。

ただnode.jsのモジュールって

var hoge = require('hoge');
var hoge_instance = hoge('fuga');

みたいにrequireでモジュール呼び出しの際にfunctionを渡してそのfunctionを外から引数付きで呼び出してもらうケースが割りと多いのですが、そういうネイティブクラスのインスタンス化をする際に関数を呼び出す事が今のJSXではできないので、やろうとすると、evalに頼るしかないって所は残念。

※ これに関しては既に@wasabizさんにinput済みなので、いつしかやってくれると思います。

nativeクラスの書き方は@kazuho さん、@shibukawaさんの以下のエントリが参考になります。

JavaScriptバインディングの書き方

JavaScriptバインディングの書き方 Level 2

npmを使うときは@shibukawa さんのエントリが参考になります。

JSX + npm

実際にnpmモジュールを作った話はぼくのエントリを参考にして下さい。

socket.io.jsxを作った。

結び

JSXアドベントカレンダーの発案者は僕なのですが、実際にやりきって非常に有用な情報が増えたなーと思います。特に普通に使っているだけだと得られないようなJSXの将来の話JSXの誕生秘話など、JSXがどう発展していくのかヒントになるような話が多くて面白かった。

まだJSXは一歳半なので、もう少し開発者が増えるといいかなと思います。

JSXアドカレを読んでやってみたいという気になった方々には、 @shibukawa さんが作成した、jsx-initから始めるのもいいと思います。

JSXのプロジェクトをすばやく作る 〜 jsx-init

蛇足

あと↓な感じの萌えキャラ募集中です。

see Java、C++、Python…プログラミング言語擬人化計画!

// アドベントカレンダーを同日に2つもエントリするものじゃない。