
2025/12/27 0:07
**Show HN:Xcc700 – ESP32(Xtensa)用のセルフホスティング・ミニ C コンパイラ、700 行で実装**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
概要:
xcc700 は ESP32/Xtensa プラットフォーム向けに書かれた、自己ホスティング型の単一ファイル C コンパイラ(約 700 行)です。生成される ELF バイナリは ESP‑IDF の elf_loader を介して ESP32 にロードでき、GCC でコンパイルした場合のバイナリサイズは約 16 kB、xcc700 自体が作成した場合は約 33 kB です。
このコンパイラは C 言語のコアサブセットのみをサポートします:、while、if/else/int/ポインタ/配列、関数呼び出し、基本的な算術演算とビット演算子。意図的にchar/for、do/#include、#define/long/float、構造体/共用体/typedef、double、配列初期化子、switch/caseセクション、多行コメント、グローバル初期化子、および堅牢なエラーハンドリングなど多くの言語機能を省略しています。.data
最適化は最小限で、Xtensa コアはレジスタ割り当てやスライディングウィンドウ使用なしにスタックマシンとして扱われるため、パフォーマンスが低下します(自身でコンパイルした場合の約 3 900 行/秒対 ESP32‑S3 上では約 17 500 行/秒)。
xcc700 は macOS(x86_64 および arm64)上でネイティブにクロスコンパイラとして動作し、を使用して ESP32 用にビルドしたり、ファームウェアに直接埋め込むことも可能です。プロジェクトは MIT ライセンスの下で提供されており、フォークや拡張を奨励しています。これは軽量な低電力ハードウェアでも重量級ツールチェーンなしで有意義なソフトウェアを動作させられることを示すために ESP32 “cyberdeck” を構築している際に作成されました。xtensa-gcc
本文
xcc700 – ESP32/Xtensa 用の自己ホスティング型ミニ C コンパイラ
このプロジェクトを調べる理由は?
モダンなプラットフォーム上で完全に理解・変更できるコンパイラ。小さくてもクールなのが好きです。
- 基本機能のみで、堅牢すぎず、好きな言語へ簡単に変形できます。
- 再利用可能な ELF ライターと基本的な Xtensa バイトコードエミッタを備えています。
- ESP32 上のホットフィックス、CI、クイックテスト/デバッグサイクルに有用かもしれません。
サンプル出力
./xcc700 xcc700.c -o xcc700.elf
[ xcc700 ] BUILD COMPLETED > OK > IN : 700 Lines / 7977 Tokens > SYM : 69 Funcs / 91 Globals > REL : 152 Literals / 1027 Patches > MEM : 1041 B .rodata / 17120 B .bss > OUT : 27735 B .text / 33300 B ELF [ 40 ms ] >> 17500 Lines/sec <<
注: タイミングは ESP32‑S3 上で測定。macOS/POSIX では約 1000 倍遅くなります。ESP32 のタイマーはミリ秒単位、POSIX はマイクロ秒単位であるためです(調整は行っていません)。
ビデオデモ
xcc700_demo10s.mov
xcc700 の実行方法
-
GCC でコンパイル –
を実行し、クロスコンパイラとして自分の PC 上で動かします。gcc xcc700.c
macOS(x86_64 と arm64)でテスト済み。 -
ESP32 用にコンパイル –
もしくは A‑コンパイルされたバイナリ(xtensa-gcc
、16 kB)を使用します。xcc700.elf
ESP‑IDF の
で実行。elf_loader -
ファームウェアに埋め込む – ソースコードを調整し、自分のファームウェア内で関数として呼び出す。
含まれているもの
- C 機能: このコンパイラを書くために必要な最小セット。while、if/then/else、int/char/ポインタ/配列への限定的サポート、関数呼び出し/定義、基本的な算術・ビット演算子。
- 単一の
ファイルを入力 → 1 本の REL ELF ファイルを出力。.c - 出力ファイルは ESP‑IDF の
により直接実行でき、リロケーションテーブル経由でファームウェアに公開された関数(newlib libc、LVGL、カスタム関数など)とリンクします。使用する関数を宣言すれば OK。elf_loader
何が欠けているか
- 完全な C: for/do ループ、include/define、long/float/double、struct/union/typedef、switch/case、配列初期化子、
セクション、多行コメントなど。.data - 部分的機能:
グローバルはあるがグローバル初期化子なし;.bss
はプレフィックスのみ;代入は文としてのみ(式ではない);型チェックはほとんど無し。++/-- - エラーハンドリング/報告は最小限で、些細なエラーでもクラッシュする可能性があります。
- 最適化なし:Xtensa CPU をスタックマシン扱い。レジスター割り当てやスライディングウィンドウ使用はありません。
GCC コンパイル版: 約16 kB、17,500 行/s
自己コンパイル版: 約33 kB、3,900 行/s
機能が足りないと感じたらフォークしてください!700 行程度のコードなので拡張は簡単です。
ライセンス
MIT –
LICENSE を参照ください。
コントリビューション
フォーク歓迎です。これは別の C99 実装を目指すものではありません。ESP32 上でこの小さな自己ホスティング型コンパイラを拡張できるか、他の人の視点から興味があります。
ハッカソン、課題、チュートリアル、あるいは
ld で ELF ファイルをリンクするために他システムへ移植する際のベースとしてご利用ください。
なぜこれを書いたか
ESP32 の「サイバーデック」を作っていて、デバイス上で直接バイナリをコンパイルしたいと思ったからです。ESP32 はユーザーランドで過小評価されており、90 年代の PC ができたこと以上の機能を持っています。
自問してみてください:
- 楽しむ/有用な計算に必要なワット数はどれくらいか?
- もっとシンプルで手軽に改造できる共通アプリがあればいいのでは?
- 本当に 300 MB のマウスドライバが必要なのか?
楽しんでください!