現在のプログラミング言語は、ほとんどすべてがALGOL系と呼ばれるものです。それは、チョムスキーの生成文法をベースにしたものであり、字句解析・構文解析・意味理解という3段階での処理がおこなわれます。

これは生成文法の基本構想であり、意味に深入りすることなく字句解析や構文解析が可能であるという前提に立っています。しかし、すべてのケースに対応できるものではありません。たとえば、次の二つの英文を見てみましょう。

 A. Time flies like an arrow.

 B. Fruit flies like a banana.

これは英語のfliesには動詞と名詞の二つのケースがあることによります。動詞として解釈するとそれぞれ「時は矢のように飛ぶ」と「果物はバナナのように飛ぶ」となります。名詞として解釈すると「時バエは矢を好む」と「ミバエはバナナを好む」となります。したがって、Aではfliesは動詞であり、Bでは名詞であると解釈するのが正しいということになりますが、それは意味論を持ち出さなければ判定不可能です。これは特殊な例ではありません。英語の辞書を見ると、動詞と名詞の両方に使える単語は普通にたくさんあります。


しかしながら、人が言葉を使うのは意味を伝えるためです。最初に伝えたい内容があって、それにふさわしい構文と単語を選ぶのです。プログラミング言語も同じではないでしょうか。現実問題としてWindowsプログラミングでは、大変なことになっています。

たとえば、ハイパーテキストやプッシュボタンを表示するのは、それをクリックしたときに何かの動作をさせるのが目的です。しかし、現在の方法では描画とマウス移動とクリックの三か所に分裂して記載することになっているのです。これはナンセンスです。

したがって対策としては、表示と動作をセットにして記述するように文法の方を変えれば良いのです。これが役割型として提案している意味です。


さて、ALGOLの開発は1950年代の後半におこなわれています。大きな動機としてはFORTRANの開発で数式の解析がぎこちなかったということがあります。この問題がチョムスキーの生成文法で見事に解決するのです。たとえば、2+3*4=14, (2+3)*4=20 です。こうした処理が快刀乱麻のごとくに解決するのです。

しかし、それは形式論としての解決であり、意味論としての解決ではありません。たとえば「男の子が2人と女の子が3人います。合わせて何人でしょうか」という質問に2+3=5 というのは一つの答えです。それに対して、男の子と女の子を足していいのかという疑問を持つ人もいるわけです。それは意味論の分野です。もしバスの座席を予約するのであれば2+3=5人分の座席を確保すればよい。しかし、合わせるということから、3-2=1 を計算して「男の子が一人足りない」という考えもできます。これは違う意味論です。

それでは、一万円札が2枚と千円札が3枚あります。合わせて何枚ですか。この質問に2+3=5 だから5枚ですという答えでいいのでしょうか。それは紙切れとしての枚数です。通貨として考えれば合計は二万三千円ですと言う答えの方が正しいように思えます。これもまた意味論の問題です。これが赤色と青色の色紙であれば、また違う解釈になるでしょう。

このように考えていくと、問題はコーディングの段階ではなく仕様書を書く段階で発生しているように思えます。実際に、プログラミングとは手書きの仕様書を機械で読み取ることのできるソースコードに置き換えることだと考えることもできます。そうであれば、仕様書を人間が自由な形式で記述するのではなく、機械で読み取ることのできる形式で記述して直接に入力すればよいではないかという考えもできます。そういうわけで、Sのもともとの意味は仕様書(Spec)からきています。とはいうものの、これが仕様書かねえという感じになってしまったので、ライブのS席のイメージです、などと言っています。まだまだ完成には遠いかも。