2005年05月30日
川俣晶の縁側ソフトウェア技術雑記 total 2695 count

それがスタックマシンの威力だ! Whitespace言語の字句解析や構文解析が簡単である必然性

Written By: 川俣 晶連絡先

 むむっ。またプログラム言語ミーハー的に、一言語りたくなる空気に満ちた文章が!

[雑記/備忘]Whitespace言語が教育的な理由

より

檜山さん wrote:

僕が「Whitespace言語は教育的だ」と思った理由のひとつは、川俣さんと同様に、スタックマシン(仮想機械)を体験できることです。が、それだけではありません。

しかしWhitespace言語は、字句解析も構文解析もやたらに簡単です。実行系はスタックマシンですから、これも(他の方式に比べ)単純です。

 ここでは、「それだけではない」として2つの特徴をあげていますが、実は私から見ると2つ目の特徴「字句解析も構文解析もやたらに簡単」は、スタックマシンの特徴そのものなのです。

 そのことは、スタックマシンの生のモデルをユーザーに使わせる言語を通して見れば分かります。

 たとえばFORTHと、"BASIC/C/C++/Java/C#/Pascal/その他"を比較してみるとか。

 あるいは、HP(ヒューレットパッカード)のプログラム電卓(逆ポーランド表記)と、シャープのポケコンのBASICを比較してみるとか。

 FORTHにせよ、HPのプログラム電卓にせよ、普通のプログラム言語に存在する命令と演算子というような分類が存在しないことが分かると思います。

分類が存在しないことの必然性 §

 このような分類が存在しないことは、スタックマシン=あらゆる操作がスタックという暗黙的に指定されるたった1つの一時記憶域に対して行われるアーキテクチャがもたらす必然と言えます。つまり、足し算を行う演算子が担う仕事と、足し算を行うサブルーチン(あるいはプロシージャ、あるいはメソッド)の呼び出しが担う仕事は完全に同等であって、区別する意味がないのです。

 もちろん、区別する意味はなくても様々な理由から区別して複雑化したスタックマシンはあり得ます。

 しかし、前の文章で、私は「このWhitespace言語というのは、シンプルで素直なスタックマシンを扱う言語です」と評価した通り、そのような複雑さはWhitespace言語には含まれていないと考えたわけです。

スタックマシンは簡単すぎるか? §

檜山さん wrote:

そこまで話が単純だと、自明さゆえのバカバカしさが気力を萎えさせますが、Whitespace言語は、その構文が自明でない(というか、尋常でない!)特徴、つまり見えないという特異な性質を持っているので、興味を持続することができるのです。

 たとえばFORTHインタプリタ(中間コード インタプリタ)は、アセンブラで10行もあれば書けると言われています。話はとてつもなく簡単です。

 しかし、話はそこで終わりません。実装は簡単でも、それをいかにして使うのかというハードルが高いからです。そのハードルを超えた言語設計ができねば、実装に踏み込めないのです。それを踏まえた言語作りは面白い題材である、と言うことはできると思います。(今回の件は、既存言語の実装なので当てはまりませんが)

ハードルの高さの事例 §

 たとえば、HPのプログラム電卓がいくらクールでも、逆ポーランド表記(=生のスタックマシンの構造)は分かりにくく、シャープのポケコン(BASICマシン)の方がずっと人気が高いように思います。

 もしかしたら、唯一の成功(かもしれない事例)は、FORTHの派生形となる日本語プログラム言語のMINDかもしれません。逆ポーランド表記、つまりスタックマシンの自然な表記順が、日本語の語順と同じであるという点に着目した日本語プログラム言語です。しかし、残念ながら、最近はあまり利用事例を見かけません。

 というわけで、人気のない不遇さが、スタックマシンへの愛着を誘うわけです (笑。