SenseTalkについて
SenseTalkは、ご使用のコンピュータを操作するための言語です。英語に似て、読み書きや理解がしやすいのが特徴です。SenseTalkを使用していると、目的の動作がこの記述で行えるのだろうかと思っていても、きちんと機能した時に、嬉しい驚きを覚えることがよくあります。
もちろん、コンピュータに理解力があるわけではないので、 出した指示を正しく理解させるためには、曖昧さのない明確な方法で指示を記述しなければなりません。このために、SenseTalkは英語よりも構造化された言語になっており、そのルールに従う必要があります。
SenseTalkの紹介
SenseTalkは、コンピュータの能力を利用するために行われるコンピュータとの対話を、斬新なほど簡単で理解しやすい方法によって実現します。その学びやすさと理解しやすさはそのままに、コンピュータに備わっている機能の全範囲にアクセスすることが可能です。こうした裏には、コンピュータ業界でバズワードとなってきた数々の言葉に潜む効果的な概念が活かされています。
今どきの専門用語を使うと:
SenseTalkは、超高水準なオブジェクト指向のインタプリタ型スクリプト言語で、モジュール式の拡張可能なアーキテクチャに基づいています。
これは、平たく言えばどういうことなのでしょうか?
SenseTalkが「オブジェクト指向」である理由は、潜在的に複雑なシステムを記述したり扱ったりする際に、オブジェクトを考えることが自然で理解可能なやり方だからです。私たちの日常生活では、電話やコップ一杯の水といった有形であれ、銀行口座や子供のサッカーの日程といった無形であれ、「モノ」を扱います。SenseTalkを使うと、これら1つ1つのモノを表す「オブジェクト」をコンピュータ内で作成することができます。
SenseTalkが「超高水準」な言語と見なされるのは、少ない単語数で多くのことを実行できるためです。高水準コマンドにより、ユーザの仕事は楽になります。仮に、ある名前のリストがあって、そのリストをラストネームでアルファベット順に並べ替えたいとしましょう。低水準プログラミング言語の場合、それぞれの名前にある最後のスペースの位置を特定してラストネームを見つける指示を書いてから、さらに複数の指示を通して入念に名前をアルファベット順に並べ替えていく必要があります。SenseTalkの場合は、“sort the lines of nameList by the last word of each”というコマンドを与えるだけで済みます。
また、「インタプリタ型スクリプト言語」であるSenseTalkは非常に応答的なため、言語を学んで新しいコマンドを試すとき、フィードバックが即座に得られます。コマンドやスクリプトの一部を入力したら、コンピュータにすぐにその指示を実行させることができるのです。
そして、SenseTalkの「モジュール式の拡張可能なアーキテクチャ」により、新しいコマンドや関数を追加して、SenseTalkでできることの幅を広げることができます。SenseTalkは、固定的なものではなく、ニーズに合わせて発展・進化させていける言語なのです。この基礎となる構造は、コンピュータ機能の進歩とユーザの知識や理解の向上に応じて変わりゆく新しい要件に対応すべく、巧みに作られたものです。
簡単に言えば、SenseTalkは、ユーザがやりたいことをコンピュータに伝えることのできる英語に似た言語です。 その方法は、まず、扱いたい情報を理解できる形でまとめ上げたソフトウェア「オブジェクト」を作成し、各オブジェクトに対して求める振る舞いを記述した「スクリプト」を書きます。
演劇を書くことに少し近いという考え方もできます。登場人物の役の割り振りを作り、それぞれの役割と、送られてくるであろうさまざまなメッセージに対してどう応えるべきかを定めた独自の台本(スクリプト)を与えます。ただし、演劇とは違って、スクリプトの実行のたびに毎回同じことを繰り返す必要はありません。登場人物(オブジェクト)は、互いに、およびシステムのユーザ(あなた)と、メッセージを送り合ってやり取りします。
メッセージは、オブジェクトにやるべきことを伝える場合もあれば、オブジェクトに情報を与える場合もあります。メッセージを受け取ったとき、オブジェクトは、システム内で起こっていることに応じて、その都度異なる形で応答することがあります。すべては、オブジェクトのスクリプトが与える指示によって決まります。各オブジェクトは、それぞれのスクリプト(従うべき指示の集合)を持っていて、その指示の記述に使われるのがSenseTalk言語です。
SenseTalkは、元々はHyperSense(Thoughtful Softwareの高性能オーサリングシステム)のスクリプト言語として作られたものです。このドキュメントでは、一部の例や説明において、HyperSenseオブジェクトまたはその他の機能を参照している場合があります。しかし、SenseTalkは別個のスクリプト言語として独立したものでもあります。このドキュメントの目的は、使用が想定される特定の環境またはホストアプリケーションとは無関係に、SenseTalk言語を説明することです。
なぜSenseTalkなのか?
さて、ここで、SenseTalkが全体的に良さそうな言語だということは分かったけれど、世の中には既にたくさんのスクリプト言語があるというのに、 まだ別の言語が本当に必要なのだろうか?と思われたかもしれません。SenseTalkは何が違うのだろう?と。
この疑問は核心を突いています。答えは必ずしも1つではありません。どの言語にも、それぞれの強みと特色があります。そして、ある言語のさまざまな特徴の中でどれに魅力を感じるかは人によって異なるのです。SenseTalkが他の言語から一線を画す最大の特徴(独自色を出すテーマ)は、最初にも述べた通り、「非常に英語に似ていること」でしょう。
ここで、「英語に似ていること」は、一部の人にとってはプログラミング言語の利点には見えないかもしれません。英語は時に冗長で、意味において曖昧な場合があるからです。そのような人は、より簡潔で的確な、構文規則の厳しい言語を好むでしょう。それはそれでよいのです。
一方、英語に似た言語がもたらす特別な利点というものもあります。それは、初心者にとって学びやすく、また、経験豊富なユーザにとっても記憶に留めやすく、誰にとっても読んで理解するのがはるかに簡単だということです。この可読性という特徴により、スクリプトの維持と修正もかなり楽になります。
ここからは、他の主要言語との比較を通じて、SenseTalkの読みやすさを見ていきましょう。まずは、世界で現在最も広く使われているスクリプト言語の中からPerlおよびPythonを取り上げて比べてみます。
WikipediaによればPerlは「美しい(短く、洗練されていて、最小限)よりも実用的(使いやすく、効率的で、完全)」であることを目的として設計された言語で、むしろ暗号めいていて可読性が低いことで有名なため、 SenseTalkとは対極をなす存在です。以下のPerlスクリプト例は、Perlの専門家による有名な著書からほぼそのまま引用したものです(「Perl Cookbook」、p. 247)。このスクリプトが何を行っているのかは、後ほど説明します。
sysopen(FH, "numfile", O_RDWR|O_CREAT)or die "can’t open numfile: $!";
$num = <FH> || 0; # DO NOT USE "or" HERE!!
seek(FH, 0, 0) or die "can’t rewind numfile: $!";
truncate(FH, 0) or die "can’t truncate numfile: $!";
print FH $num+1, "\n" or die "can’t write numfile: $!";
close(FH) § or die "can’t close numfile: $!";
一方のPythonは、読みやすいことで知られるもう1つの人気スクリプト言語です。同等のスクリプトをPythonで書くとこうなります。
file = open("numfile", "r+")
num = int(file.read())
file.seek(0,0)
file.truncate(0)
file.write(str(num+1) + "\n")
file.close()
最後に、同じ動作を行うSenseTalkスクリプトがこちらです(上記のスクリプトではまだ何をしているのか分からなかった場合は、これで分かるかもしれません)。
add 1 to file "numfile"
これで、随分と分かりやすくなったのではないでしょうか。この3つのスクリプトがやろうとしているのは、「numfile」という名前のファイルに保管されているカウンタに1を加えることです。こうして比較したのは、多くの人に広く使われている非常に強力な言語であるPerlやPythonを非難するためではありません。そうではなく、厳格さはさほど必要ないかもしれないが、素早く簡単に作業したいというスクリプト記述者へ、SenseTalkがもたらす利点を示したかったのです。
公平を期すため、PerlおよびPythonスクリプトもいくらか短くできること、また、SenseTalkにも、同じ動作を行うのに上記2言語に匹敵するような長い記述法があることを付け加えておきます。以下は、同じタスクを実行するSenseTalkの別のスクリプトです。他言語のスクリプトで使用されていた手法により近い手順を踏んでいます。
open file "numfile"
read from file "numfile" until end
put the first word of it into num
seek in file "numfile" to the beginning
write num+1 & return to file "numfile"
close file "numfile"
Perlスクリプトの「or die」部分(ほとんど起こりそうもないエラーの報告について万全の慎重を期すためだけのもの)をすべて除けば、今度はSenseTalkスクリプトの方がPerlやPythonのものよりも若干長くなりました。それでも、SenseTalkスクリプトの方がずっと分かりやすく、読みやすく、理解しやすいこと、さらには学びやすく記憶に留めておきやすいことに同意いただけるでしょう。可読性が一段と高いため、SenseTalkでは、ミスを見つけて修正したり、少し異なる動作が必要だと判断した場合に数か月前のスクリプトを変更したりすることも簡単です。
もう1つ例を挙げてみましょう。今度はもっと多くの言語を使って、ごく一般的な動作である、varという変数に格納されているテキスト文字列の最後の文字を削除する方法を見ていきます。
- PHP: $var = substr($var, 0, strlen($var)-1)
- Ruby: var.chop
- Perl: chop($var)
- Java: var = var.substring(0, var.length()-1);
- Python: var = var[0:-1] // (または一般に:var = var[:-1])
- JavaScript: var = var.slice(0, -1)
- Excel VBA macro: ActiveCell.Value = Left(ActiveCell.Value, Len(ActiveCell.Value) - 1)
- SenseTalk: delete the last character of var
この場合、RubyとPerlのスクリプトが一番短く、「chop」関数の振る舞いを知っていれば非常に読みやすくもあります。しかし、この言語を初めて見る人にとっては、何が行われているか一目瞭然となるでしょうか?
では、最後の文字ではなく、delete the first character of var(varの最初の文字を削除)するようにスクリプトを修正する必要があるとしたら、どうでしょう?もしくは、delete the last two characters of var(varの最後の2文字を削除)するとしたら?どうやったらよいかすぐに分かるでしょうか?(ヒント:思い付かなかったという場合のために、その動作を実行するための実際のSenseTalkコマンドを斜体で質問に組み込んでおきました!)
さて、SenseTalkとはどのようなものなのか、目指すところは何かという概念を紹介する導入編はこの辺で十分でしょう。ここからは、SenseTalkの機能と使い方について、掘り下げて学んでいきましょう。