経緯
スタックマシンを勉強する機会があった.
そのときに,スタックマシンの命令を使った実例があったが,実際に手を動かしてみたくなった.
そのためのコマンドを紹介したい.
それは,「dc」 コマンドである.
dc コマンドとは
dc は,逆ポーランド記法の卓上計算機であり,定義やマクロが使えるのがすごい(今回は紹介の対象ではなない).
逆ポーランド記法計算機は,数(やマクロ)をスタックに保存するため,スタックマシンの勉強には最適である.
最低限のコマンド
正規表現で記述してある.
コマンド | 効果 |
---|---|
q | 終了 |
p | スタックの最上部を表示 |
n | スタックの最上部を取り出して,表示 |
c | スタックのクリア |
[0-9]* | 値をスタックに追加 |
[+-*/] | 演算子 |
実例
さて,計算を実際にやってみよう.
2*3+4*5
この計算での,スタックマシンの命令をいかに示す.
2*3+4*5のスタックマシン命令
PUSH 2 # 2
PUSH 3 # 2 3
MUL # 6
PUSH 4 # 6 4
PUSH 5 # 6 4 5
MUL # 6 20
ADD # 26
この命令の結果,26という値がスタックに入っている.
dcコマンド
$ dc # dcインタプリタ起動
2 # スタックに2を追加
3 # スタックに3を追加
* # スタックから2つ(2と3)を取り出し乗算,結果(6)をスタックに追加
4 # スタックに4を追加
5 # スタックに5を追加
* # スタックから2つ(4と5)を取り出し乗算,結果(20)をスタックに追加
+ # スタックから2つ(6と20)を取り出し加算,結果(26)をスタックに追加
p # スタックの最上部にある値を表示
26 # 表示 (スタックには,残っている)
スタックマシンの命令が1対1で対応しているのが,分かる.
2 # PUSH 2
3 # PUSH 3
* # MUL
4 # PUSH 4
5 # PUSH 5
* # MUL
+ # ADD
また,dcコマンドは連続して記述もできる.
$ dc
2 3 * 4 5 * + p
26
もちろん途中で確認のために取り出すことも可能.
2 3 4
p
4 # 表示
p
4 # 表示
n # スタックから取り出す
4 # 表示
p
3 # 表示
c # clear
p
dc: stack empty
さいごに
このように比較的簡単にスタックマシンの仕組みを理解することができるだろう.
まずは,手を動かすことが大事です.やってみよう!
ただ,dcコマンドは奥が深く,マクロやレジスタを駆使し,階乗の計算なんかもできる.
それはまた次の機会にでもやってみてください.
スタックマシンを勉強する経緯
- コンパイラを勉強する
- 構文解析で,トークン列から抽象構文木を作る
- 抽象構文木からアセンブリをそのまま作れない
- スタックマシンが出てくる