最近、大学でS先生にプログラム言語 を作りたいです!!と言ったら構文解析をゼロから教えていただく機会があった。
それも投稿していきたいと思っているが今回はiMopsという言語を使ったスタック指向のプログラム作成をしていきたいと思う。
スタックやキューとかこの記事を見ている方は多分私よりも100倍ほど知っていると思う。
なので今回はiMops中心に解説をしていけたらと思う。
iMopsとはForthをベースに開発されたスタック指向言語であるらしい。
Forthから影響を受けているということもあり、iMopsはForthの書き方でもそのまま使えることもあるようだ。(S先生より)
どっかのサイトによればiMopsはForthをベースとしているが機能はForth以上だとも書いていた。日本語を表示できたりなどするのも柔軟性が高い。
兎にも角にもプログラム言語をスタック指向で作れば面白いんじゃないということでこの勉強が始まった。
早速コードを書いていきたい。
(3+5)*5
という計算をしたい場合iMopsでは次のようにする。
3 5 + 5 *
となる。
これは最初は戸惑うと思う。でもコンピュータにとってはこちらほうが理解しやすい。
次はワードの定義の仕方を解説する。多分こっち見たほうがわかりやすいと思うけど・・・
: BMI { w h -- } w 10000 * -> w w h / h / ;
これはw(体重)とh(身長)を渡してあげればBMI(どれだけ太ってるかを表す指標みたいなもの)を定義している。
(´・ω・`)ほげほげぇ〜〜〜
ワードとはC言語で言う関数、Javaでいうメソッドみたいなものである。
一回定義したら基本は何回でも使い倒せるもの。もちろんワードからワードを呼び出すことも可能。
: NAME という感じで定義する。ワードの名前は大文字にする。そして一番大事なのが
:←のあとに必ずスペースを入れることに注意して欲しい
これはコンパイラが:が来てスペースを区切った次の大文字の文字列をワード名にするとプログラムされているからである。
{ w h --}も同様で{のあとには必ずスペースを入れる。そしてこのカギカッコの中には引数をいれる。そして--はコメントを表していて--のあとにはコメントを書けるようになっている。慣習としては--を書くようにするといいらしい。
{}内で引数(変数)を書いた後は自由に使える。二度使うこともできる。
w 10000 *でスタックにw 10000を格納してその積を格納するという処理。
その後の->というのは->のスペースを挟んだ後の変数にその結果を入れるということ。
つまりw と10000の積をwに代入するということをここで行っている。
そしてその後はw hをスタックに格納してその2つの変数を除算してさらにそれをhで除算するという処理を行っている。これがBMIというワードの流れである。
そして次はそのBMIをしようしてBMI2というものを作成していく。
BMI2ではBMIで求めた指数を利用して値の幅によってfat、normal,slimの表示を分けることをする。
: BMI2 { w h -- }
w h bmi
19 <=
IF ." slim."
ELSE w h bmi 25 <=
IF ." normal."
ELSE ." fat."
THEN cr
THEN cr ;
突然IF文が出てきて戸惑っているだろう。当たり前だ。なぜなら私もIF文を正しく認識していないのだから
[引用]
http://www.geocities.jp/naosacra/mops/Manual/tutorial/conditionals.html
多分IF文に関しては上のURLのチュートリアルをみながらやったほうが断然いいはずwww
MopsのIF文はゼロではないときに真になり、ゼロのときに偽となるらしい。
したがってURLにあるテストの意味は
: TEST
IF ." There is a non-zero number on the stack."
THEN cr ;
スタックに格納されたもので判別する。
実行方法は
ワードの小文字をタイプするだけ
test
だけでよい
もし 3 5 0という順番で格納されていた場合は
0は偽であるのでTHENの改行で終了。
test
次の5はゼロではないの真となりThere is a non-zero number on the stack.が表示される
test
次は3なので同じくThere is a non-zero number on the stack.が表示される。
つまりさっきのBMI2ではまず
w h bmi
で w h をBMIワードに渡して値がスタックに格納される
そして19 <= で19以下の時-1が返される
もしも18が格納されていれば-1で真となるslimが表示される。
もしも22が格納されていれば0が返されて偽となり下のELSEが実行される
そしてこのとき最初のw h bmiで得た値がなくなっているのでもう一度 w h bmi をする。
そして19以上かつ25以下の場合に−1が返されそうでなければ0が返される。
0の場合はnormalで-1の場合はfatが表示される。その後に改行して、また改行して終了となる。
最後のTHENはIF文の対応を考えると何かしら書かないといけないようなので改行をしているということ
という感じで今大学で学んでいます。学んでいると言っても授業ではなくてゼミのような感じで教えて頂いている感じでとても有り難く思っています。
S先生には日頃から感謝しています。専門は人工知能やVRなのに本当に幅広く教えて頂いて感激していて将来的にはS先生のような教員になりたいと思っています。
今は大学1年生でこれから新2年になるところですが、気合と情熱を入れてスタックを勉強していきますのでよろしくお願いします。
こんな雑なガキが書いた記事を最後まで読んでくれてありがとうございました!!^^