Tiny C
Compiler(TCC)は、ファブリス・ベラールによって開発された、x86、x86-64、
ARMアーキテクチャに対応したC
コンパイラです。その名前が示す通り、非常に小さく、ディスク容量の少ないコンピュータでも動作するように設計されています。Windowsのサポートはバージョン0.9.23から追加されました。
ライセンスはLGPL(
GNU Lesser General Public License)が付与されています。
特徴
TCCには、従来の
コンパイラとは異なるいくつかの特徴があります。
ファイルサイズとメモリフットプリントの小ささ: x86版は約100KBと非常に小さく、メモリ消費も少ないため、1.44MBの
フロッピーディスクからの起動も可能です。これは、レスキューディスクや組み込みシステムなど、リソースが限られた環境での使用に適しています。
高速なコード生成: TCCは、ネイティブのx86、x86-64、
ARMアーキテクチャ向けのコードを高速に生成することを目指しています。ベラール氏によると、コンパイル、アセンブル、リンクの速度はGCCよりも約9倍高速であるとされています。2023年の「mob」ブランチでは、
RISC-Vと「TMS320C67xxチップ」のサポートも追加されました。
実用的な機能: コードの安定性を向上させるためのオプションのメモリやバインドチェッカーなど、実用的な機能が組み込まれています。
コンパイルされたプログラムの性能
TCCでのコンパイルは、他の
コンパイラのような最適化は行われません。これは、
コンパイラ自体の小ささを優先しているためです。TCCは各文を個別にコンパイルし、文の最後でレジスタの値を
スタックに戻すため、次の行でレジスタの値を使用する場合でも、再読み込みが必要になります。これにより、高速なコンパイルは実現するものの、生成されるコードの実行速度は最適化されたコードに劣る場合があります。
使用例
TCCは、以下のような様々な用途で利用されています。
TCCBOOT: Linuxカーネルをソースコードから約10秒でロードして起動するように改変されたものです。
Linuxカーネルのソースコードをディスクから読み取り、実行可能な命令をメモリに書き込んで実行する仕組みですが、実現のためには、
Linuxのビルド方法の変更が必要でした。
GCCのコンパイル: TCCはかつてGCCのコンパイルにも使用されていましたが、正常に機能させるには多くの改良が必要でした。
バックドア防御の検証: TCCは、
バイナリを使用せずに
ディストリビューションをブートストラップするために、
GNU Guixでも利用されています。
Pythonライブラリ「Cinpy」: Cinpyは、関数の実行時にTCCを使用してコンパイルを行います。コンパイル結果はctypesライブラリを通じて
Pythonから呼び出すことができます。
「JavaScript Linux」: ベラール氏が開発した「JavaScript
Linux」に標準搭載されています。
「Super Micro-Max Chess」: 見本として使用されています。
「学習用C言語開発環境」: コンパイラとして採用されています。
歴史
TCCの原型は、2001年に国際難読化Cコードコンテストでベラール氏が作成したObfuscated Tiny C
Compiler (OTCC)です。その後、難読化を解除し、機能を拡張したものがTCCとなりました。
ベラール氏がプロジェクトから離れた後、様々な個人やコミュニティがTCCの修正や配布を行い、TCCのフォークが維持されてきました。これらの中には、「Dave Dodge's collection of unofficial tcc patches」、Debianとkfreebsのダウンストリームパッチ、「grischka's gcc patches」などがあります。特に、Grischka氏のブランチは多くの貢献があり、後に公式TCCブランチとなりました。
現在
2017年12月時点では、TCCの公式メーリングリストとGitの公式
リポジトリで、活発な議論と開発が行われています。TCCは、その小ささと高速性から、組み込みシステムや教育用など、幅広い分野で活用されています。
関連項目
GNU
Compiler Collection
LCC (compiler)
Portable C
Compiler (PCC)
Small-C
脚注・出典
外部リンク
公式ウェブサイト
公式メーリングリスト
ソースコードリポジトリ
PTSource IDE-Integrated Development Environment includes TCC.