小ネタ 2007-018

コンパイラ「Cm」を改造してみる


1. 「Cm (Cマイナー)」とは

 「yaccによるCコンパイラプログラミング」(近藤嘉雪 著)という書籍に、C言語のサブセットの言語仕様のコンパイラ"Cm"を作成するという内容が載っている。この書籍は、もともとは1989年〜1990年頃のCマガジンという雑誌に掲載されていた連載記事をまとめたもので、当時、自分もリアルタイムにこの連載を読んだりしている。
 

 Cmコンパイラは、MS-DOS上で動く16ビットCPU(インテル8086)用のコンパイラで、MASMというマイクロソフトのアセンブラ用のソースコードを出力するようになっている。

 Cmのソースコードは、yaccというコンパイラコンパイラのソースコードと、C言語で作られている。yaccソース部分で構文解析ができている。kmyaccという当時のDOS用のyacc互換ソフトを使っていた。




2. Cmの改造 - Cm32

 1998年〜1999年頃、Cmを改造して、32ビットCPU(インテル80386,486/IA32)用のコードを出力するように書き換えてみた。当時、MASM Version 6.11という32ビットCPU対応版を購入したので、試しに使ってみる例題としてちょうど手頃な感じだったからである。

 

 最近(2007年)色々と片づけをしていたら、そのときのソースコードが出てきたので、多少手直しと整理をして公開しておくことにする。


 [ cm32ソースコード (download) ]


 (1)cm32.zipの中身
 上記のzipファイルの中身は3つのフォルダになっており、それぞれ以下のものが入っている
 ・cm32フォルダ - cm32のソースコード
 ・kmyaccフォルダ - kmyaccというフリーソフトのyacc
 ・sampleフォルダ - cm32のテスト用のサンプル

 (2)ソースコードのコンパイル手順
 ・cm32フォルダ内にbuild-cm32.batというバッチファイルがあるので、起動する。
 ・あとは自動的にビルドされて、cm32.exeという実行ファイルが出来る。

 (3)cm32の動作テスト
 ・sampleフォルダ内にhello.cmとqueen.cmとsieve.cmという3つのサンプルがあり、それぞれtest-hello.bat、test-queens.bat、test-sieve.batというバッチファイルでコンパイルと実行テストができる。
 ・hello.cmからは、hello.exeという実行ファイルが出来る。中間ファイルのhello.obj、hello.asm、hello.lstも残っているので、もしうまくいかなかった場合にはこれらのファイルに問題がないかチェックする。