C言語で作成した拙作のCASL II処理システムYACASL2を紹介します。
CASL IIは、基本情報技術者試験で用いられるアセンブラ(アセンブリ言語)です。アセンブラは通常、特定のコンピューターやCPUに対応しています。しかしCASL IIアセンブラは、試験の公平性の観点から実在しない仮想コンピューター向けに作られたアセンブラです。
CASL IIの処理システムを作るきっかけになったのは、『日経ソフトウェア』2009年2月号に掲載されていた川俣晶さんの執筆記事「C言語で作るCPUエミュレータ」を読んだことでした。この記事を紹介した日経ソフトウェア記者・斉藤国博さんのコンピュータの仕組みを知るのは,いつも楽しいという記事は現在でもオンライン上で読めるようです(2020年8月時点)。なお、この記事で紹介されていたソースコード(C言語)は、現在ではダウンロードできないようでした。
私はいちおう基本情報技術者試験を受験したこともありCASL IIの概略については知っているつもりでした。しかし、コンピューターの仕組みを知るためのツールとしてのCASL IIの魅力については川俣さんの記事ではじめて知りました。また、この当時話題になりはじめていた「仮想コンピューター」について知るきっかけとなりました。そしてなにより、仮想のコンピューターシステムであるCASL IIが自作できることに大きな衝撃を覚えたのでした。
CASL IIの意義
CASL IIに学ぶ意義はあるのか?実務で使うことはほぼ絶対にないのに。
おそらく授業や試験などでCASL IIにやむなく触れることになった人は誰でも抱える疑問だと思います。
それに対しては、eel3さんが「CASL IIは、考えるための道具」という鮮やかな答えをFizzBuzzのコードとともに示しています。
また、シンプルなアセンブラであるCASL IIは、他のアセンブラを学ぶ基礎、あるいはウォーミングアップになりうると思っています。ただ、私自身は残念ながら今までほかのアセンブラに触れる機会がなく、本当にそうなのか実証できないでいますが…
CASL II実装の意義
C言語を学ぶ人にとって、入門書をひととおりマスターした次の段階で悩む人も多いのではないでしょうか。
C言語の技術(周辺技術)の多くは、ある程度以上の規模のプログラムでないと価値を実感できないものとなっています。
K&Rを含めた入門書では小規模なプログラムしか取り上げていないので、こうした本を読んでも身につけられない技術が多いのです。
ある程度以上の規模のプログラムを作るときにはネタ、というか仕様を決める(探す)のがたいへんなことが多いと思います。
CASL IIの場合は、人間の試験用に用意された高い完成度の仕様書があるわけで、仕様書に恵まれているともいえます。
そうした点も考えると、入門書の次の段階としてCASL II(および、比較的単純な仮想コンピューター)は狙い目だと思っています。
CASL II処理システムの実装では、私は次の技術やツールの使い方を学びました。
- 文字列の読み取り
- リストやハッシュの活用
- 関数ポインタ
- ソースファイル分割とヘッダーファイルの作成
- Makefileの使い方(参考:C言語を使うならMakeを使おうよ)
- レグレッションテストの実装
- コメントからドキュメントを自動生成するツール(Doxygen、GNU Global)
- メモリデバッグツール(Valgrind)
YACASL2のレグレッションテストを考えている内に、自作の汎用テストツールAutotest.mkも作成しました。
C言語などで作成したプログラムを対象としたテストフレームワークツールです。
なお、CASL IIなどの仮想コンピューターのほかに入門書の次の段階として面白そうなのは自作テキストエディター。
それだけに、自作エディタをつくる Advent Calendar 2016には期待しています!