CASLっぽいアセンブリ言語のシミュレータを作りました

# はじめに

こんにちは、麻菜結です。最近私は大学を卒業したのですが、卒業製作としてあるプログラムを作成いたしました。広くいろんな人に使ってほしかったり真似してほしいので、皆さんに知ってほしいという思いを記事として共有したいと思います。  
私が作ったプログラムは、CASL-2という基本情報技術者試験でアセンブリ言語として用いられるものを基に、様々なプログラミングが行えるように改良したものをシミュレートするシミュレータプログラムです。初学者が扱いやすいようにいろんな工夫がしてあり、低レベルなプログラミングやコンピュータアーキテクチャを学ぶために用いられることを期待しています。  
それでは、よろしくお願いいたします。

# インストール方法

シミュレータプログラムは`Python3`の環境を要求します。`3.7`以降なら動くと思います。

まずこのリポジトリにアクセスしてください。

[hempgreens/MLFE-simulator](https://github.com/hempgreens/MLFE-simulator)

ソースコードをローカルにダウンロードします。上のリポジトリから`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]>
```

マインスイーパプログラムは、乱数や配列、探索など大体のプログラミング言語にはあるであろう機能を自前で実装して作られています。

```text
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`を編集してください。

[Linux環境のMLFEで音を鳴らす](https://github.com/hempgreens/MLFE-textbook/blob/main/Tips/Linux%E7%92%B0%E5%A2%83%E3%81%AEMLFE%E3%81%A7%E9%9F%B3%E3%82%92%E9%B3%B4%E3%82%89%E3%81%99.md)

# もっと勉強してみたい

ちょっと勉強してみたいなと考えた方向けにご紹介したいのですが、教科書を作りましたので是非ご利用ください。

[hempgreens/MLFE-textbook](https://github.com/hempgreens/MLFE-textbook)

内容としては、先ほどのサンプルプログラム達を実装していくための解説がなされているようなものとなっています。少し長いですが、是非挑戦してみてくれると嬉しいです。

`[PDF]`と先頭についているほうが`PDF`版で、ダウンロードするときにはこちらをご利用すると簡単で良いと思います。web上で確認したいときには只の`手を動かして学ぶ！コンピュータアーキテクチャとアセンブリ言語プログラミングの基本`を使ってください。

長いのはちょっとという方や、少しだけ試したいという方向けにお試し版を作ったのでご利用ください。

[おためし版（HelloWorldをつくる）](https://github.com/hempgreens/MLFE-textbook/blob/main/%E3%81%8A%E8%A9%A6%E3%81%97%E7%89%88/%E3%81%8A%E3%81%9F%E3%82%81%E3%81%97%E7%89%88%EF%BC%88HelloWorld%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%EF%BC%89.md)

感想はコメントで送ってくれると嬉しいです。

# 拡張機能のお話

このシミュレータプログラムのコンセプトは、初学者にわかりやすく、機能の拡張を容易にする、というものです。

いろいろ使ってみて、機能の拡張が行いたくなった時には、このページを参照してみてください。

[MLFEの機能拡張を行いたい人へのインストラクション](https://github.com/hempgreens/MLFE-textbook/tree/main/Tips)

# おわりに

ここまで読んでくださってありがとうございました。近年ずっと取り組んでいたものがやっと全面的にオープンにして良さようになったので記事を作ったのですが、なんというかやっていて良かったです。そこそこ大きいプログラムを実装しそのマニュアルや教科書を整備しリリースするという経験はとても貴重な経験で、頑張ればできるぞという自信になりましたし、自分の作ったシステムがもとでいろんな影響を残すことが出来そうなのでとても嬉しいです。
やっぱりプログラミングは楽しい。皆さんも思いついたアイデアを形にして世に出してみてください。評価されるかどうかは分かりませんが、少なくとも自身の糧になることは間違いないので、どんどん挑戦してみましょう。