2012-04-20

【Forth】JavaScriptでForthっぽいの作ってみた。

ちょっと前から、簡単な言語構造をしているプログラミング言語を他の言語で実装することにはまっています。
今回挑戦したのはForth言語です。
今回はJavascriptで作ったので、整数も浮動小数点数も同じ1つのスタックで処理できます。つまり、「1.2 2 + sqrt」とか書くことが可能です。
この言語の特徴は「スタック志向」と「逆ポーランド記法(後置記法)」につきます。他の言語で言う「関数」は「ワード」といいます。ワードは辞書に登録されています。
と、突然言われても良くわからないのと思うので、早速サンプルプログラムをいくつか列挙して解説していきたいと思います。
Forthは(というより後置記法がですが)偶然にも日本語の並びにとても似ているので日本語で説明するのが実は簡単です。

04-21追記:個別サイトを作ってみました。JS Forth

●インタプリタデモ
1.下の入力欄にプログラムを入力して、エンターキーを押します。
2.自動的に計算結果が入力欄の下にたまります。
※このページをリロードすると定義したワードが消えてしまいますので注意してください。




●20000円を3人で割り勘にする
 → 20000 3 /mod floor . .
解説:
上のプログラムは以下の通り処理が進みます。
1)20000をスタックに積む。3をスタックに積む。(20000 3)
2)スタックから2つ値を取り出して、除算をし、剰余をスタックに積む。商をスタックに積む。(/mod)
3)スタックからひとつ取り出して小数点以下を切り捨てる。(floor)
4)スタックから1つ取り出して表示する。(.)
5)スタックから1つ取り出して表示する。(.)
ね、簡単でしょ?
日本語で説明するときは、「20000円と3万円で割り算して商と余りを出す。商の小数点以下を切り捨てて結果を出す」といったところでしょうか。

●割り勘ワード定義
上のプログラムをワード(関数)にしてみます。
 → : warikan ( n1 n2 -- n n ) /mod floor ;
解説:
1)「:(以下コロン)」はワード定義が始まるときに書きます。コロンがないとForthインタプリタは解釈モードとして動作し、結果を出そうとします。それをやめさせるにはこのコロンが必要です。コロンが見つかったときインタプリタは「コンパイルモード」になってプログラムがワード定義だとわかり、結果を出すのではなく定義されたワードを辞書に登録します。
2)「warikan」はワード名です。
3)「(」~「)」はコメントです。この場合のコメント「( n1 n2 -- n n )」はスタックから2つ取り出し、処理結果を2つ積む。という内容のコメントです。
4)「/mod floor」はwarikanワードのプログラム本体でこれらに引数の記述は必要なく、ワードの中でスタックからポップする処理やプッシュ処理が記述されているので「引数を本当に」とりません。
5)「;」はコロン定義の終了マークです。

Forth言語のプログラムは以上のような感じです。

●組み込みワード
今のところ組み込みワードは以下の通りです。
注意としては、制御構造ワードは「コンパイルモード」でしか使用できないところでしょうか。
詳しいワードの説明は「GForthマニュアル」がいいと思います。

・算術演算(整数・小数の区別なし)
+ 1+ - 1- * / mod /mod negate abs min max

・ビット演算
and or xor invert lshift rshift 2* 2/

・比較演算
< <= <> = > >= 0< 0<= 0<> 0> 0>=

・算術関数
floor round ** sqrt exp log cos sin tan acos asin atan atan2 pi

・制御構造
if else then endif begin agein repeat while until ?do loop +loop -loop unloop leave exit recurse

・スタック操作
drop nip dup over tuck swap rot -rot pick clearstacks

・表示
. .s

ZenBack

WebMoney ぷちカンパ