AMACC est un compilateur d'architecture de bras 32 bits construit à partir de zéro. Il sert de version dépouillée de C, conçue comme un outil pédagogique pour apprendre les compilateurs, les liens et les chargeurs.
Il y a deux modes d'exécution AMACC ITLITIFS:
Il convient de mentionner que AMACC est conçu pour compiler un sous-ensemble de C nécessaire à l'auto-hôte avec les modes d'exécution ci-dessus. Par exemple, il prend en charge les variables globales, en particulier les tableaux mondiaux.
Une simple arborescence de syntaxe abstraite basée sur une pile (AST) est générée via des fonctions d'analyse COOPERATIVE stmt() et expr() , toutes deux alimentées par une fonction générateur de jeton. La fonction expr() effectue certaines optimisations constantes littérales. L'AST est transformé en une représentation intermédiaire VM basée sur la pile (IR) en utilisant la fonction gen() . L'IR peut être examiné via une option de ligne de commande. Enfin, la fonction codegen() génère des instructions ARM32 à partir de l'IR, qui peut être exécutée via jit() ou elf32() Génération exécutable
AMACC combine la descente récursive classique et l'analyse de priorité de l'opérateur. Un analyseur de priorité d'opérateur s'avère considérablement plus rapide qu'un analyseur de descente récursif (RDP) pour les expressions lorsque la priorité de l'opérateur est définie à l'aide de productions de grammaire qui seraient autrement transformées en méthodes.
AMACC est capable de compiler les fichiers source C écrits dans la syntaxe suivante:
int i = [expr]int foo[2][2] = { { 1, 0 }, { 0, 1 } };La prise en charge de l'architecture cible ARMV7HF avec Linux ABI, et il a été vérifié sur Raspberry Pi 2/3/4 avec GNU / Linux.
Le générateur de code dans AMACC repose sur plusieurs comportements GNU / Linux, et il est nécessaire d'installer le bras / linux dans votre environnement de construction.
Installez la chaîne d'outils GNU pour l'architecture A-Profile
arm-linux-none-gnueabihf (cible Aarch32 avec Float dur)Installez Qemu pour l'émulation des utilisateurs ARM
sudo apt-get install qemu-user Exécutez make check et vous devriez voir ceci:
[ 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
Vérifiez les messages générés par make help pour en savoir plus.
AMACC est capable de générer du code machine très rapidement et fournit 70% des performances de gcc -O0 .
Environnement de test:
Fichier source d'entrée: amacc.c
| conducteur de compilateur | Taille binaire (kib) | compiler des temps (s) |
|---|---|---|
gcc avec -O0 -ldl (compiler + lien) | 56 | 0,5683 |
gcc avec -O0 -c (compiler uniquement) | 56 | 0,4884 |
| Amacc | 100 | 0,0217 |
Vérifiez la représentation intermédiaire (IR) pour la compilation AMACC.
AMACC est basé sur l'infrastructure de C4.