
PCを使わずにマイコン上で直接コードをコンパイルできたら便利だろう。ファームウェアの更新やホットフィックスのたびにPCを経由する必要がなくなり、開発サイクルが短縮できる。valdanylchuk氏が公開した「xcc700」は、ESP32(Xtensa)上で動作するミニCコンパイラで、わずか700行のコードながら自分自身をコンパイルできるセルフホスティング機能を持つ。
スタックマシン方式で実装を簡素化
xcc700はシングルパス、再帰下降、直接コード生成という構成を採用している。出力はREL形式のELFバイナリで、ESP-IDFのelf_loaderコンポーネントで実行できる。
設計上の大きな特徴は、XtensaのCPUをスタックマシンとして扱っている点だ。Xtensaはレジスタウィンドウという独自の仕組みを持つアーキテクチャだが、xcc700ではレジスタ割り当てやウィンドウ操作を一切使わず、スタック操作だけで処理を進める。性能は犠牲になるが、実装の複雑さを大幅に削減できる。
その結果、GCCでコンパイルしたxcc700は16kBのバイナリサイズで毎秒1万7500行を処理するのに対し、xcc700自身でコンパイルした版は33kBで毎秒3900行になる。最適化がない分、約4.5倍の性能差が生じるが、セルフホスティングという目標は達成している。
機能は最小限、拡張は自由に
サポートする機能はセルフホスティングに必要な最小限に絞られている。while、if/then/else、int/char/ポインタ/配列の限定的なサポート、関数呼び出しと定義、基本的な算術・ビット演算子のみ。for/do、#include/#define、float/double、struct/union、switch/caseといった機能は実装されていない。エラー処理も最小限で、構文エラーがあると予期しない動作をする可能性がある。
作者はこの制限を意図的なものとしている。「世界にもう一つのC99実装が必要だとは思わない。この700行の基盤から、ESP32に特化した独自の言語に発展させてほしい」と述べている。ELFライターやXtensaバイトコードエミッターは再利用可能な部品として設計されており、フォークして機能追加することを想定している。
サイバーデッキへの組み込みから生まれた
開発のきっかけはサイバーデッキ(自作のポータブルコンピュータ)プロジェクトだった。ESP32上で直接バイナリをビルドできれば面白いと考えたという。「ESP32はユーザーランドで過小評価されている。1990年代のPCができたことは全部できる」と作者は語る。
xcc700はMacおよびLinuxでもコンパイル可能で、PCでクロスコンパイラとして使用することもできる。ESP32向けのプリコンパイル済みバイナリ(16kB)もGitHubで配布されている。ライセンスはMIT。

