Smalltalkerを除いて動的言語のプログラマが使っているツールとIDEは低いレベル言語で書かれている。ある言語のための開発ツールをその言語で書くことには、とりわけユーザ(つまり開発者)大きな利点がある。エディタやIDEの場合、開発者は他の言語やプラットフォームを扱わずに拡張できる。Java開発者はJavaベースのIDEを一覧から選択できる。どれもJavaのコードを少し書けば拡張できるIDEだ。しかし、JavascriptやRubyの場合、こうはいかない。
ふたつの新しいIDEがこの状況を変えようとしている。JavascriptのためにJavascriptで書かれたIDEであるCloud9 IDEとJRubyのためにJRubyで書かれたRedCarだ。
Cloud9 - Javascript
5年前にはJavascriptとHTMLで書かれた本格的なエディタやIDEを想像するのは難しかった。しかし、JavascriptのVMが圧倒的に早くなり、HTMLも洗練されたエディタを作れるくらいの機能を得た。Mozillaのプログラマ向けエディタであるSkywriter(以前はBespinとして知られた)はエディタを描画するためにCanvas要素とそのAPIを利用する。
Cloud9は起動時(ブラウザ内での)、Eclipseに見た目が少し似ている。またIDE全体がプラグインによって作られるアイディアも一緒だ。エディタ、ビュー、振る舞いなどのすべての機能はプラグイン経由で提供される。Javascriptの利点をひとつはプラグインメタデータディスクリプタの中にある。これはJSONで書かれていて、Javascriptで簡単に(そして巧みに)扱うことができる。プラグイン開発者は面倒が少なくなる。
機能については少なくとも他の成熟したIDEと比べれば、今のところCloud9は初期段階にある。しかしこのIDEにはすでに便利な機能が搭載されている。Javascriptのデバッグサポート機能にはGUIもあり、Node.jsとChromeのランタイムを使ったデバッグのためのコネクタもある。Cloud9でJavascriptのプロジェクトを作り、Node.js上でデバッグモードでこのプロジェクトを実行し、GUIを使って一時停止、再開、実行を管理できる。また、ブレイクポイントの設定もできる。この機能を使えばJavascriptのVMに組み込まれたデバッガを利用できるのだ。
Cloud9はエディタコンポーネントとしてACEを使っている。Skywriterがエディタを描画するのにCanvasを使っているのに対して、ACEはDOMを使っている。エディタ部分はDIVでできている。ACEはエディタのバッキングストア内のどのラインをスクリーン上に表示するのかを決め、各ラインをDIV要素として描画し、それをエディタのDIVに追加する。ACEが使う複数レイヤのDIVを使うのは、エディタの複数の要素を描画するためだ。特に、選択部分のハイライトとカーソルで利用する。
現在のHTMLの描画処理とDOMはこのようなことができるほど高速なので、ACEもネイティブのエディタコンポーネントと同じくらいの速さに感じられる。
HTML5のAPIの中でエディタコンポーネントにとって便利なのはWeb Worker APIだ。このAPIはJavascriptのコードからJavascriptの新しいプロセスを起動することができる。これはスレッドではなくシェアードナッシングプロセスだ。このプロセスはJSONを含むデータをメッセージとして送信できる。プログラマが利用するエディタにとって、バックグラウンドでタスクを処理できることはとても重要だ。多くの処理があらゆるキーストロークやあらゆる操作の度に多くの処理を行わなければならないからだ。正規表現を使ったシンタックスのハイライトが一例だが、現代のエディタはセマンティクスによるハイライトによってソースコードを解析できなかればならない。例えば、ローカル変数とグローバル変数の色分けや静的メソッドと仮想メソッドの色分け、コードを認識して折り畳む機能などだ。
このような処理はフォアグランドのスレッド(GUIスレッドやイベントディスパッチングイベント)で行う場合、setTimeout
関数を上手く利用することで実現できる。しかし、Web Workersを使えばこのようなハックを行わなくてもよい。マルチコアを潜在的に利用したバックグランド処理で実現できる。
その名前に反してCloud9は既定ではローカル環境にインストールしローカルファイルシステムにアクセスする。それゆえCloud9はNode.js上で動作するJavascriptをバックエンドとして利用し、両者はソケットで通信する。ファイルの内容はWebDAVを使ってNode.jsから提供される。これにはjsdavライブラリが使われる。
SkywriterとCloud9のチームは興味深い協力体制を発表した。この協力でプラグインや特定の言語に特有の機能を共有できる。これが上手く動作すれば他のIDEとの戦争を回避できる。
Cloud9 IDEのブログにはこのリリースについての更新点や情報が書かれている。GitHubのリポジトリはソースコードを使ってCloud9を利用してみるのに便利だ。インストールはソースコードをチェックアウトすればいい。そしてNode.jsを使ってバックエンドのサーバを起動すれば、ブラウザでCloud9 IDEを表示できる。
RedCar - JRuby
RedCarはIDE指向の拡張可能なエディタであり、Ruby、正確に言えばJRubyで書かれている。RedCarはGUIフレームワークに多くのプラットフォームで利用できるSWTを使う。
組み込みのREPLを利用することで、APIの検証や実験を行える。また、既存のプラグインを使えばシステムの拡張も始められる。実際にRedCarはHTML/Javascriptでも拡張できる。ビューはSWTウェブコンポーネントを含むことができる。これを使うことで、SWTコンポーネントや描画APIを使う代わりに、HTML/Javascript/CSSを使ったGUIや表示を構築できる。
RedCarはTextMateのバンドルをサポートするのでTextMateからの移行は簡単だ。TextMateのユーザは喜ぶだろう。
RedCarについての全体的な紹介や、コンセプト、拡張方法などについてはInfoQが行ったRedCarnの作者であるDan Lucraft氏へのインタビューを参照されたい。RedcarのTwitterアカウントとRedcarのブログも新しいプロジェクトや機能についての最新の情報を得るのに好適だ。RedcarはRuby Gemからインストールできる。