SN実験1のKUECHIP-3F対応コンパイラを作ってみた
こんにちは、Yukimuraです。最近ネタ切れを起こしてブログ執筆が滞ってました。
さて今回は表題の通り、夏休みの自由研究的にKUECHIP-3F対応のコンパイラ(もどき)を作って遊んだお話です。
C言語もどきからアセンブリを生成できるということで、気持ち的には実験が捗るアイテムになっています。
2回生以上は懐かしみながら、1回生はまだ見ぬ実験科目に胸踊らせながら、学外の方はコンパイラって意外とできるもんだな、と思いながら記事を読んでくれたら嬉しいです。
本記事は9ccを参考に開発・作成・執筆しました。
注意事項
※本記事は、2回生が実験1を不正な方法でパスすることを推奨するものではありません。アセンブリわかるマン(ORウーマンORヒューマン)になることが目的の実験科目ですので、間違っても本記事で紹介した手法でコンパイラを組んで実験をパスする、なんて事の無いようにしてください。(そもそも、本記事の内容ではおそらく単位は出ませんし、本記事が理解できてコンパイラが自作できる2回生なら正攻法で単位が取れるはずです)
※筆者はコンパイラ開発の初心者です(言語処理系の講義を取った、程度)。実質半日でちょろっと触っただけなので、至らぬ点は大目に見てください。
※※(2023年4月4日追記)本記事を参考資料として、コンパイラを組むことが発展課題(optional)に追加されたようです。ぜひ本記事を参考にしてコンパイラを組んでみてください。なお、本記事は実験担当教員巡回済みです。
それではどうぞ!
背景情報(〜1回生向け)
弊学情報理工学部セキュリティネットワークコース(SNコース)では、実験を2回生前期から3回生前期まで、全部で3セメスター実験科目があり、その中で6つのテーマについて扱います。
そのうち、2回生前期の実験では、論理回路とボードコンピュータについて取扱いますが、今回はそのボードコンピュータについての話題です。
2回生ではKR-CHIPというシングルボードコンピュータで、かんたんな命令セットが実行できるKUECHIP-3FというCPUを使ってアセンブリを書く、という実験をします。
プログラミング演習で扱うC言語などの高級言語は、PCでそのまま実行されているのではなく、C言語->アセンブリ->機械語というように変換されて最終的に機械語が実行されるわけですが、この実行できる機械語というのがアーキテクチャによって異なるため、普通のPCでコンパイルしたC言語で書いた実行ファイル等は、当然ボードコンピュータでは実行できません。
ここで先述の通り、実験ではアセンブリを書いて機械語にして実行してみよう、という内容をやるのですが、どう考えてもアセンブリより高級言語のほうが書きやすく、そのために高級言語からアセンブリに変換してくれるコンパイラがあるわけで、だったらコンパイラを書いちゃえば、実験がかんたんにクリアできるんじゃないの??というのが今回の記事のスタート地点です。
完成品
先に完成品を提示します。kueccと名付けました。
今回の完成品はgitに上げてありますので、よしなにしてください。
https://github.com/yuki1201/kuecc ※Ubuntuでしか動きません。何故か。
コンパイラに投げられるコードの仕様は以下
・変数はa~zの一文字変数のみ宣言可
・型宣言は不要
・使える演算子は+,-,++,--,=,==,!=,<,>,<=,>=
・使える文はfor,while,if,goto,return
実験
実際にコンパイラを動かしてみます。
今回は、フィボナッチ数列を出力するプログラムを書いてみましょう。
a=1;
b=1;
c=10;
c=c-2;
for(i=0;i<c;i=i+1){
b=a+b;
d=a;
a=b;
b=d;
}
return a;
...まあ関数が使えないならこんなもんでしょう。
読めばわかると思いますが、c番目のフィボナッチ数を出力するプログラムです。
次にこれをkueccに突っ込みます。
$ make
$ sh kuecc.sh
すると、以下のようなアセンブリが出力されます。
...実際に見てもらえればわかりますが、311行に渡るアセンブリが出力されました。泣きそうになりますね。
ちなみに実験では、書いても数10行程度なので安心してください。
それでは実際に、これをアセンブラに入れてシミュレーターで実行してみましょう
こんな感じでアセンブルして実行すると
左側及び左下に注目、無事OBUF(OutputBUFfer)に0x37(=55)が出力されていることがわかります。
このように、C言語もどきでコードを書くとアセンブリにアセンブルしてくれるツールができました。という話でした。これで実験も余裕...!というわけではありませんが、高級言語バンザイ!という気持ちには、なれます。
おわりに
毎度おなじみで「あったら良いな」で作られたシリーズでした。作ってみたらとんでもない行数になってしまいました。
掛け算割り算がfor文を使うことでしか実装できないのが現状なので、ゆくゆくは掛け算もできるようにしていきたいです。っていうか現代の命令セットにはだいたい掛け算命令があるはずなので本来は実装しなくて良いはずなのですが...血涙