実世界指向スクリプト言語とプログラミング

スクリプト言語の本質

今回のスクリプト言語特集では、 テキスト処理に向いたスクリプト言語や グラフィカルインタフェース(GUI)作成に向いたスクリプト言語など、 色々な特徴のあるスクリプト言語が紹介されました。 細かな違いはあるものの、 スクリプト言語に共通で最も大事な特徴は 必要な仕事を簡潔に記述し実行できる ことだろうと思います。 計算機にちょっとした仕事をさせるとき、 これからプログラムするぞ、 と気合いを入れなくてもプログラムが作れるようでないと スクリプト言語の意味は無いでしょう。 仕事を短い時間で簡単に記述(describe)できる言語のことを ここではスクリプト言語と呼ぶことにします。

スクリプト言語といえばテキストベースの インタプリタ言語という印象が強いようです。 実際、 Unixや最近のインターネット環境では テキストファイルを操作するために Perl, Python, Rubyのようなスクリプト言語が よく使われています。 しかし、このようなテキストベースのスクリプト言語がよく 使われている理由は、 これらの環境ではテキストやファイルが仕事の 単位となっており、 テキストファイルを操作する仕事が多く、 その実行にこれらの言語が便利だからです。 ウィンドウシステム上のグラフィカルインタフェースをもつ プログラムを作るのに Tcl/Tkがよく使われていますが、 これは Tclが優れた言語であるからではなく、 Tkを使えば ウィンドウやグラフィカルインタフェース部品を使う プログラムを簡単に作ることができるからです。 スクリプト言語が広く使われる理由は スクリプト言語自体の出来のよしあしだけでなく、 それを使うことにより仕事がどの程度楽になるかという点が 重要になっています。

行なう仕事の内容に応じて、 必要とされるスクリプト言語の性質も変わります。 プログラミング電卓で数値計算を行なう場合、 数値以外の対象を扱うことはできませんから、 数値演算と繰り返しや条件判断だけ実行できる 「スクリプト言語」が使われています。 表計算ソフトウェアの場合は システム自体が 入出力が一体となった「スクリプト言語」であると みることもできます。

アプリケーションの表現と言語の表現

アプリケーションの形態と、それを実現するプログラムの形態には 深い関連があります。 数値演算を行なうプログラミング電卓のプログラムは ほとんど数字で構成されているでしょうし、 主にテキストファイルを処理するプログラムは テキストファイルで表現されるのが普通です。 また、 グラフィカルインタフェースのプログラムは いわゆる「インタフェースビルダ」のような グラフィカルなプログラミング環境で作成するとうまくいきます。 アプリケーション毎に、どのようなスクリプト言語が 適しているのか考えてみることにします。

インターネット時代のスクリプト言語

インターネット時代のスクリプト言語とはどのようなものでしょうか。 現在のところ、計算機で行なう仕事のほとんどは テキストファイルを扱うものですから、 テキストを簡単に扱うことができる テキストベースのスクリプト言語が最も幅広く使われています。 インターネットというとマルチメディアぽい響きがありますが、 実際は 電子メールもWebページもテキストファイルですし、 プロトコルもほとんどはテキストデータに基づいています。 ユーザ側から見ると、 メールを取得/分類したり、 Webで情報を検索したり、 アドレス帳を管理したりといった仕事は ほとんどすべてテキストのみ扱えばすみますから、 プロトコル操作とテキスト操作がやりやすい スクリプト言語があればよいことになりますし、 メールサーバやWebサイトの側でも、 基本的には テキストを受け取ってテキストを返すようなインタフェースさえ 用意しておけばよいので、 やはりテキストベースの逐次型スクリプト言語で充分間に合います。 テキストデータを簡単に扱えるようなテキストベースのスクリプト言語は このインターネット時代に 全盛期を迎えているように思われます。

GUIベースのスクリプト言語

テキスト処理向けの逐次型スクリプト言語では扱いにくい仕事に対しては、 グラフィカルな表現を使用した いわゆる「ビジュアルプログラミング」が工夫されてきました。 GUIを用いたビジュアルプログラミングの手法は いろいろなものが提案されていますが、 歴史が古く比較的わかりやすいものとして 「データフロー型」のものがあります。 図1は MIDIや音楽のプログラミングに使われる 「PD」(Pure Data)という言語によるプログラム例です。 PDは、簡潔なデータフロー記述によって MIDI信号などの流れを扱うことができる 音楽用スクリプト言語といえるでしょう。

図1: 音楽用ビジュアル言語「PD」のプログラム例

LEGO社が発売しているロボットプログラミングシステム 「MindStorms」では、ビジュアルプログラミングによって ロボットの制御をプログラミングできるようになっています。 これもGUIベースのスクリプト言語のひとつの例といえるでしょう。

図2: 「MindStorms」のプログラム例

情報家電時代のスクリプト言語

これまでの計算機は テキストファイルを扱うのがやっとでしたから テキストファイルを扱うアプリケーションが多かったわけですが、 あらゆる家電製品が計算機化して「情報家電」になってしまったり、 情報処理能力をもつような机や紙が出現したりすると、 テキストファイルや 計算機画面上の図形しか扱えないようなスクリプト言語は あまり意味がなくなってしまいます。 ビデオを録画したり、 朝ベルが鳴るように目覚まし時計をセットしたりするのも 簡単なプログラミングですが、 AV機器や時計がさらに情報化して複雑になると、 それを制御するためのスクリプト言語が必要になるはずです。 沢山の情報家電機器はどのような言語でプログラミングすれば よいのでしょうか。 家電製品はリモコンで制御できるものが多いので 「リモコン言語」を作ればよいかもしれませんが、 ただでさえ使いにくいリモコンを プログラムするのはかなり苦労しそうです。

実世界計算時代のスクリプト言語

情報家電機器ならば苦労すればなんとかプログラミング できるかもしれませんが、 将来、いつでもどこでも何にでも計算機が使われるようになると プログラミングはさらにむずかしくなります。 たとえば 「買い物リストに入ってる商品を売っている店のそばに来たら アラームで知らせる」 といったプログラムはどうやって作ればよいでしょうか。 買い物リストの処理だけならば テキストベースのスクリプト言語でも大丈夫ですが、 自分の近くにどのような店があるか計算したり、 そこで何を売っているか判断したりすることは、 技術的には可能でしょうが、 普通のスクリプト言語で簡単にプログラムを作ることはできません。 「留守中に宅配便が来たらインターホンを携帯電話につなぐ」 というプログラムはどうでしょうか。 「宅配便が来た」という条件は 「家の前にトラックが停まり、帽子をかぶったおじさんが出てきた」 という状況から判断できるかもしれませんし、 「留守中」という条件は 「昼間なのに家の中に動きがない」 という状況から判断できるかもしれませんが、 このような条件はテキストベースのスクリプト言語で 簡単に記述することはできません。 実世界の状況を簡単に扱うことができる言語があれば 「洗濯物が出ているとき雨がふりそうだったらメールする」 「運転中に眠りそうになったら電話で起こす」 「嫌な奴が来たら道を変える」 など、 いろいろ役にたつプログラムが作れるようになるでしょう。 今後、 このような処理を簡単に記述して実行させることができる 実世界指向スクリプト言語を使った 「実世界指向プログラミング」[2]が非常に重要になってくるはずです。

実世界指向スクリプト言語のプログラミング

実世界の状況を扱うことができる 実世界指向スクリプト言語とはどのような ものなのでしょうか?

プログラミング電卓では 以下のようなプログラム要素が使われています。

基本データ構造 数値
基本操作 数値演算
実行制御 繰返し/条件判断
基本条件判断 数値比較
また、 文字列処理を多用する テキストベースのスクリプト言語では 以下のようなプログラム要素が重要になります。
基本データ構造 数値/文字列
基本操作 数値演算/文字列演算
実行制御 繰返し/条件判断
基本条件判断 数値比較/文字列パタンマッチ
これに対し、 実世界指向プログラミングでは 実世界の事物や状況が基本データ構造となり、 基本条件判断としては 実世界の状況を判断することが重要となります。
基本データ構造 実世界の状況や事物
基本操作 実世界の動き
実行制御 繰返し/条件判断
基本条件判断 状況マッチング
数字や文字列をシンボルとして扱うことに違和感は少ないでしょうが、 実世界の事物や状況を シンボルとして扱うのは困難です。 テキストベースのスクリプト言語の場合は 実行制御をどのように行なうかが最も重要なトピックだったのに対し、 実世界スクリプト言語では データの表現方法/ 指定方法/ 比較方法の方が重要になると思われます。

具体的データの指定
シンボルや数字を使わずに 場所/物/人/時刻などを指定できるようにする手段が必要です。 実際の場所や人間などを使って指定するのが簡単ですが、 それが不可能な場合は 地図や名刺のような代理物を使ってもかまいません。
操作や関係の指定
対象に指示する動作や、 対象同士の関係などを指定できるようにする 必要があります。
実行制御
普通のスクリプト言語と同様に、 条件や繰り返しを指定できるようにする必要があります。

実世界指向スクリプト言語プログラミングの実例

前述のように、実世界指向スクリプト言語のプログラミングでは、 計算や操作の対象となる事物の同定と、 対象に対する操作の指示 を行なうための仕掛けが必要です。 テキストベースのプログラミングでは これらはすべて文字列シンボルで表現されますが、 実世界プログラミングの場合は 実際の対象や操作を使います。 例えば、 スピーカの音量を上げるプログラムを作る場合は、 対象となるスピーカを直接指示して 音量を上げる操作をジェスチャで例示するのが良いでしょう。

スピーカのような実世界の事物を同定するには バーコードがよく使われます。 また、操作を指示するためには ジェスチャ認識装置が必要です。 FieldMouseという装置を使えば、 これらの操作をわかりやすく実行することができます。

FieldMouse

FieldMouseは、 玉川大学の椎尾一郎先生が考案した、 実世界インタフェース用の入力装置で、 マウスや加速度センサのような相対移動検出装置と バーコードリーダのようなID検出装置を一体化したものです[3]。

図3はペン型マウスとペン型バーコードリーダを一体化した FieldMouseの例で、 図4のような、Symbol Technology社のSPT1500という レーザスキャナ付きPalmの中に傾きセンサを組み込んだものも 試作しています。


図3: ペン型マウスとペン型バーコードリーダを一体化したFieldMouse


図4: レーザスキャナつきPalmPilot SPT1500

FieldMouseを使うと、 計算機画面上でのグラフィカルユーザインタフェースと 同様の操作をあらゆる場所で実行することが できるようになります。

FieldMouseによる実世界グラフィカルインタフェース

計算機画面上のグラフィカルインタフェースでは、 以下のいずれかの操作が使われるのがほとんどです。

クリック操作
  1. マウスでカーソルを操作対象の位置まで移動する
  2. マウスボタンを押してすぐ離す
ドラッグ操作
  1. マウスでカーソルを操作対象の位置まで移動する
  2. マウスボタンを押す
  3. マウスボタンを押したまま動かしてシステムの反応を待つ
  4. マウスボタンを離す

一般的なバーコードリーダを使って、 計算機画面上でのマウスクリック操作に対応した 実世界インタフェースを作ることができます。 例えば、 計算機画面上のCDアイコンをマウスでクリックして 曲を演奏させることができるのと同じように、 CDのバーコードをスキャンすると曲が演奏されるような システムを作ることができます。

バーコードリーダを単体で使用する場合は GUIのクリック操作に対応する操作しか実行できませんが、 FieldMouseでは、 バーコードリーダと傾きセンサが組みあわせてあるので、 ドラッグ操作も実世界で実行することができます。 例えば、FieldMouseを使えば 図5のような印刷された「ボリューム」を GUI部品のように使うことができます。 まず バーコードリーダでバーコードを認識して FieldMouseがボリュームをポイントしていることを検出し、 その後のFieldMouseの回転量を傾きセンサで検出して 音量調節に使えばよいわけです。


図5: FieldMouseによるボリューム

FieldMouseによる実世界でのドラッグ操作は 以下のようになります。

FieldMouseのドラッグ操作
  1. FieldMouseを操作対象まで持っていく
  2. ボタンを押してバーコードをスキャンしてIDを取得する
  3. ボタンを押したまま動かしてシステムの反応を待つ
  4. ボタンを離す

FieldMouseを使えば、 計算機画面上と同じように 実世界でも クリック/ドラッグ操作を行なうことができるので、 計算機画面上でのGUIと同様の操作を 実世界で行なうことができるようになります。 例えば、 ビデオを 液晶プロジェクターまで「ドラッグ」することにより 映像をプロジェクターに出力したり、 スピーカに貼りつけたボリュームで 音量を変えたりすることができます。 このように、 FieldMouseをつかえば、 不明瞭になりがちな情報家電機器などのインタフェースを 誰にも理解しやすくすることができます。 このようなインタフェース手法を 「実世界指向GUI」と呼んでいます[1]。

FieldMouseによるプログラミング

FieldMouseを使えば 大抵のGUI操作が実世界で可能になるわけですから、 計算機画面上での ビジュアルプログラミングも 実世界で行なうことができるはずです。 特に、 マウス操作を多用する データフロー型のビジュアルプログラミング手法は 実世界のプログラミングに向いており、 前述のPDと同じような方法で 実世界プログラミングを行なうことができます。 具体的には以下のような手法を使います。
データフロー型のビジュアルプログラミングと同様の手法を採用
PDなどと同じように、 データや演算子のようなプログラミング要素(モジュール)を リンクで結ぶことによりプログラムを表現し、 計算実行はリンク上の文字列データの流れで表現します。
バーコードの使用
FieldMouseを使用し、 バーコードを用いて 実世界の事物の認識/操作を行ないます。
IDカードの使用
実世界の事物で表現しにくいプログラミング要素は、 名刺大の紙に バーコードを印刷した「IDカード」で表現します。
ジェスチャによるリンク設定
ソースとなるモジュールのバーコードからデータをすくい上げる ジェスチャを行なってから、 デスティネーションのバーコードにデータを流し込むジェスチャを 行なうことにより、モジュール間にリンクを設定します。
モジュールが ユーザのアクションを受け付ける場合は、 ユーザがカードのバーコードをスキャンしたとき及び スキャン後FieldMouseを回転した場合に、 リンク先のモジュールに対して、 操作に対応した文字列を送付します。 計算その他の処理を行なうモジュールの場合は、 他モジュールから文字列を受け取った時点で、 定義された処理を行なった後、 リンク先のモジュールに計算結果の文字列を送付します。

プログラム要素の種類

プログラム要素として、 以下のようなモジュールを用意します。
文字列モジュール
文字列要素は、それに対して ユーザがなんらかのアクションを起こしたときに 文字列を他のモジュールに送出します。
文字列表示モジュール
受け取った文字列をそのまま画面に表示します。
計算モジュール
計算モジュールは、 四則演算や文字列演算などの各種の計算を行ないます。 たとえば文字列連結モジュールに ふたつの文字列モジュールが接続されているとき、 ユーザが片方の文字列にアクションを起こすと、 それらが連結され、結果が他のモジュールに 送出されます。
連続値モジュール
文字列モジュールは固定文字列を生成しますが、 連続値モジュールは ユーザのアクションに応じて異なる値を連続的に出力します。
音声/画像モジュール
音声/静止画/動画名の文字列を受け取り、 対応するファイルを表示/再生します。
音量モジュール
音量を受け取った数字に設定します。

簡単なプログラム例

前節で述べたような各種のプログラム要素を表現する IDカードを使った実世界プログラミングの例を示します。

文字列の表示

文字列カードから文字列表示カードにリンクを設定することにより、 FieldMouseで文字列を選択したときにその文字列が表示される ようなプログラムを作ることができます。


図6: 文字列カードと文字列表示カード

FieldMouseで文字列カードを指してバーコードを認識してから 情報をすくいあげる動作(持ち上げる動作)をすることにより、 文字列カードがリンクのソースに設定されます。 その後、 FieldMouseで文字列表示カードを指してバーコードを認識してから 流し込む動作(先を下げる動作)をするをすることにより、 文字列表示カードがリンクのデスティネーションに設定されます。 このようなリンク設定操作の結果、 図7のような文字列表示プログラムが生成されます。


図7: 文字列表示プログラム

画像の表示

画像名を示す文字列カードから 画像表示カードにリンクを設定しておくと、 画像名カードを選択したときに画像名が表示カードに送られて その画像が表示されます。 画像名を示す文字列カードにその画像を印刷しておけば、 表示したい画像の印刷されたカードを選択するだけで 画面にその画像が表示されるので理解が楽です。

この手法は、 動画や音楽の場合にも適用できます。 図8はCDを示すIDカードの例です。 このカードを選択すると、 曲名を示す文字列が演奏モジュールに送られて ジャケットの示す曲が演奏されます。


図8: CDを示す画像カード

音量制御

数字を表現する文字列カードから 音量調節カードにリンクを設定しておくと、 数字カードを選択することによりその値に音量が設定されます。 たとえば、文字列「0」を示す文字列カードに 「Mute」と印刷しておけば、 そのカードをFieldMouseで選択することにより 音量をゼロにすることができます。

また、 連続値カードから音量調節カードにリンクを貼ることにより、 FieldMouseの傾きにより音量を調節することができます。 図5のように、 連続値カードに通常のボリュームのような絵を印刷しておけば、 これを本物のボリュームと同じ感覚で使うことができます。 このようなカードをアンプ/スピーカ/電話機などの、 音量調節が必要になりそうな場所に貼っておけば、 電話が鳴ったときにアンプの音量を下げるといった こともできるので便利です。

プレゼンテーションのプログラム

前述のような各種のカードを組み合わせてプログラミングする ことにより、スライドやビデオを用いたプレゼンテーションを すべて実世界指向プログラミングすることができます。

プレゼンテーションに必要なプログラムの例を図9に示します。 矩形がIDカードで表現されるモジュールを表現し、 矩形間のリンクはジェスチャによってIDカード間に設定される ものです。 “+1”, “-1” などのカードを選択すると、 “Σ”モジュールに加算結果が蓄積され、 “Slide”という文字列と連結されて 画像モジュールに送られることにより、 “Slide1”, “Slide2”...などの 画像ファイルが表示されます。 “Slide1”などのカードを操作すると 直接そのスライドが表示されます。 “Slide1”の文字列カードに Slide1の中身を印刷しておけば、 カード中から必要なスライドを選んで表示するのが 簡単になります。


図9: スライドプレゼンテーションのプログラム

実世界プログラミングと例示プログラミング

ここで紹介した実世界プログラムでは、 変数のような抽象的な概念は全く使われておらず、 具体的な事物の指定のみが使われていました。 一般に、 抽象的表現が少ないほどプログラムを作るのが簡単にになります。 テキストベースのスクリプト言語においては、 計算の途中結果を格納するために 名前をつけた変数を定義する必要があるような場合でも、 データフロー型の ビジュアルプログラミングシステムでは 箱を用意するだけでよい場合があります。 プログラム中で事物を参照する場合も、 テキストベースの言語であればシンボルが必要になりますが、 実世界プログラミング言語の場合は 実物やその代理のIDカードを使えばよいので理解が簡単です。

抽象的な記号をなるべく使わずに プログラミングを行なう方法として、 例示プログラミング (Programming by Example)が提案されていますが、 実世界プログラミングでは 最初から実物や例を用いているので、 例示プログラミングと同じ利点を持っています。 どうしても繰り返しのような抽象的概念が必要になる場合は 例示プログラミングの様々な手法を 応用することが可能です。

おわりに

FieldMouseを用いた 「実世界GUI」によって 「実世界指向スクリプト言語」のプログラミングをすることにより、 複雑になりがちな情報家電製品や 実世界の様々な事物をわかりやすくプログラミング できることがわかりました。 今回紹介したような言語は 現在一般的なテキストベースのスクリプト言語とはかなり異なっていますが、 このような環境を用意することにより、 あらゆる場所ですぐに簡単に 実世界の様々な機器の プログラミングができるようになると期待されます。

テキストを用いたプログラミング言語は長い歴史があり、 スタイルは比較的固まっているようですが、 GUIによるプログラミングはまだ初期段階にあり プログラミングの「イディオム」も定まっていません。 実世界プログラミングはさらに未熟な段階にあり、 どのような手法が主流になるか全くわからないといえます。 テキストベースの言語の世界でもGUIの世界でも、 長い時間をかけてイディオムが共通知識化されてきました。 じっくり時間をかけて 実世界指向言語やプログラミングの良いイディオムを 進化させていきたいものです。

参考文献

[1] Toshiyuki Masui, Itiro Siio. Real-World Graphical User Interfaces. In Proceedings of the International Symposium on Handheld and Ubiquitous Computing (HUC2000), pp.xx-xx, September 2000.
[2] Toshiyuki Masui. Real-World Programming. In Proceedings of Designing Augmented Reality Environment (DARE2000), pp.115-120, April 2000.
[3] Itiro Siio, Toshiyuki Masui, Kentaro Fukuchi. Real-world Interaction using the FieldMouse. In Proceedings of the ACM Symposium on User Interface Software and Technology (UIST'99), pp.113-119, November 1999.