SSブログ

HyperCard後編1(月刊ASCII 1987年12月号7) [月刊アスキー廃棄(スクラップ)]

「HyperCardの全貌 後編」をスクラップする。当時は全く触ったことがなく、Macユーザの知人がいたけどHyperCardについて語ってもらったこともなかった。先進的なものは登場が早すぎると成功しないのか。それとも別要因でHyperCardが消えてしまったのか。スクラップしていくと何かわかるかもしれない。
ASCII1987(12)d01HyperCard_W520.jpg

 先月号では,米国Apple社がMacintosh(以下,Macと記述)ファミリー用に発表した次世代のソフトウェア環境「HyperCard」の概要を紹介した、既存のカード型データベースとは、似ても似つかぬ概念を持っているだけに,完全に理解することはむずかしい,と感じられた読者も多いことだろう.
 そこで今回は、HyperCardの中核を形成しているプログラミング言語「HyperTalk」の解説を通して,HyperCardのエッセンスに触れてみることにしよう.また,HyperCard上で動作するアプリケーション(Stack)が,パブリックドメインを中心に,数十種類以上も発表されているので,これらStackの紹介を通して,HyperCardの応用分野も検証してみたい.
もうこのあおり文で何かおどろおどろしい感じがしてくる。35年前のMS-DOS使いには全く理解できなかった。でもWindows95以降になればWindowsのプログラミングで否応なしにこの概念が理解できるようになったのだが。
自然言語HyperTalkとは?

 始めに,HyperTalkが,HyperCardという環境の中で果たしている役割や,プログラミング言語としての特徴を見てみよう。
1.ユーザーレベルとHyperTalk

 HyperCardの諸機能は、HyperTalkによって記述され,実現されていることは前回も述べた.しかし,これはHyperCardのすべてのユーザーが、必ずHyperTalkでStackをプログラミングするよう。に義務付けられている,ということではない.それどころか,HyperTalkの存在を知らなくても,HyperCardを自由自在に使いこなすことは可能である.
 HyperCardは,ユーザーのレベルをあらかじめ設定でき,そのレベルに応じた機能を提供するように設計されている.ユーザーレベルは,下位層(初心者)から上位層(上級者)に向かって,(1) Browsing, (2) Typing, (3) Painting, (4) Authoring, (5) Scripting――という5つのレベルから構成される(図1を参照).
 このうち,HyperTalkを使って自由にプログラミングができるのは,最高レベルのScriptingだけである.また,Card内に新たなButtonや,Fieldを設定できるのは,AuthoringとScriptingのレベルだけで,ButtonやFieldに付随するHyperTalkのプログラム,「Script」を直接的にエディットできるのはScriptingレベルに限定されている。つまり,Painting以下のレベルではHyperTalkが使えない構造になっているわけだ.
 しかし,Painting以下のレベルが,HyperTalkにまったく無縁かというと,決してそうではない.HyperTalkを直接見たり、編集したりできるかどうかにかかわらず,どのレベルでもHyperTalkなくしてはHyperCardは存在しえない.どのレベルでも,後述する「Messagebox」にHyperTalkのコマンドをタイプして実行させることができる.したがって,多少オーバーな表現を使えば、HyperTalkについて知ることは、HyperCard自体を知ることにほかならないということになる.
 また,HyperTalkは,既存の「プログラミング言語」という概念に押し込めて、むずかしく考えなければならないような堅物ではない他のどのような言語よりも自然言語(英語)に近く,非常に親しみやすい構文を持っている.

ASCII1987(12)d01HyperCard図1_W520.jpg
 2. オブジェクト・オリエンテッドとは?

 プログラミング言語としてのHyperTalkの特徴を1つだけ挙げるとすれば,「オブジェクト・オリエンテッド(オブジェクト指向)」ということになるだろう。しかし、それだけでHyperTalkを語ることはできないし、オブジェクト・オリエンテッドが何であるか知らない人間にとっては,何の説明にもならない.そこで,本稿ではオブジェクト・オリエンテッドにあまりこだわらずに,HyperTalkを見ていくことにする.ただし,参考のために,オブジェクト・オリエンテッドというと必ず登場する「SmallTalk-80」との比較は、可能な限り試みることにする.
 オブジェクト・オリエンテッドな言語では,オブジェクト(対象)に対してメッセージを送ることによってプログラムが進行する.SmallTalk-80では、ほとんどすべてのものが,オブジェクトとして扱われる.例えば,ウィンドウ,メニュあるいはその中の文字までがオブジェクトとして扱われる.これらのオブジェクトには,ある特定のメッセージに対する応答の仕方が決められている.SmallTalk-80におけるプログラムでは,この応答の仕方を記述したものを「メソッド」と呼ぶ.
 HyperTalkで扱うオブジェクトは,(1) Button, (2) Field, (3) Card, (4) Background, (5) Stack――という5種類から構成される.これらのオブジェクトには、Smalltalk-80と同じように,特定のメッセージに対する応答の仕方が記述されている.HyperTalkでは,これを「Message handler」と呼ぶ.そして,Message handlerを集めたものがHyperTalkにおけるプログラム,すなわち「Script」になっている.
実際に作ってみればすぐなじめるものなのになんだろうこの解説は、わざわざ難しくしているような気がする。そうだ、学校の授業だ。各教科とも試験問題を作るためにわざと難しくというか楽しくならないように教えているのに似ていると思う。
3. オブジェクトの正体を探る

 オブジェクトと呼ばれるものは、どれもHyperCardの重要な構成要素になっており,それぞれに情報を含んでいる.例えば,Fieldは、上述のScriptはもちろんのこと,Field本来の情報である「Text」を持っている.さらに,Field自体の大きさ,位置,あるいはスクロール・バーの有無などの情報も持っている.これは,Buttonを例に挙げても同様のことが言える.さらに,CardやStackにいたっては、その中に,さらに別のオブジェクトを含んでいる.このように,プログラムやデ-タなどの様々な情報を一つにまとめたものが,オブジェクトの正体である.
 HyperTalkでは、前述の5つのオブジェクトが階層構造を形成している.例えば,ButtonやFieldは,Cardの下にあり、そのCardはStackの中に埋めこまれている(図2を参照).この階層構造は、メッセージの伝達という点で,相互に密接に関係している(後述).

ASCII1987(12)d02HyperCard図2_W418.jpg

4. HyperCard=Message!?

 HyperCardは、様々なオブジェクトから構成されている.そして,これらのオブジェクトには、一般のプログラミング言語で言うところのデータと,それを処理するプログラムが混在している。
 しかし,様々なオブジェクトが寄り集まって、1つのHyperCardを構成していたとしても,そのままでは何も起こらない.オブジェクトが別のオブジェクトと,あるいはユーザーと,またはHyperCard自身やMacintoshの環境と,相互に通信することによって、はじめてHyperCardはHyperCardとして動作する.
 このための通信手段が,「Message」を送る,ということになる.Messageには、マウスボタンがクリックされたとか,あるCardがオープンされたといったものがある.Messageは,図2に示した階層構造を下から上にたどる形で伝達される.例えば,マウスボタンがクリックされたというMessageは,第1に,その時点でマウスポインタが示しているButton,あるいはFieldに対して送られる。もし,これらのオブジェクトのScript中に,このMessageに対応するMessage handlerが存在していれば,Messageはそのオブジェクト(Script)で解釈される.第2に,Message handlerが存在しない時は,1つ上のレベル,すなわち,そのButtonやFieldが含まれているCardに伝達される.そこにもMessage handlerがなければ,そのCardのBackgroundに,そこにもなければ,そのCardを含むStackに,そして最後はHyperCard自身に,というように送られる(図3を参照).
 HyperCard自身は、送られたMessageを,あらかじめ定義されているHyperTalkのコマンドと照らし合わせ,同じ名前のものがあれば,それを実行する.そういう意味では、HyperTalkのコマンドは、Message handlerがあらかじめ定義されているようなMessageだと考えられ|る.また,HyperTalkのコマンドとして定義されていないMessageが送られてきた場合は,Messageと同名のMacのコードリソースがサーチされる.もし,該当するコードリソースが存在すれば,それが即座に実行される.逆にコードリソースが存在しない場合は、はじめて、“Messageは解釈できない”というエラーメッセージが表示される.このことは,コードリソースを用意しておけば,Hyper|Talkが自由に拡張できるということを意味する.例えば,CD-ROMやビデオディスクプレーヤなどをMacに接続した場合に,対応するコードリソースさえ用意しておけば,それらをHyperTalkで制御できるわけである.

ASCII1987(12)d02HyperCard図3_W520.jpg
ああ分かった。HyperTalkの内部構造とかを解説しているから分からないのか。こんな解説を理解できなくてもプログラムというかスクリプトは書ける。なんかBasicが分からない人の気持ちに似ているような気がする。仕組みとか理解できなくてもやりたいことができればそれでいいのに、楽しいのに、内部構造とかを理解するというか学校の勉強のように取り組むから理解できないのかな。
II HyperTalkでプログラミング

 理屈っぽい話が続いたので,実際にHyperTalkのプログラミングを見てみよう.ただし,HyperTalkの内容をすべて示すには誌面に限りがあるので,特徴的な部分に的を絞ることにする.
1. Messageboxで小手だめしを

 HyperTalkはインタープリタ型の言語だから,BASICなどと同じように,あるコマンドを抜き出して動作を確かめてみる,といったことが簡単に行える.HyperCardには、こうしたダイレクトコマンドの入力用に,「Message box」が用意されている.Message boxの中に,HyperCardに対するMessageをタイプしてリターンキーを押すと,そのMessageが送信される(図4を参照).これは,Smalltalk80の「Work space」ウィンドウにメッセージ式をタイプして「do it」を実行することに相当する(Smalltalk-80はコンパイラ型の言語でありながら,インタープリタ型の言語としても使えるような工夫がなされている).
 HyperCardでは、例えば、Message boxに「Go Home」とタイプすれば,このMessageはHyperCard自身に送られ,HomeStackがオープンされる.また,「Put the date into card field1」とタイプすれば,その日の日付が,オープンされているCardの1番目のFieldに書き込まれる.この2つのMessageを見ただけでも,HyperTalkが自然言語に近く,親しみやすい構文を持っていることが分かるだろう.
 Message boxは,通常の使用状態では画面に表示されない.これを画面に表示させるには,[Go]メニューから[Message]の項目を選択するか,コマンドキー+Mキーを押す.Message boxを表示させてからMessageをタイプするのは、もちろん普通のやり方だが,Message boxを使わないでMessageをタイプし,送信することもできる.ただし,これが「許されるのは、Scriptingレベルのユーザーに限られる.ユーザーレベルの設定をするのと同じく,HomeStackの「UserPreferences」のカードで「BlindTyping」の項目を選択すれば,この機能は実現される(図5を参照).

ASCII1987(12)d03HyperCard図4_W428.jpg
ASCII1987(12)d03HyperCard図5_W508.jpg
もうすっかり忘れてしまったが、Visual BasicとかVBAとかVB scriptとかWindows環境でのプログラミングもこのような感じで作っていた。名前の効果かHyperTalkとなれば凄いという感じがするがVisual Basicとかになるとダサいと感じる。
2. Scriptを書くには…

 HyperTalkでプログラミングをするということは,ButtonやField,Cardに付随するScriptをエディットするということと同義である.ButtonやFieldのScriptをエディットするには、プルダウンメニューの[Tools]からButtonツールやFieldツールを選んでおいて,目的のButton,Fieldを選択し(図6を参照),[Objects]メニューから[Button Info...]または[Field Info...]の項目を選択する(図7を参照).そして,開かれたダイアログの中の[Script]と書かれたボタンをクリックする.これで目的のスクリプトが開き,編集可能となる(図8を参照).
 HyperTalkのプログラミングを始める場合は、既存のScriptを参考にするのが得策である.例えば,「Button Ideas」のStackから適当なButtonをピックアップし,自分のCard上にコピーする.ButtonやFieldも,カット/コピーーストが可能だ.この場合,コピーるのは、単なるButtonのアイコンだけではなく,オブジェクトとして持っているScriptなどの情報も含まれている.
 あとは、このScriptを見ながら動作を確認して,モディファイしつつプログラミングのコツをつかむのが理解の早道になる。

ASCII1987(12)d04HyperCard図6_W467.jpg
ASCII1987(12)d04HyperCard図7_W469.jpg
ASCII1987(12)d05HyperCard図8_W494.jpg
3. HyperTalkの制御構造

 HyperTalkのScriptは,通常,いくつ「かのMessage handlerが集合したものになる.Message handlerは,前回も簡単な例を紹介したように「on+メッセージ名」で始まり,「end+メッセージ名」で終わる.そして,このonとendではさまれた部分が,上から下に順番に実行される.HyperTalkにも,一般のプログラミング言語と同様に,この実行順序を変えるための制御構造が用意されている。オブジェクト・オリエンテッド言語の制御構造だからといって、むずかしく考える必要はない.HyperTalkの制御構造は、一般的な手続き型言語のそれと,ほとんど同じように考えてさしつかえない.基本となるキーワードは,ifとrepeatの2つである.この2つと,他のいくつかのキーワードの組み合わせで,何通りもの制御構造を構成することができる.例を挙げて説明しよう. まず,if...then...else...endifの形がある.これは,
if<論理表現>then
  <コマンド>
  ......
else
  <コマンド>
  ......
endif
 のように書く.<論理表現>は,真または偽の値をとる式である.<コマンド>はHyperTalkのコマンドで,これについては後で述べる.この制御の流れについては,他の手続き型言語と変わらない.
 条件判断にともなうコマンドが1つのときは,endifは不用で,次の2通りの書き方ができる.
if<論理表現>then<コマンド>
または
if<論理表現>
then<コマンド>
else<コマンド>
 次に,repeatを使用したものには,
repeat for,repeat until,repeat while,repeat withなどがある.単純に指定回数だけを繰り返すには,
repeat for<繰り返し数>
<コマンド>
  ......
end repeat
と書く.forは書かなくても同じ動作をする。
repeat until<論理表現>
  <コマンド>
end repeat
は論理表現が真となるまで(偽の間),
repeat while<論理表現>
  <コマンド>
  ......
end repeat
は真の間,コマンドを繰り返す.
repeat with<変数>=<初期値>>to<終了値>
  <コマンド>
  ......
end repeat
は,変数に初期値を代入し,それをインクリメントして終了値となるまでループする.
 またこれらのrepeatとend repeatの間にnext repeatを挿入すると,そこからend repeatまでのコマンドをスキップして次の繰り返しサイクルを開始する.あるいは,exit repeatを挿入すると,リピートループを抜ける.さらに,
exit<Message>
を実行すると,そのMessage handlerに含まれる残りのコマンドの実行を,すべてスキップできる.これらのnext,exitは前述のifと組み合わせて使うのが一般的である。
 次に,一般の言語にはちょっと見当たらない制御構造を2つ挙げる.
pass<Message>
これを実行すると,このMessageが,オブジェクトで解釈できなかったかのように,Messageを1つ上のオブジェクトにパスする.これは,下位のオブジェクトで何らかの処理を行った後,さらに一般的な処理を上位のオブジェクトに任せ たいような場合に使う.これによって,オブジェクトの階層構造が生きてくる.これはSmalltalk-80の「インヘリタンス(継承)」の機能に似ている.
send<Message>to<オブジェクト>
は任意のMessageを他の任意のオジェクトに送る面白い使い方として,
send<Message>to me
とすれば,任意のMessageを自分自身に送ることができる.


nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。