AMACC ist ein 32-Bit-Armarchitektur-Compiler, der von Grund auf neu gebaut wurde. Es dient als abgespeckte Version von C, die als pädagogisches Instrument ausgelegt ist, um über Compiler, Linker und Lader zu lernen.
Es gibt zwei Ausführungsmodi AMACC -Geräte:
Es ist erwähnenswert, dass AMACC so konzipiert ist, dass er eine Teilmenge von C zusammenstellt, die erforderlich ist, um sich mit den oben genannten Ausführungsmodi selbst zu veranstalten. Zum Beispiel unterstützt es globale Variablen, insbesondere globale Arrays.
Ein einfacher stapelbasierter abstrakter Syntaxbaum (AST) wird durch kooperative stmt() und expr() Parsingfunktionen erzeugt, die beide von einer Token-generierenden Funktion gespeist werden. Die expr() -Funktion führt einige buchstäbliche konstante Optimierungen durch. Der AST wird unter Verwendung der gen() -Funktion Gen () in eine stapelbasierte VM-Zwischendarstellung (IR) umgewandelt. Der IR kann über eine Befehlszeilenoption untersucht werden. Schließlich generiert die Funktion codegen() ARM32 -Anweisungen aus dem IR, die entweder über jit() oder elf32() ausführbare Generierung ausgeführt werden können
AMACC kombiniert klassische rekursive Abstammung und Vorrangvorrang vor Analyse des Bedieners. Ein Vorrangsparser als Operator ist erheblich schneller als ein rekursiger Abstammungs -Parser (RDP) für Ausdrücke, wenn der Vorrang vor Anhäufungen von Grammatikproduktionen definiert wird, die ansonsten in Methoden umgewandelt werden.
AMACC ist in der Lage, C -Quelldateien zu kompilieren, die in der folgenden Syntax geschrieben wurden:
int i = [expr]int foo[2][2] = { { 1, 0 }, { 0, 1 } };Die Architektur unterstützt ARMV7HF mit Linux abi und wurde auf Raspberry Pi 2/3/4 mit GNU/Linux verifiziert.
Der Codegenerator in AMACC stützt sich auf mehrere GNU/Linux -Verhaltensweisen, und es ist erforderlich, dass Arm/Linux in Ihrer Build -Umgebung installiert ist.
Installieren Sie GNU Toolchain für die A-Profilarchitektur
arm-linux-none-gnueabihf (AARG32-Ziel mit Hard Float)Installieren Sie QEMU für die ARM -Benutzeremulation
sudo apt-get install qemu-user Run make check und Sie sollten Folgendes sehen:
[ 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
Überprüfen Sie die von make help erzeugten Nachrichten, um mehr zu erfahren.
AMACC ist in der Lage, Maschinencode sehr schnell zu generieren und liefert 70% der Leistung von gcc -O0 .
Testumgebung:
Eingabequelldatei: amacc.c
| Compiler -Treiber | Binärgröße (KIB) | Zeit (en) kompilieren |
|---|---|---|
GCC mit -O0 -ldl (Compile+Link) | 56 | 0,5683 |
GCC mit -O0 -c (nur kompilieren) | 56 | 0,4884 |
| Amacc | 100 | 0,0217 |
Überprüfen Sie die Intermediate Repräsentation (IR) auf AMACC -Kompilierung.
AMACC basiert auf der Infrastruktur von C4.