More Web Proxy on the site http://driver.im/
gmc4cc (C Compiler for GMC-4)
gmc4ccは大人の科学 Vol.24 4ビットマイコン
の付録の4ビットマイコンキットGMC-4(FXマイコン)のためのCコンパイラです.
ハンドアセンブルを楽しむこのキットに対してCコンパイラを作るというのはとても邪道ですが,
コンパイラを作ること自体が目的だったのでよしとします.
Cコンパイラ自体はコンパイラコンパイラの類を使わずにHaskellのみで書かれています.
最適化をコツコツとするようにして,なんとかまともなコードが生成されるようになりました.
とは言えいろいろ足りないので,気が向いたら改良していく予定です.
C言語で書いた4bitゼビウス "Nibbled XEVIOUS"等のプログラムも公開しています.
最適化機能付きアセンブラも使えます.
こちらのFX-マイコン シミュレータ用のファイルも出力できます.
また,BASICのコンパイラであるG4CBASICを作成している方もいらっしゃいます.
コンパイルしてみる
仕様
以下のことができます.
- 変数はintのみ.intは4ビットの整数.つまりsizeof(int)は0.5?
- 二項演算子 +, -, ==, != , <, >, <=, >=, &&, ||, =, >>, カンマ
- 単項演算子 +, -, ++, --, &, *, ~
- while, for, if, else, break 文
- エントリーポイントのvoid main(void)の定義
- 以下の関数
- void setNumberLed(int value)
- valueを数字LEDに点灯させる
- void resetNumberLed(void)
- 数字LEDを消灯させる
- void setLed(int index)
- index番の2進LEDを点灯させる
- void resetLed(int index)
- index番の2進LEDを消灯させる
- void setLedBinary(int hight, int low)
- hightを上3桁, lowを下4桁の2進数として2進LEDを点灯させる
- void beepEndSound(void)
- エンド音なるものを鳴らす
- void beepErrorSound(void)
- エラー音なるものを鳴らす
- void beepShortSound(void)
- 短い音を鳴らす
- void beepLongSound(void)
- 長い音を鳴らす
- void beep(int step)
- stepに相当する音階の音を鳴らす
- int inputKey(int *key)
- キー入力をチェックする.入力があった場合1を返し,keyに入力されたキーの値をセットする.入力がない場合0を返す.
- int inputKeyBlock(void)
- キー入力がされるまで待つ.入力されたキーの値が返される.
- void sleep(int deciSeconds)
- (deciSeconds + 1) x 0.1秒休止する
- void exit(void)
- プログラムを終了する(無限ループに入る).
- 配列,ポインタ(共にコードが長くなることがあるので非推奨)
- グローバル変数.グローバル変数の初期値の宣言は0x50番台のメモリの初期値として設定されます.初期値が宣言されていないグローバル変数はC言語の約束通り0で初期化します.
- /* */,//によるコメント
- それなりな最適化
以下のことはできません.(今のところ)
- main以外の関数の定義.構文解析はしてるのですが,16ニブルの中でスタックフレームを作るのはつらいです.
- その他の演算子いろいろ
- すごい最適化
- プリプロセッサ(gccのやつとかを使って下さい)
ダウンロードして使う
gmc4cc自体のコンパイルにはGHCが必要です.メジャーなLinuxディストリビューションならyum install ghcとかapt-get install ghcとかでインストールできるかもしれません.
ソースファイルは以下からダウンロードできます.GPLで配布します.(Haskellは初めて書いたのでめちゃくちゃなソースです)
利用するには以下のようにします.
$ tar xzvf gmc4cc-0.6.2.tar.gz
$ cd gmc4cc
$ make
$ ./gmc4cc < sample.c
免責
このアプリケーションについて何も保証しません.確認作業を怠っているのでけっこうバグがあるはずです.
履歴
- 2009-07-05 ver 0.0.1 公開
- 2009-07-06 ver 0.0.2 二項演算子<,<=などを追加
- 2009-07-07 ver 0.0.3 バグ修正, コードの効率化
- 2009-07-07 ver 0.0.4 実行フラグリセットの効率化, exit()追加
- 2009-07-07 ver 0.1.0 TIY命令の最適化, AM,MA命令の最適化
- 2009-07-07 ver 0.1.1 TIA命令の最適化, whileが恒真のときの最適化
- 2009-07-09 ver 0.1.2 単項演算子+,-,++,--を追加
- 2009-07-09 ver 0.2.0 関数呼び出しを文ではなく式に, 整数値を条件として使う場合の最適化
- 2009-07-09 ver 0.2.1 //によるコメントを可能に
- 2009-07-10 ver 0.2.2 アセンブラのソースを読めるようにした
- 2009-07-11 ver 0.3.0 条件の最適化方法の整理, 演算子==で即値を用いる最適化
- 2009-07-12 ver 0.3.1 二項演算子&&,||を追加
- 2009-07-12 ver 0.3.2 代入を式に, 二項演算子+=,-=を追加, x = x + ..の形の式の最適化
- 2009-07-12 ver 0.3.3 TIA,TIY,AM,MA命令の最適化を強化
- 2009-07-18 ver 0.4.0 for,break文を使えるように, 値が必要ない式の最適化
- 2009-07-18 ver 0.4.1 setLedBinary(), inputKeyBlock()追加
- 2009-07-18 ver 0.5.0 ポインタ, 変数の宣言時の初期化を可能に
- 2009-07-19 ver 0.5.1 二項演算子>>,単項演算子~を追加
- 2009-07-19 ver 0.5.2 inputKey()に0(NULL値)を渡せるようにした
- 2009-07-19 ver 0.5.3 アセンブラで疑似命令.align,.nibbleを使用できるようにした
- 2009-07-23 ver 0.6.0 グローバル変数を使用できるように, 二項演算子の最適化
- 2009-07-23 ver 0.6.1 2進数表記の定数, アセンブラでラベルの大文字小文字を区別
- 2009-07-24 ver 0.6.2 副作用のみ必要とする場合の最適化
その他
その他のソフトウェアをこちらで公開しています.