Tiny C Compiler (tcc)は軽量かつ高速なコンパイル、リンクが可能な C コンパイラです。コンパイルが非常に高速なので、抜き出した小さなコードでのテストや、あるプロジェクトのモジュール単位でのトライアンドエラー開発に向いていると言われています。
また、クイックリーなトライアンドエラーでのコーディングだけが目的であれば C インタプリタでも良いのですが、tcc はちゃんと機械語コードを吐くコンパイラですので、生成したバイナリはもちろんネイティブで実行可能です。tcc が生成したデバッグシンボルを gdb で利用することも可能です。
Debian GNU/Linux で利用する
Squeeze では標準リポジトリに入っていました。下記のコマンドをタイプするだけでインストールが完了します。
$ sudo aptitude install tcc
サンプルとして次のソースをビルドしてみたいと思います。
#include <stdio.h>
#include <ncurses.h>
int main(int c, char** a)
{
initscr();
printf("tcc is running!\n");
endwin();
return 0;
}
ちゃんとビルドできるかどうかの確認のため、ncurses ライブラリを使ってみています。
$ time tcc -lncurses -g -Wall -O3 -o tcctest test.c
real 0m0.018s
user 0m0.020s
sys 0m0.000s
ビルドすると一瞬でプロンプトに戻りました。ソースが短いとは言え早い。
$ ./tcctest
実行すると、もちろん正常に動作します。※ initscr() と endwin() の間に printf() が書かれているので、実行時には何も印字されないのが正しい動作です。
同じオプションで gcc を実行してみます。
$ time gcc -lncurses -g -Wall -O3 -o gcctest test.c
real 0m0.161s
user 0m0.128s
sys 0m0.040s
対象ソースが短いのであまり精度は良くありませんが、それでも10倍近くの時間がかかりました。 ldd で見てみたリンク状態は同じ、
$ diff -u <(nm gcctest) <(nm tcctest)
も同じです。アセンブリを見たくて tcc -S test.c してみると -S オプションはサポートしていないと怒られました。tcc 自体にもアセンブラは搭載されていますが、objdump などで見た方がいいみたいですね。 また、-g する事により、gdb に食わせることもできました。
$ echo 'int main(){ printf("hello\n"); }' | tcc -run -
で、動的にコードを入力、コンパイル、リンク、実行の一連の流れを実行します。
Windows で利用する
Windows にはパッケージ管理システムが機能していないので、自分で公式ページよりダウンロードし、解凍する必要があります。 コンパイラ・リンカ本体 tcc.exe、モジュール定義ファイル(DEFファイル)生成コマンド tiny_impdef.exe、「ar」コマンドに置き換わるライブラリ作成コマンド tiny_libmaker.exe が同梱されています。また、基本的なヘッダーやライブラリ、Win32 上でのサンプルコードまで同梱されています。 使い方は Debian 上での操作とほとんど変わりませんが、Windows 独自のコーディング方法がありますので、それについては example/ のソースコードと doc/tcc-win32.txt を参考すればいいと思います。
「c言語を始めよう」と組み合わせるといいですよ。