はじめに
こんにちは、麻菜結です。最近私は大学を卒業したのですが、卒業製作としてあるプログラムを作成いたしました。広くいろんな人に使ってほしかったり真似してほしいので、皆さんに知ってほしいという思いを記事として共有したいと思います。
私が作ったプログラムは、CASL-2という基本情報技術者試験でアセンブリ言語として用いられるものを基に、様々なプログラミングが行えるように改良したものをシミュレートするシミュレータプログラムです。初学者が扱いやすいようにいろんな工夫がしてあり、低レベルなプログラミングやコンピュータアーキテクチャを学ぶために用いられることを期待しています。
それでは、よろしくお願いいたします。
インストール方法
シミュレータプログラムはPython3の環境を要求します。3.7以降なら動くと思います。
まずこのリポジトリにアクセスしてください。
ソースコードをローカルにダウンロードします。上のリポジトリからCode → Download ZIPをするか、以下のコマンドを入力します。インストール作業などは無くプログラムは主にそのディレクトリで実行するので、適切な場所にダウンロードしてください。
> git clone https://github.com/hempgreens/MLFE-simulator
動くか試してましょう。ダウンロードしたディレクトリに移動し、バージョン確認はオプション-vから行うことができます。
> python mlfe.py -v
Version: 0.24
サンプルプログラムを実行してみる
ダウンロードしたものにはサンプルプログラムが含まれており、含まれているサンプルプログラムは以下のようになっています。
| プログラム名 | 内容 |
|---|---|
| hello.fe | HelloWorldと出力するプログラムです。 |
| fizzbuzz.fe | FizzBuzz問題を解くプログラムです。 |
| rdp.fe | 四則演算を行うプログラムです。 |
| rdp2.fe | 四則演算を行うプログラムを出力するコンパイラです。 |
| mine_sweeper.fe | マインスイーパをプレイできます。 |
| mini_organ.fe | ドレミファソラシドがキーボード入力で出力できるプログラムです。 |
hello.fe
HelloWorldと出力するプログラムです。
> python mlfe.py sample/hello.fe
HelloWorld
中身を見てみると、なんだかあまりアセンブリ言語っぽくない記述になっています。
PGM START
OUT ='HelloWorld', =10
RET
END
しかし、このプログラムをオプション-dをつけて実行してみると、
> py mlfe.py .\sample\hello.fe -d
0 START
1 PUSH 0 GR0
2 PUSH 0 GR1
3 PUSH 0 GR2
4 PUSH 0 GR3
5 LD GR0 19
6 LD GR1 19
省略
30 DATA 114
31 DATA 108
32 DATA 100
33 DATA 10
34 END
ぶわーと表示されると思います。このプログラムはHelloWorldを行うプログラムであり、かつ初学者向けにHelloWorldを出力するだけでも結構いろんなことをしているんだよと示すプログラムとなっています。
fizzbuzz.fe
FizzBuzz問題を30まで解くプログラムです。
> python mlfe.py sample\fizzbuzz.fe
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
FizzBuzzはそれこそ初学者向けの課題としてよく出されますが、構造化プログラミングの手法である、条件分岐・反復・サブルーチンをバランスよく使うことができるのでサンプルとして添付してみました。
長いので省略しますが、中身を見てみると、forっぽいものやif、関数っぽいものが見てとれると思います。
rdp.fe/rdp2.fe
計算を行うプログラムです。さきにrdp.feの方から見てみます。
> python mlfe.py .\sample\rdp.fe
5 * (3 + 4)
35
5 * (3 + 4)の部分は入力した部分です。標準入力を使うのでこのように入力することもできます。
> echo "5*(3+4)" | python mlfe.py sample/rdp.fe
35
このプログラムは再帰下降構文解析というアルゴリズムを使うことで四則演算やかっこの優先順位を考えながら計算することが出来ます。
またrdp2.feは計算するプログラムを出力するコンパイラです。
> echo "5*(3+4)" | python mlfe.py sample/rdp2.fe
CALC START
LAD GR2, 1
PUSH 5
PUSH 3
PUSH 4
POP GR1
POP GR0
ADDA GR0, GR1
PUSH 0, GR0
POP GR1
POP GR0
MULA GR0, GR1
PUSH 0, GR0
POP GR0
WRITE GR2, GR0
RET
CALCEND END
これを保存して実行してみます。
> echo "5*(3+4)" | python mlfe.py sample/rdp2.fe > a.fe
> python mlfe.py a.fe
35
これらも中身をみてみるとアセンブリ言語で記述されています。世の中のどんな複雑なプログラムも足し算とか値を読み込むとかのシンプルな命令がたくさん集まって出来ている事がわかりますね。
mine_sweeper.fe
マインスイーパを行うプログラムです。
> py mlfe.py sample/mine_sweeper.fe
012345678
#########a
#########b
#########c
#########d
#########e
#########f
#########g
#########h
#########i
[0-8][a-i]>
マインスイーパプログラムは、乱数や配列、探索など大体のプログラミング言語にはあるであろう機能を自前で実装して作られています。
012345678
1211 1@1a
@#@1 1221b
1211 1@1 c
112221 d
1@#@1 e
111##11 f
@####1 g
12@#@2 h
1#3@2 i
GAMEOVER
ちょっとやってみたのですが失敗してしまいました。9x9に爆弾が10のマインスイーパです。やってみてください。
mini_organ.fe
ドレミファソラシドがキーボード入力で再生されるプログラムです。
> python mlfe.py sample\mini_organ.fe
A=ド4 S=レ4 D=ミ4 F=ファ4 G=ソ4 H=ラ4 J=シ4 K=ド5
ESC = Quit
急にアセンブリ言語の感じじゃないサンプルですが、こういうのがあると楽しいので付けました。
Windows以外の環境の方は音がならないと思いますので以下のページを参照して、Libディレクトリのport_mlfe.pyを編集してください。
もっと勉強してみたい
ちょっと勉強してみたいなと考えた方向けにご紹介したいのですが、教科書を作りましたので是非ご利用ください。
内容としては、先ほどのサンプルプログラム達を実装していくための解説がなされているようなものとなっています。少し長いですが、是非挑戦してみてくれると嬉しいです。
[PDF]と先頭についているほうがPDF版で、ダウンロードするときにはこちらをご利用すると簡単で良いと思います。web上で確認したいときには只の手を動かして学ぶ!コンピュータアーキテクチャとアセンブリ言語プログラミングの基本を使ってください。
長いのはちょっとという方や、少しだけ試したいという方向けにお試し版を作ったのでご利用ください。
感想はコメントで送ってくれると嬉しいです。
拡張機能のお話
このシミュレータプログラムのコンセプトは、初学者にわかりやすく、機能の拡張を容易にする、というものです。
いろいろ使ってみて、機能の拡張が行いたくなった時には、このページを参照してみてください。
おわりに
ここまで読んでくださってありがとうございました。近年ずっと取り組んでいたものがやっと全面的にオープンにして良さようになったので記事を作ったのですが、なんというかやっていて良かったです。そこそこ大きいプログラムを実装しそのマニュアルや教科書を整備しリリースするという経験はとても貴重な経験で、頑張ればできるぞという自信になりましたし、自分の作ったシステムがもとでいろんな影響を残すことが出来そうなのでとても嬉しいです。
やっぱりプログラミングは楽しい。皆さんも思いついたアイデアを形にして世に出してみてください。評価されるかどうかは分かりませんが、少なくとも自身の糧になることは間違いないので、どんどん挑戦してみましょう。