Appcelerator’s Titanium = Cross platform beautiful GUI framework?

by syoyo

長年のクロスプラットフォーム GUI ツール探しの旅が、ようやく一つの終わりになりそうだ.

fltk, wx, gtk, etc いろいろ試してきたが、
クロスプラットフォームで open source で, beautiful でカスタマイズ可能なルックも実現できる GUI ツールキットには
なかなか出会えませんでした(かといって自作するのはまたそれですごい労力)

Qt4.5 が LGPL になるということで、おお、これは Qt かな、と思っていましたが、
ここに来て超期待の新人が現れました.

その名も Titanium

http://titaniumapp.com/

まあまずはデモビデオを見てほしい.

Titanium Developer: Getting Started from Appcelerator Video Channel on Vimeo.

あとは demo. まだアルファレベルなので demo も少ないですが、それでも結構イケてる感じ.

http://titaniumapp.com/demos

要は Adobe AIR のオープンソースクローンです. Titanium 自体は RubyOnRails で作ってあるみたい.
GUI 系は webkit や javascript を使って美しくカスタマイズ可能にデザインできて、
ネイティブデスクトップの機能や、ネイティブプロセスの起動などもできる.

推薦には、「wxWidgets や .NET, Qt とか使って来たが、Titanium こそオレの求めていたものだ!早速乗り換えることを検討するぜ!」とかあったりして期待度は高い.

で、こいつがすごいのは, C/C++ や Ruby, Python など各種言語でモジュールを書いて拡張できるようになっていること.

Kroll

C/C++, Ruby, Python, JS… などでモジュールを記述できる、という特徴はこの Titanium でどう実現しているか,
ちょっとソースを覗いて調べてみました.

各種言語のサポートの実現には、 Kroll と呼ばれるモジュール間のメッセージ通信を hub するようなデーモンサーバ(?)を使ってやっているらしい.
Kroll の README にはこんな風に書いてある.

Kroll is a compact microkernel written in C++ for running pluggable
modules. Kroll supports a cross-language, cross-platform “binding”
and invocation framework which supports mixing and matching
code within the Kroll kernel.

マイクロカーネルとあるが、いくつかのコード例を見るとどうも Kroll サーバ(?) に各モジュールはメッセージを投げて値をセットしたり、
クエリメッセージを投げて Kroll から値を取得したり, という感じでクロスランゲージなバインディングを実現しているように見える.

確かにメッセージ通信ベースで各モジュールとやりとりすれば、言語のバインディングの自由度は高くなりますね.
(TCP/IP でつなぐようなものだし)

Titanium は聖杯か?

そんなわけで、これで CG アプリ(lucille GUI フロントエンドとかシェーダエディタとか)書いたら、
モデリングやレンダリングはネイティブモジュールで行い、
GUI は html + javascript で、
と結構イマドキで Web2.0 な見た目を備えた魅力的な GUI アプリが作れそうだ.

そして web と統合していることを生かして、
レンダリングした画像はボタン一発で Flickr に上げて、Twitter で報告して、
マニュアルは web で見て、アップデートは自動でネットワークダウンロード、とかね.

ただもちろん、Titanium が完全な解というわけではありません.

メッセージ通信(のようなもの?)でネイティブモジュールとやり取りをするため、
たとえば CG 系の用途ですと画像を頻繁に更新することが要求されるわけですが、
ネイティブモジュールで生成した画像を html の世界で表示するには、
単純に考えると画像をメッセージとして送らなければならず、
パフォーマンス上の懸念があります. なにかしらうまい仕組みがないかどうか探す必要があります.
もちろん、ネイティブモジュール側のウィンドウに表示するのであれば、このような懸念はありませんが.

また、ネイティブモジュールのデバッグも困難になります.
gdb などで追いかけたいときは、モジュール呼び出し側にはメッセージ通信だけをダミーで応答するような
アプリを建てたりしないといけなくなるかもしれません
(これは TCP/IP 通信をするアプリを作るときにも言える問題ですね).

Advertisements