2024年4月20日土曜日

コンパイラ作成の試み その4 言語の拡張(FOR文の完成そして6809用へ)

 マイクロCコンパイラmccにようやくFOR文を拡張することができました。

2023年7月4日のブログ「コンパイラ作成の試み その2 言語の拡張(コメントとFOR文など)」(https://flexonsbd.blogspot.com/2023/07/for.html)の続きです。


ブログ用画像の表示のために置いてあります


その際には、繰り返し変数が初期値の次の値から始まってしまうという不具合があり、スタックを使用している言語のため、初期値、終了条件、増分を順に読んでいくしかないので、それが解消できないようだと書きました。

そのため、このマイクロCコンパイラを6809用に改造しようという意欲が失せてしまい、そのまま放置してあったのですが、GAMEインタプリタ・コンパイラの移植、TL/1コンパイラの移植が完了しましたので、これについても何とかしたいと考えていました。そんな時に手持ちの書籍(末尾の参考文献)を読んでいましたら、FORステートメントの実装の説明として、下図のFOR生成2のようなコード生成方式の方が実装が簡潔化できるとありました。


2つのFOR生成方式

なるほどと思い、この形で実装できないかと試みてみました。具体的には、必要な個所にラベルを設定し、そのラベルへのジャンプ命令を追加することで、処理の順序を変えることができました。

そのプログラムを示します。

    

このようなサンプルプログラムも正常に動作しました。

    


6809用コンパイラへ...とりあえずデータ幅8ビットで...

これで必要な(と思われる)拡張が済みましたので、次はいよいよ6809用コンパイラへの移植ですが、このコンパイラはデータ幅が16ビット、レジスタも16ビットを想定していますので、そのままでは6809への適用はかなり難しそうです。

しかし、TL/1コンパイラのようなデータ幅が8ビットのコンパイラもありますので、まず第一段階としてデータ幅やレジスタが8ビットでも動作しないだろうかと考えました。

それを確認するために、コンパイラが生成した仮想CPU用のアセンブルリストを手作業で6809のアセンブルリストに書き換えて走らせてみました。いくつかの注意点がありましたが、ほぼ機械的に書き換えることができました。使用したのは上記のサンプルプログラムからfor文を取り除いて短くしたものです。コンパイラが生成したアセンブルリスト(.CS)と手動で書き換えた6809用のリスト(.TXT)を示します。

仮想CPU用のアセンブルリストです。

    

手作業で書き換えた6809用アセンブルリストです。仮想レジスタR0、R1には2バイトずつ割り当ててありますが、当然1バイトずつしか使用されていません。
(機械的に置き換えただけで最適化を行っていないために、冗長な部分がかなり多いです。)

    

プログラム中に i * 2 という乗算がありますが、その結果が2バイトを超えていないので正常に動作しました。

このことから、もちろん制約はありますがデータ幅、レジスタ長が8ビットでも動作するようだという見込みが立ちましたので、まず第一段階の目標として、8ビット長の6809用コンパイラを目指すことにします。
時間がかかるとは思いますが、じっくりと取り組んでみたいと思います。


参考文献
・作りながら学ぶコンパイラ/インタプリタ 滝口政光著(CQ出版社)

0 件のコメント:

コメントを投稿