言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

形式的で一般的な GUI フレームワークの研究

今日電車の中で、これは行けそうだ!という予感がしたので記念に書いておきます。予感だけで、本当に出来るかまだ分からない。

やりたい事

GUI フレームワークを形式的に定義します。GUI フレームワークというのは、ある情報(例えば温度)がある時に、それをどのように画面に表示するかと言う方法の事です。簡単に書けば単にある数字を表すフォントを画面に点で書けば良いだけですが、例えば温度計みたいに表示したり、グラフで表示したり、編集出来るようにしたり、色んな事を考えるとフレームワークと言うのを使った方が良いです。

形式的にというのは、数式で表現するという事です。数式で表現出来ると意味を変えずに表現を変える事が出来ます。すると、計算が速くなったり頭がすっきりしたりします。

一般的にというのは、GUI 以外にも使えるという事です。オブザーバパターンの枠内だったら何でも使えます。

バックグラウンド

SqueakGUI フレームワークは、MVC (Smalltalk-80) - Morpic (Squeak3) - Player/Costume (Tweak) という風に発展して来ました。やりたい事は、単純な情報を単純なまま、しかもかっこよくてダイナミックに表示したいという事です。MVC は単純な更新メカニズムだけを使っていますが、Morphic ではマシンパワーの増大により(?)ポーリングがメインになっています。Tweak の Player/Costume では MVC と Morphic の良い所取りをして、しかもモデルとビューが多段階層になっています。

あと、Garnet と言う制約 GUI ツールキットの影響も書いておきます。これは Excel のようにあっちの値を変更したらこっちの値が変更されるという仕組みだけを使って GUI を実装したものです。スコットさんによると、ビバリウムプロジェクトではそういった物を作成していたそうです。

問題点と目標

Garnet のような一方向制約だけで GUI フレームワークが書けたらたいそう綺麗な仕組みになるはずですが、そこにはパフォーマンス上の問題があります。だから MVC から Player/Costume にかけてどのタイミングでどうモデルの情報を見た目に反映させるかを色々実験してるわけです。

私の提案は、モデルが変更された時にビューを変えるためのベストの方法に関する物です。ベストと言うのは、例えば 4x4 行列でローカルからグローバル座標を求める時のように、ばっさり一発でモデルからビューを求めます。この提案によって、依存に関係するオブジェクトの深さに関わらず定時間で制約を解決します。また、そういう事が可能な条件と限界を明らかにします。なんか、すでにあるような気がしますが、あるならあったでラッキーです。

これは臭う!という考えはあるのですが、絶対こうだ!という気がしたらまた書きます。

追記。

どうやらこういうのを Functional Reactive Programming と言うらしいという事が分かった http://www.kmonos.net/wlog/69.html#_2218070128 。ここでも、あらゆる新しい思いつきというのは大抵誰かがすでにやっているという事が証明されたわけだ。素晴らしいインターネット!アランさんやアンドレアスの言う Player / Cosutume も、MVC とどう違うのかという文脈では Reactive Programming と同じだと思う。こうやって新しい言葉を増やすのは良くないな。これからは自分では「すごいオブザーバ」とよぼう。