Mopsの基礎知識

はじめに
Mopsのプログラムリストを理解する上で必要なごく基礎的なことを以下で述べます。

ワードとは何か?
MopsのベースとなっているのはForthと呼ばれる言語です。すべてのForthと同じくMopsもワードと呼ばれる最小構成単位から成り立っています。例えば、

This is a pen

という文あるとすると、Mopsはこの文をスペース、タブ、改行などのコードで切り分けて"This","is","a","pen"という具合に4つの要素に分解します。このそれぞれの要素をワードと呼び、Mopsは自分の辞書に登録されているかどうか調べます。

もし辞書に見つかれば、即座にその機能を実行します。どのような機能をもつかはワードの定義に依っていて、ある場合にはサブルーチン、またあるときには関数、そのほかにも定義文や制御文のような機能を持つ場合などあります。

Mopsにおけるプログラミングとはなにか?
Mopsにおけるプログラミングとは、既知のワードを組み合わせ新しいワードを定義するということに他なりません。定義された新しいワードは定義の終わった瞬間から他のワードとまったく変わりなく使用することができます。
Mopsの強力な点は定義文や制御文のような機能を持つワードも自由に定義できるところで、実際Mopsがあらかじめ持っているワードの多くはより基本的なワードを使ってMops自身で定義されたモノなのです。

逆ポーランド記法とは
Mopsでプログラミングする上で逆ポーランド記法は避けて通れない一つの関門です。
簡単にいえば計算式の表記方法のことなのです。

通常、数学などで用いる計算式は

1+2

のように書き、たいていのプログラミング言語は数式をこのように表現します。
同じ式を逆ポーランド記法では次のように表記します。

1 2 +

1と2と+がそれぞれスペースで区切られていることに注意してください。
このように逆ポーランド記法では演算子がふたつの数字のうしろに表記されます。
なかなかクセのある表記法で、Forthが一般的にならないことの理由に挙げられることが多いのですが、実は日本語の思考方法に近いという面もあります。

つまり、

1と2を足す

という文をそのまま式に変換したもの、というわけです。
同様に、

4-3

は、

4 3 -
4から3を引く

2*4

は、

2 4 *
2と4をかける

9/3

は、

9 3 /
9を3で割る

のようになります。簡単でしょ?

スタックとは?
なぜこのような逆ポーランド記法を用いるのか、というとMopsでは四則演算やワードへのパラメタの受け渡し等にスタックと呼ばれるデータ構造を使うからなのです。
スタックには「積む」という意味があります。机の上に一ヶ所に積み重ねた書類などを思い浮かべるとよいと思います。

積み重ねた書類を読むときには上から順に一部づつ手にとるほうが途中の書類を抜き出すよりも簡単なやり方です。
また未処理の書類をこの書類の山に追加するには、すべての書類を持ち上げて一番下に滑り込ませるよりは単に書類の山の上に乗せるほうが簡単なやり方であることも理解できると思います。

書類をデータに置き換えた場合、このようなデータの保持方法をスタックと呼ぶわけです。
前に述べた逆ポーランド記法による計算を例にすると、

1 2 +

この場合、最初の1は数値データであると解釈されスタックに積まれます。
この時点でスタックは、

[1]

のように一つだけデータが保持されています。
次に2が同様に数値データであると解釈されスタックに積まれます。
スタックは

[2]
[1]

このようになります。
最後に+というワードが実行されると、スタックの一番上の[2]とその次の[1]が取り出され加算されます。
さて、計算結果の3はどこへゆくのでしょうか?
じつは、スタックの一番上に戻されるのです。したがって、+というワードを実行後のスタックの状態は次のようになります。

[3]

つまり、+というワードはスタックの一番上のデータとその次のデータを取り出して加算するとその結果をスタックの一番上に戻す、という動作をするのです。

では次のような行を実行すると最終的なスタックの状態はどうなるでしょうか?

1 2 3 +

+が実行される直前のスタックの状態は

[3]
[2]
[1]

このようになります。
スタックの一番上のデータとその次のデータを取り出して加算するわけですから、この場合は、3と2が加算されます。したがって最終的なスタックの状態は

[5]
[1]

と、なります。
四則演算に限らず、一般的にワードはスタックを介してパラメタや処理結果をやりとりします。
したがって、Mopsにおけるプログラミングでは他の言語における引数に相当するものはワードの前に置かれることになります。
一般的に書くと

p1 p2 p3 ... pn HOGEHOGE

というようになります。

おまけ(Forth系の言語の現在について)
Forth系の言語は現在、パーソナルコンピュータ上のアプリケーションを作成する言語としてはほとんどかえりみられることのなくなった言語ですが処理系が小さいこと、インタプリタとして働く機能のあることなどから、制御系のプログラミングに使われることがいまだにあるようです。実際、現在でもOpen FirmwareのユーザーインターフェースとしてForthが用いられています。
(ref. Machintosh Developer's Journal No.23 1997 p.22 "Open Firmwareの基礎")


戻る