AMACCは、ゼロから構築された32ビットアームアーキテクチャコンパイラです。これは、コンパイラ、リンカー、ローダーについて学習するための教育ツールとして設計されたCの剥がれたバージョンとして機能します。
2つの実行モードAMACC実装があります。
AMACCは、上記の実行モードを自己ホストするために必要なCのサブセットをコンパイルするように設計されていることに言及する価値があります。たとえば、グローバル変数、特にグローバルアレイをサポートします。
シンプルなスタックベースの抽象的構文ツリー(AST)は、トークン生成関数によって供給される協同組合stmt()およびexpr()解析関数を介して生成されます。 expr()関数は、いくつかのリテラル定数最適化を実行します。 ASTは、 gen()関数を使用して、スタックベースのVM中間表現(IR)に変換されます。 IRは、コマンドラインオプションを介して調べることができます。最後に、 codegen()関数はIRからARM32命令を生成します。これはjit()またはelf32()実行可能な生成のいずれかを介して実行できます。
AMACCは、古典的な再帰降下とオペレーターの優先順位解析を組み合わせます。オペレーターの優先順位パーサーは、オペレーターの優先順位がメソッドに変換される文法作品を使用して定義されている場合、表現の再帰降下パーサー(RDP)よりもかなり高速であることが証明されています。
AMACCは、次の構文で記述されたCソースファイルをコンパイルすることができます。
int i = [expr]int foo[2][2] = { { 1, 0 }, { 0, 1 } };アーキテクチャは、Linux ABIでARMV7HFをターゲットにし、GNU/LinuxでRaspberry Pi 2/3/4で検証されています。
AMACCのコードジェネレーターは、いくつかのGNU/Linuxの動作に依存しており、ビルド環境にARM/Linuxをインストールする必要があります。
Aプロファイルアーキテクチャ用にGNUツールチェーンをインストールします
arm-linux-none-gnueabihfを選択します(ハードフロートでAARCH32ターゲット)ARMユーザーエミュレーションのためにQEMUをインストールします
sudo apt-get install qemu-usermake check実行すると、これを確認する必要があります。
[ C to IR translation ] Passed
[ JIT compilation + execution ] Passed
[ ELF generation ] Passed
[ nested/self compilation ] Passed
[ Compatibility with GCC/Arm ] ........................................
----------------------------------------------------------------------
Ran 52 tests in 8.842s
OK
make helpで生成されたメッセージを確認して、詳細を確認してください。
AMACCは、マシンコードを非常に高速に生成でき、 gcc -O0のパフォーマンスの70%を提供します。
テスト環境:
入力ソースファイル: amacc.c
| コンパイラドライバー | バイナリサイズ(KIB) | 時間をまとめる |
|---|---|---|
-O0 -ldlを備えたGCC(コンパイル+リンク) | 56 | 0.5683 |
-O0 -cを備えたGCC(コンパイルのみ) | 56 | 0.4884 |
| amacc | 100 | 0.0217 |
AMACCコンパイルについては、中間表現(IR)を確認してください。
AMACCは、C4のインフラストラクチャに基づいています。