FORTH言語再び
むかしむかし、基板にソケットをハンダ付けしてマイコンボードを作っていた頃は、ハードウェアがいけそうとなるとモニタというかファームウェアも自分で書いていました。次はBASICインタプリタを動かすのが目標なんですが、流石に一から書くことはしなくて、どこからかソースコードを手に入れて自分のシステムに合うように設定を行ってアセンブルして作っていました。そんな訳でインタプリタの構造を読んでしまうと、次は自分で言語処理系を作りたいという意欲が出てきます。
そんな時代に流行ったのがFORTHという言語処理系です。FORTHは、それ自身のシェルを持ちインタプリタでもあり、そこからコンパイラも呼び出せます。つまりOSを用意せずともそれ自身で完結する言語であり環境なわけです。
Forth
その文法は独特で仮想的なスタックマシンであり、式の評価は逆ポーランド記法と呼ばれる少しばかりクセのある順序で値と演算子を並べます。この記法は一部の関数電卓でも採用されており、最初はどう計算してよいのか戸惑います。しかし特に日本人にとっては、その順序が日本語に似ていて”1+2=”と式の順序にキーを叩くのではなく「1に2を足す」という順序でキーを叩くので慣れると頭の中で処理を考えながら使うにはむしろ使いやすいです(書かれている式を計算するにはちょっと不向き)。
逆ポーランド記法
少しトリッキーというか LISP っぽいというか、ちゃんと条件分岐も出来てループも作れますし、もちろん関数も定義できます。型は無く値はすべて同じように扱われます。あとは関数での解釈次第。基本的にはキーボードやファイルから読み込まれたプログラムは、そのままスタックに積まれインタープリトされるわけですが、必要であれば関数をコンパイルすることも出来て、ソースコードが置かれていたメモリをコンパイルしたマシン語コードに置き換えて、関数を実行する際にソースコードを解釈するのではなく、マシン語を実行するようになるんです。つまり必要なところだけを部分的にコンパイルして使うんですね(マシン語で書いたコードを関数として実行するのも、同じ仕組みでOK)。
プログラミング言語Forthに魅せられて。
FORTHはとてもシンプルな文法で処理系も作りやすく、拡張性も高いので、少しばかり頭の体操が必要なところはあるものの、小さなシステムに実装して使うには十二分です。そもそもコンピュータは人間の使う数式を理解するのは得意ではなく、大部分のプログラミング言語で使われる式は、コンピュータが実行できるように、逆ポーランドに変換して処理するのが常です。ですから言語処理系に挑戦したことがあれば、この方法はお手の物ではあるわけです。コンピュータの能力が限られていた時代、ヒトの方がコンピュータに寄り添って、コンピュータのように考えて処理を組み立てれば、それはコンピュータにとって効率の良いコードになるわけです。
Forth言語の歴史
第1章 Forthの哲学
ちなみにFORTHの処理系は入力文字列に対するパーサーさえ書けてしまえば、基本的には左から順に実行するだけで済みます。本物のスタックポインタはマシン語レベルのサブルーチン呼び出しで使ってしまうので、他のレジスタで仮想的なスタックを実装するのですが、リアルなレジスタに対してスタックと同じ操作の出来る命令やアドレッシングモードがあれば言う事無しです。CPUによってはちょっと面倒なこともあるのですが、6809のようにマンマ使えるレジスタ(Uレジスタ)があれば、そのまま使えるので大助かりです。
そういえば8086にコプロセッサとして8087が登場したときに、そのレジスタがスタックとして実装されていて驚いた覚えがあります。まるでFORTHをハードウェアで実装したみたいに見えました。このようにいわゆる低レベルとも呼ばれるハードウェアに近い操作はFORTHの得意分野でした。
結局、ソフトウェアが大規模になるに連れ、FORTHではどうしても力不足の部分も目立つようになり、何よりもヒトの方がスタックベースの思考には慣れなかったので、一般的なプログラミング言語としては徐々に使われなくなってしまいました。しかしながら意外な形で、その子孫が誕生したのです。
プリンタが単に送られてきた文字コードを行を単位に印字していた時代から、アウトラインフォントを使って自由に位置や大きさが指定できるページ単位に印字する時代になったときに、その複雑な処理を行うためのページ記述言語としてPostScriptが登場しました。
PostScript
この言語はスタックを使う逆ポーランド記法で記述していくように設計されていて、そうです、まるでFORTHのような書き方をするのです。確かにヒトが直接、PostScriptを記述することは滅多になく、印刷を目的とするアプリケーションが多種多様なプリンタに出力するための高級言語な訳で、プログラムがデバイスに対して使う言語であれば、まさにうってつけな訳です(そういえばHTMLなども、ヒトが書くものではないですね)。
また、逆ポーランド記法が日本語との相性が良いことから、FORTHの考え方をベースにしたMindであったり、なでしこが開発されて一部では熱狂的な利用者がいるようです。
Mind (プログラミング言語)
なでしこ (プログラミング言語)
日本語プログラミング言語Mind前史 - スタックフレームとFORTH
日本語のプログラミング言語って、定期的に流行がやってくるのですが、文字をキーから打ち込んでコードを書いている限り、ちょっとばかり使いにくいんですよね。でもGUIベースであったり音声入力で処理が書けるようになれば、次の流行がやってくるのかもしれません。
ヘッダ画像は、AIに描いてもらいました。
#プログラミング言語 #FORTH #逆ポーランド記法 #スタック #日本語 #PostScript #Mind #なでしこ