知識ベース

小さなCコンパイラ

Tiny Cコンパイラ (別名TCC、tCc、またはTinyCC)は、Fabric Bellardが作成したx86、X86-64、およびARMプロセッサのCコンパイラです。ディスク領域が少ない低速のコンピューター(レスキューディスクなど)で動作するように設計されています。 Windowsオペレーティングシステムのサポートは、バージョン0.9.23(2005年6月17日)で追加されました。 TCCはGNU Lesser General Public Licenseの下で配布されています。

TCCは、すべてのANSI C(C89 / C90)、C99 ISO標準の大部分、およびインラインアセンブリを含む多くのGNU C拡張を実装すると主張しています。

特徴

TCCには、他の現在のCコンパイラと区別する多くの機能があります。

  • その小さなファイルサイズ(x86 TCC実行可能ファイルでは約100 KB)とメモリフットプリントにより、レスキューディスクなどの単一の1.44 Mフロッピーディスクから直接使用できます。
  • TCCは、ネイティブx86、x86-64、およびARMコードを非常に迅速に生成することを目的としています。 Bellardによると、GCCの約9倍の速度でコンパイル、アセンブル、リンクします。
  • TCCには、オプションのメモリやバインドされたチェッカーなど、実用性を向上させてコードの安定性を向上させることを目的とした、コンパイラ固有の言語機能が多数あります。
  • TCCでは、コマンドラインスイッチを使用して、コンパイル時にプログラムを自動的に実行できます。これにより、プログラムはシェバンインタープリターディレクティブ構文をサポートするUnixライクなシステムでシェルスクリプトとして実行できます。

コンパイルされたプログラムのパフォーマンス

TCCコンパイラ自体は非常に高速ですが、このサイズのコンパイラとTCCが生成するコードのパフォーマンスとの間には、本質的なトレードオフがあります。

TCCは、すべての操作の定数伝播、乗算と除算が適切な場合にシフトに最適化され、比較演算子が特別に最適化されるなど、いくつかの最適化を実行します(プロセッサフ​​ラグの特別なキャッシュを維持することにより)。また、いくつかの単純なレジスター割り当てを行います。これにより、 単一のステートメント内で多くの無関係なセーブ/ロードのペアが防止されます。

しかし、一般的に、TCCの実装では、最適なパフォーマンスの結果ではなく、小ささを重視しています。 TCCは単一パスでコードを生成し、GCCなどの他のコンパイラーによって実行される最適化のほとんどを実行しません。 TCCはすべてのステートメントを独自にコンパイルし、各ステートメントの最後にレジスタ値がスタックに書き戻され、次の行がレジスタ内の値を使用している場合でも再読み込みする必要があります(ステートメント間に余分なセーブ/ロードペアを作成します)。 TCCは、使用可能なレジスタの一部のみを使用します(x86では、関数呼び出し間で保持する必要があるため、ebx、esi、またはediは使用しません)。

以下に2つのベンチマーク例を示します。

  • 512 MB RAMを搭載した1.8 GHz Intel Centrinoラップトップでの再帰的フィボナッチアルゴリズムの大まかなベンチマークでは、Microsoft Visual C ++コンパイラ13.10.3052とTCCの結果に顕著な違いが生じます。 49番目のフィボナッチ数を計算するには、TCCでコンパイルされたプログラムよりも約18%長いMS Visual C ++プログラムが必要でした。
  • GCCをコンパイルするために変更されたtccでは、GCC 3.4.2を使用してコンパイルした場合cc1(GCC Cコンパイラー)自体を実行するには518秒、GCC 2.95.3を使用して558秒、Microsoft Cコンパイラーを使用して545秒、tccを使用して1145秒かかりました。各コンパイラの最適化レベルは-O1または同等でした。

用途

tccのよく知られた用途は次のとおりです。

  • TCCBOOT、約10秒でTCCがソースからLinuxカーネルをロードして起動するハック。つまり、ディスクからLinuxカーネルソースコードを読み取り、実行可能な命令をメモリに書き込み、実行を開始する「ブートローダー」です。これには、Linuxビルドプロセスの変更が必要でした。
  • TCCは、信頼攻撃に対する防御を実証するために使用されました。
  • TCCはGCCのコンパイルに使用されていますが、これを機能させるにはさまざまなパッチが必要でした。
  • Cinpyは、PythonモジュールのCで関数を実装できるPythonライブラリです。関数は、実行時にTCCでコンパイルされます。結果はctypesライブラリを介してPythonで呼び出し可能になります。
  • JavaScript Linuxにもインストールされています(これもBellardによる)。
  • スーパーマイクロマックスチェスプログラムソースのコンパイル済みバージョンのリファレンスとして使用されています。

歴史

TCCは、2001年に国際難読化Cコードコンテスト(IOCCC)に勝つためにBellardが作成したプログラムである難読化Tiny Cコンパイラ(OTCC)に起源を持っています。

2012年2月4日より前のある時点で、Fabrice Bellardはプロジェクトの公式Webページを更新し、TCCに取り組んでいないことを報告しました。

Bellardがプロジェクトから離れて以来、さまざまな人々やグループがTCCのパッチを配布したり、TCCのフォークを維持したりして、TCCの問題を構築または修正しています。これには、Dave Dodgeの非公式tccパッチのコレクション、Debianおよびkfreebsdダウンストリームパッチ、grischkaのgccパッチが含まれます。 Grischkaは、共有ビルド、クロスコンパイラ、SELinux互換性など、多数の貢献が追加されたmobブランチを含むプロジェクト用のパブリックGitリポジトリもセットアップしました。 GrischkaのGITリポジトリは後に公式TCCリポジトリになりました(Fabrice BellardのSavannahプロジェクトページにリンクされています)。

現在の状態

2017年12月現在、公式TCCメーリングリストと公式Gitリポジトリ(Fabrice BellardのSavannahプロジェクトページにリンクされている)の両方に、多くの開発者と関心のあるユーザーによる活発な議論と開発が示されています。 2017年12月、grischkaはメーリングリストでTCCバージョン0.9.27がリリースされたことを発表しました。