軽量・高速な C コンパイラ「Tiny C Compiler」を使う

投稿者: | 2012年11月30日

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 を参考すればいいと思います。

コメントを残す

メールアドレスが公開されることはありません。