はじめに
Forth言語との関連でMindの仕組みについて説明させてください。長文で恐縮です。
MindはFORTHからの派生
Mindは歴史的にはFORTHというプログラム言語からの派生となります。
私が初めてFORTH系のプログラム言語を開発したのは1978年ごろです。当時勤めていた会社のマイコン開発システムに装備する組み込み系のプログラム言語「IDS-FORTH」として作ったのが最初です(装備した言語はアセンブラとFORTH)。当時のFORTHとしては珍しくプログラムをROMに焼くことができました。
以来長いことFORTH言語を使ってきて順序としてはその後でMindを開発したという経緯です。
逆ポーランド記法
FORTHはご存知のようにいわゆる逆ポーランド記法でプログラムを書きます。通常のプログラム言語ではたとえば、
2 + 3
のように記述しますかFORTH言語では、
2 3 +
のように書きます。最初に対象となる値を書き、最後に演算名を書きます。
私は昔、FORTHの講習会をやっていたころ、
「これは日本語として・・2に3を加える・・読めば分かりやすいです」
と教えていましたが、だいぶ経ってから「だったら本当にそのように日本語で書くFORTHを作れば良いのでは?」と思い、MS-DOSの時代に16bit用のFORTHとして開発していたFifth86に土壇場で日本語表記サポートを追加しました。
Fifth86
Fifth86で留意したのはやはり日本語特有の表記への対応でした。次のようなことです。
・空白は数字などは半角・全角どちらでも同じ扱いにする(見た目が同じものは同じにする)
・送り仮名の揺れを許容するため語末のひらがなは削除してしまう
・従来通りのアルファベット表記(英語風プログラム)も許容する
具体例としては、ワード「+」とワード「加え」を等価定義し、数字「8」は全角「8」も等価扱い、半角空白を全角空白と等価扱いとし、末尾平仮名の削除をおこないました。分岐語なども「if」に対して「ならば」を等価語定義しました。
そうすることでFifth86だと前記のプログラム例は
2に 3を 加える
と書けることになります。「に」「を」の助詞や「える」の活用語尾を無視することで座りの良い表記をすることができます。上記は
2 3 加
でもいいのですが日本人なら前者のほうを書きたくなります。
たったこれだけのことでプログラムが自然な日本語のような見た目になりますが、コンパイラは日本語を構文解釈のようなことをしているわけではまったくなくて、やっていることはとても単純なことにすぎません。
ツールとしてのプログラム言語が出来たので早速自分で試すため、同業他社さんから受託したプログラム(通信ソフト)をこの日本語表記のFifth86で書いて納品しました。
スタック指向の言語
ちょっとした工夫で自然な日本語のような雰囲気のプログラムが書けるようになった理由はFORTHがスタック指向の言語だからです。どのようなプログラム言語もスタックは内部的には使っていますがFORTHのそれは意味合いが違って、プログラマがスタックを意識して使うことが特徴です。
2 3 +
は、「2をスタックに積み」、「3をスタックに積み」、「+を実行する」
というようにコンパイラは処理をおこないます。「+」というワードはスタックから2つの値を取り出し、加算を行って結果の5を再びスタックに積みます。FORTHの設計者(チャールズ・ムーア)が文法としてこの書き順を発明したというよりはスタック指向のプログラムというのはその動作原理上必然的にこのような書き方になり、それが偶然にも日本語の表記にマッチした・・といって良いと思います。
偶然にも日本語の表記にマッチした
前置きが長くなりましたが、MindはFifth86をベースにし、さらに一般の人がプログラムを書けるような工夫をしました。
たとえば英語表記の一般言語では
B = A + 3
のようなものをFORTHでは
A @ 3 + B !
と書きます。「Aをロードし3を加えBにストア」と読むと分かりやすいです。
一方、一般のプログラム言語では、単に変数名を書くとその変数の内容が読み出されるのでFORTHのように「@」書く必要はありません。FORTHでは、変数名はどのような文脈で書いたとしても一意に「その変数のアドレスをスタックに積む」という仕様であるため、後続してロードなのかストアなのかを明に書く必要があります。
それはそれでFORTHらしいところなのですが、やはり不便なのでMindでは単に変数名を書いた場合は内容参照扱いとし、代入ほかの変数への副作用を書いている場合には参照ではなく副作用を与える処理を生成するような介入をコンパイラが行うようにしました。そうすることでMindでは、
Aに 3を 加え Bに 入れる
と書けるようになって(「ロード」を明示しなくて良い)シンプルになりました。
定義の開始/終了はFORTH流の、
: WORD ~ ;
ではなく、
○○とは ~ 。
とするなど日本語表記を徹底したことがあります。
ほかには局所変数を導入しました。FORTH本来の機能として、
>R R>
のようにリターンスタック上にデータを仮置きするワードがありますが、これを使うとかなり難度の高いプログラムになってしまうため、他の言語と同様、素直にワード定義内で変数定義ができるように(ローカル変数)しました。
おわりに
Mindユーザーの@mylifewithviolinさんのQiitaの記事についたコメントに対してコメントしていた内容ですが、記事にまとめてみました。