最後に今回のコンパイラ作成は、まず C 言語とはどんなものかというところから始めなければなりませんでした.私自身は、C 言語を実際に動かしたこともなく、周囲に C 言語に精通したものもいず、市販の図書からの習得でした. 言語は動かしてみるのが習得の早道であるわけですが、文法書を読めば大体のことは掴めるものなのですが、C 言語は、きちんとした文法があるわけでなく、余分な苦労をしたと思っています. 事実、エラー処理においては、エラーを出力すべきなのか、適当にコンパイラが処理してもよいのか悩むことが多々ありました.このため、今回の説明では、意図的にエラーメッセージについては説明を省略しました.一応、それなりのエラーメッセージは出力するようにしてあります. コンパイラの細部設計においては、型の管理が特に難しいように感じました.それと、やはり C の持つ豊富な演算子による式処理は、コンパイラの大部分を占めることとなりました.もう一つ、コンパイラの構文解析を複雑にしているものとして、後に続く語句によって処理がかわることです.たとえば、単項式の処理で,"(" を読み込んでも、それが1次式の左括弧なのか、キャストの左括弧なのか、"(" を読み込んだ時点では決定できません."++" や "--" 演算子が左辺値の後に続くことも同様です.また、式として定義されているものの論理演算や条件式のコンパイルは、if文の処理と同様のオブジェクト展開が要求されます.basic は、インタブリタ言語であるためでしょうか、この辺はコンパイラを作るにあたっては楽です.必ず文頭にキーワードが存在し、それによって処理が決定されるからです. 最適化については、C 言語自体が最適化を考慮したコーディングができるわけで、無理に行う必要はないのかもしれませんが、定数との加減算をインクリメント・デクリメントに、2 のペき乗の定数との乗算をシフト命令に置き換えています. 関数の入口出口処理は、引数や局所変数の有無に応じて個々に最適化すべき余地があるわけですが、1 パスのコンパイラであること、複文の先頭での変数宣言によるスタックの領域確保を簡単にしたため、ワンパターンなオブジェクト展開となってしまいました.その他にも、不要なオブジェクトが展開されている部分があります. 今後、コンパイラを作って見ようと思われている方に参考になればと、とりとめもない事を書いて見ましたが、本コンパイラは、なにぶん仕事で忙しい中、日曜大工的に作ったものですので、バグが多分にひそんでいるのではないかと心配しています. 最後に、テープ4 に納めてあるデモプログラムについて一言. I/O 11月号掲載の、秦和夫氏の "MZ-2500用メモリダンプ&エディタ" の画面表示スタイルを真似たメモリダンププログラムを C でコーディングしてみました.コンパイルオプション "-tmc000" でコンパイル・アセンブルしますと、システムを破壊することなく実行できます.プログラムは、基本的な機能の部分だけですので、ツールとして使用するには貧弱ですが、C 言語の応用の一例として、ふさわしいと思いましたので作ってみました. 参考文献 @ B.W.カーニハン/D.M.リッチー 著 プログラミング言語C、共立出版 A クロビス.L.トンド/スコット.E.ギンペル 著 Cアンサー・ブック、啓学出版 B 西田親生/五月女健治 著 C言語プログラミング入門、啓学出版 C J.E.へンドリックス 著 Small−Cハンドブック、工学社 D ROBERT J.TRAISTER 著 BASIC to C、アスキー出版局 E マイコンピュータ 1983.No.10 "入門特集 C言語の研究" CQ出版社 F 伊東正安/石川 正 著 インタフエース 1980.No.43 172ページ "Z−80/8080アセンブラ"、CQ出版社 G インタフエース 1982.No.62 "特集 システム記述言語Cとその応用"、CQ出版社 H インタフェーズ 1984.No.80 "特集 CP/M−68K制作とコンパイラ"、CQ出版社 I インタフエース 1984.No.85 "特集 Cのすペて"、CQ出版社 J インタフエース 1984.No.86 "特集 続・Cのすべて"、CQ出版社 K 河西朝雄 著:C標準ライブラリ関数、ナツメ社 L 中西正和/大野義夫 著:やさしいコンパイラの作り方、共立出版 M 清水保弘 著:]1マシン語活用百科、産業報知センター |