はじめに
この記事は、「キリーの日本語プログラミング」ブログに掲載したコラムを編集したものです。Mindアドベントカレンダー2024に投稿します。
日本語プログラミング言語Mind前史 - スタックフレームとFORTHというQiitaの記事を詳細にした内容となります。
この記事で言う「FORTH」という言葉は真正なFORTH言語というよりは、もう少し広く「スタック指向のプログラム言語」や「スタック指向の命令体系」を指すのにあえてFORTHと書いています。FORTH言語をよくご存じの方がご覧になると、言語特有の自己増殖スタイルの話とか、インタプリティブな開発環境(即コンパイル・即実行)など、一番おいしい所が抜けているように思われるかも知れませんが、その点ご承知をお願いします。
スタックコンピュータとFORTH(1)
MindはFORTHというプログラム言語から派生して開発された。Mindのルーツをたどる意味でFORTHと逆ポーランド記法についてまとめてみた。
またCPUとしてのFORTHについて良い書籍があるので紹介したい。「スタックコンピュータ」、Philip J. Koopman, Jr.著、田中清臣監訳/藤井敬雄訳、共立出版である。1994年発行だがアマゾンでまだ売られているようだ。(書籍については後編で改めて書きます)
逆ポーランド記法について
最初に逆ポーランド記法について。通常のプログラム言語ではたとえば、
2 + 3
のように記述するが、FORTH言語では、
2 3 +
のように書く。語順が特殊で逆ポーランド記法と呼ばれている。最初に演算対象となる値を書き、最後に演算名を書くことになっている。
私は昔、FORTHの講習会をやっていたころ、「これは日本語として・・2に3を加える‥と読めば分かりやすいです」と教えていた。(のちに、本当にそのように日本語で書くMindを開発することになったのだが)
話を戻すと、通常のプログラム言語での
2 + 3
につては、「+」の両側に必ず数値を書かなければならない。つまり、
+ 2 3
や
2 3 +
のように書くと文法エラーになってしまう。逆にいえばそのような文法が規定されていてプログラマはそれから免脱しないよう書かなければならない。
一方、FORTHでの書き方である、
2 3 +
は、なぜこのような書き方になるかというと、FORTHがスタック指向の言語だからである。どのようなプログラム言語もスタックは内部的には使っているのだが、FORTHのそれは少し意味合いが違って、プログラマがスタックを明に意識して使うことが特徴である。
上記 「2 3 +」 は、
2をスタックに積み、 3をスタックに積み、 +を実行する
という意味になる。「+」というワードはスタックから2つの値を取り出し、加算を行い、結果の5を再びスタックに積む。FORTH言語の設計者が文法としてこの書き順を発明したというよりは、スタック指向のプログラムというのは、その動作原理上、必然的にこのような書き方になったのだろう。
次のFORTHプログラムはどうだろうか。
3 +
先と同様に、上記は
3をスタックに積み、 +を実行する
という意味合いになる。演算対象となる片方の数値が書かれていないが、間違いとは言えない。この処理が開始する以前に既にスタックに何らかの値が積まれていれば、「それに3を加える」ことになるからまったく普通の計算である。
「表記上の形」にこだわると本質が見えにくくなる
逆ポーランド記法だからといって 「2 3 +」 のスタイル‥つまり、「+の直前に2つの数値を書く」といった「表記上の形」にこだわると本質が見えにくくなる。
極端なケースを書けば、FORTHのプログラムで
2 + 3
や
+ 2 3
あるいは
+ + -
と書いても(正しい演算がおこなわれるかどうかは別として)コンパイラは何も言わない。FORTHのプログラムとして間違いではないからである。乱暴なことを言えば、まるでFORTHには文法が無いように見えるくらいである。
通常のプログラム言語の「+」とFORTHの「+」は、同じ記号を使っているが、だいぶ意味が違う。通常の言語ではコンパイラは「+」記号の左右に書かれた値とワンセットで解釈し、しかるべき計算をする。
つまり間接的にプログラマからコンパイラに意図を伝えることになる。
一方、FORTHプログラム中に現れる「+」は、単に「この時点で+を実行する」というもので、よりダイレクトで独立したものである。
現実のFORTHプログラムでは「+」の直前に値が書かれることは多いのだが、コンパイラはそんな前後関係をまるで関知しておらず、単に「+」が書かれていたら「+」を実行する(ようなコードを生成する)だけである。
FORTHでは「+」に必要な2つの引数についてコンパイラは興味が無い。「+」が呼び出されたときスタックに引数が積まれているはず‥と期待して動作することになる。つまり、「+」の引数はソースコードに記述されているものではなく、実行時にスタックに積まれているものが引数である。
FORTHのソースコードとして書かれたワードの羅列が、その書かれた通りに1つつ順に実行されることは1つ大きな利点がある。制御系システムのように、細かな処理のタイミングや順序が非常に重要となる分野で有利なことである。
私がFORTHにかかわっていた時期の経験でも、ユーザのほとんどが計測・制御分野であった(もちろん、そのほかにROM化が容易だったとか、言語の習得が容易だったなどの理由もある)。
アセンブリ言語にも似ている
さらに言えば、ソースコードとして書いたものが1つ1つ順番にCPUで実行される‥という点で、FORTHはアセンブリ言語にも似ている。いままで何回も示してきたプログラム、
2 3 +
は、アセンブラで書いたとすれば以下に相当するだろう。
PUSH 2
PUSH 3
CALL +
このようにFORTHは高水準言語と低水準言語の両方の側面を持つ特異なプログラム言語と言える。
ここまでを前置きとして、冒頭の書籍「スタックコンピュータ」の紹介をしたい。
つづく
少し長いので(2/2)へ続きます。