界面駭客日記(17) - GUIツールキットいまむかし 増井俊之


現在のパソコンでは、どのようなOSでも グラフィカルユーザインタフェース(GUI)の採用が あたりまえになっています。 GUIで操作するアプリケーションはユーザには便利ですが、 作成するのはそれなりに面倒です。 文字端末でテキストを表示させるプログラムは、 Cならば
main(){ printf("Hello, World\n"); }
のように1行で書くことができますが、 ウィンドウに文字を表示させる場合には、 ウィンドウを開いて/背景色で塗り潰し/フォントを選択して/ 表示位置を指定して/文字列を描画する/ といった処理が必要になり、プログラムが何倍も複雑になって しまうからです。

GUIプログラムを簡単に作れるようにするために、 様々な手法が工夫されてきました。 あらゆるインタフェースの面倒をみてくれる UIMS(User Interface Management System)というものを用意しておき、 入出力はすべてそれにまかせるという方法が注目されたこともありますが、 プログラムの本体と入出力をうまく分離することは困難なので、 現在こういった手法は顧みられなくなっています。 また、インタフェース記述に便利な専用言語を作って利用するという 方法が注目されたこともありますが、 アプリケーションを記述する言語とインタフェースを記述する言語を 併用するのは面倒ですので、 こういう方法も現在ほとんど検討されることはなくなっています。 現在、GUIを作成するためには 「GUIツールキット」を使うのが主流になっています。 ツールキットというのは ウィンドウやテキスト入力枠のような インタフェース部品をライブラリ化して、 アプリケーション記述言語から呼び出して簡単に使えるようにしたものです。 このような部品は比較的独立しており、 それぞれが個有のデータや手続きを持っているため、 オブジェクト指向言語では特にうまく実装することができます。 たとえばJavaではSwingというツールキットライブラリが用意されており、 様々なGUI部品がオブジェクトとして定義されています。

GUIプログラム開発にツールキットを使用すると、 プログラム開発を効率化することができますし、 見栄えや使い勝手に統一感を持たせることができるという 大きな利点がある一方、 特定のOS/開発環境/プログラミング言語に依存してしまったり、 プログラムの制御構造がツールキットによって決まって しまうという問題点もあります。

ツールキットの歴史

GUIの歴史の初期段階から、様々なウィンドウシステムや ツールキットが現われては消えていきました。 現在のパソコンで最も広く使われているのは恐らく Microsoft Windows上のVisual C++などで使われる MFC(Microsoft Foundation Class)という ツールキットと思われますが、 UnixやMacintoshでもいろいろなツールキットが使われています。

Unixワークステーションのさきがけとして名高い Sun Microsystemsのシステムでは SunviewまたはSuntoolsと呼ばれる ウィンドウシステム/ツールキットが使われていました。 その後、PostScriptを全面採用したNeWSという ウィンドウシステムに移行を模索しましたが成功せず、 現在の製品ではX Window Systemが使われています。 その他の多くのワークステーション会社が 独自のウィンドウシステムとツールキットを開発していましたが、 現在はすべてX Window Systemに移行してしまいました。 X上でも数多くのツールキットが現れては消えていきましたが 現在はGTK+[3]などが勢いがあるようです。

Macintosh OS Xでは、 Project Builderという管理ツールと Interface Builderという画面設計ツールを使って、 Cocoaというツールキットを使ったGUIプログラム開発を 行なうことができます。 Project BuilderおよびInterface Builderはもともと NeXT ComputerのNeXTStepというOS/ウィンドウシステム用に 開発されたもので、その後のVisual C++をはじめとする グラフィカルな開発環境に大きな影響を与えました。 NeXTの開発環境は比較的高価でしたが、 現在AppleはProject Builderおよびコンパイラなどの 優れた開発環境を標準で提供しているので 開発者にとってはありがたい限りです。

GUI Toolkit Framework Page[2]では、 現在利用可能なほとんどのツールキットがリストされています。 C/C++ベースのフリーのツールキットだけで100個もあるのに驚かされます。

おすすめツールキット

WindowsのMFCやMacintoshのCocoaを使うと最初から決まっている場合は 仕方がありませんが、 とりあえず動くものを手早く作りたい場合はどうすればよいでしょうか。 ツールキットは星の数ほどあるので どれを使えばよいのかはかなり迷うところですが、 以下のようなポイントが重要でしょう。
プロトタイピングが容易なこと
GUIプログラムは 見栄えや動作を手直ししながら開発しなければならないことが 多いので、楽に記述/修正が可能な言語とライブラリを使用するべきでしょう。
使いやすい描画ライブラリがサポートされていること
多くのGUIツールキットでは 図を描くためのグラフィック描画ライブラリが用意されていますが、 特殊な座標系が採用されているなど 使いにくいものもあるようです。 なるべく標準的で使いやすい描画ライブラリを含んでいるものを 使うべきです。
幅広い環境で動作すること
Microsoft Windowsでしか動かないようなツールキットを使用するよりも、 UnixやMacintoshなど様々なプラットフォームで動作するものを 使えば便利です。
複数スレッドや例外処理を利用できること
GUIプログラムでは、非同期的な入力やエラー処理などが必要になる ことが多いので、複数スレッドや例外を簡単に扱える言語や ツールキットを使うと便利です。 たとえば、時間のかかる処理がある場合、 途中で中断できるようにしたり、 並行して複数の処理を同時に行なうことにすれば 使いやすいプログラムを作ることができます。
広く使われていること
ツールキットは大規模で複雑なものが多いので、 多くの人が使っているものを選ぶ方が安全かもしれません。
上記の要件の多くを満たす興味深いツールキットをふたつ紹介します。

Ruby/Qt

Ruby[3]は現在日本で最も元気のある言語のひとつでしょう。 Rubyはオブジェクト指向を本格的に取り入れたスクリプト言語で、 Unix, Windowsなど様々な環境で動作します。 Qt[4]はノルウェーのTrolltech社が開発しているツールキットで、 世界的に最も元気のあるツールキットのひとつです。 前述のGUI Toolkit Framework Pageでは、 数あるフリーのツールキットの中でQtがベストと評価されています。 QtはもともとC++で使うツールキットですが、 堀江信之氏はこれをRubyで使えるようにした Ruby/Qt[5]というライブラリを作成し配付しています。 Ruby/Qtを使うと、 RubyスクリプトでQtのGUIライブラリを扱うことができるので 非常に効率的にGUIプログラムのプロトタイピングを行なうことができます。 またQtは3次元描画ライブラリ「OpenGL」を扱うことができるのが 特徴のひとつになっていますが、 Ruby/QtではOpenGLの描画もRubyスクリプトですることができます。 いにしえのパソコンでは BASIC言語と単純な描画ライブラリを使って 画面に絵を描くプログラムを作るのが流行していましたが、 BASIC言語が標準でパソコンに添付されないようになってからは 下火になっていました。 現在は はるかに優れた言語と はるかに優れた描画ライブラリが フリーで使えるようになったことは喜ばしいことです。

Jazz

Jazz[6]は、米国メリーランド大学の Ben Bederson教授が開発した、 ズーミングインタフェース(ZUI)をサポートする Java用のツールキットです。 一般的なGUIでは表示を認意に拡大/縮小することは できないのが普通ですが、 Jazzでは認意の画面を連続的に拡大/縮小することができますし、 SwingのGUI部品を認意のサイズに拡大/縮小して使うこともできます。
下図はJazzで作成されたハイパーテキスト図面作成システム 「HiNote」のヘルプ画面です。 左の画面で「Begin」をクリックすると 画面が「Navigation」と「Overview」の間に向かって連続的にズームし、 右側の画面に移行します。 HiNoteを使えばこのようにズーミングを行なうハイパーテキストを 簡単に作成することができます。

おわりに

現在、ツールキットの数は昔に比べて格段に増えていますが、 ワークステーションの黎明期に比べると 根本的な違いは少なくなっているように思われます。 また、最近のツールキットは重厚長大なものが多いので、 ひとつのシステムから別のものへ移行するのも難しくなって きています。 多くの興味深いウィンドウシステムやツールキットが 完全に絶滅してしまったのは残念なところです。 多くの種類が絶滅し、一部が残って複雑化するという歴史は 生物進化に似ているような気がします。
ユーザの操作にすぐにシステムが反応する 「直接操作」と呼ばれるインタフェースをサポートする ツールキットが時間をかけて進化してきましたが、 Webブラウザ上のCGIでは残念ながら バッチ的な操作しか行なうことができませんし、 Dynamic HTMLもあまり使いやすいとはいえません。 ブラウザ上でリアルタイムな操作を行なうことができる 使いやすいツールキットが望まれるところです。 また、高度なグラフィクスやアニメーションを利用できる ツールキットもまだ少ないようなので、 今後に期待したいと思います。
  1. GTK+ http://www.gtk.org/
  2. GUI Toolkit Framework Page: http://home.pacbell.net/atai/guitool/
  3. Ruby http://www.ruby-lang.org/ja/index.html
  4. Qt http://www.trolltech.com/
  5. Ruby/Qt http://sfns.u-shizuoka-ken.ac.jp/geneng/horie_hp/ruby/horie_prog_jp.html#Ruby/Qt2
  6. Jazz http://www.cs.umd.edu/hcil/jazz/

Toshiyuki Masui