AMACC es un compilador de arquitectura ARM de 32 bits construido desde cero. Sirve como una versión despojada de C, diseñada como una herramienta pedagógica para aprender sobre compiladores, enlazadores y cargadores.
Hay dos modos de ejecución implementos AMACC:
Vale la pena mencionar que AMACC está diseñado para compilar un subconjunto de C necesario para auto-anfitrión con los modos de ejecución anteriores. Por ejemplo, admite variables globales, particularmente matrices globales.
Se genera un simple árbol de sintaxis abstracto basado en pila (AST) a través de funciones de análisis cooperativas stmt() y expr() , ambas alimentadas por una función de generación de token. La función expr() realiza algunas optimizaciones constantes literales. El AST se transforma en una representación intermedia (IR) basada en una pila utilizando la función gen() . El IR se puede examinar a través de una opción de línea de comandos. Finalmente, la función codegen() genera instrucciones ARM32 desde el IR, que se puede ejecutar a través de jit() o elf32() Generación ejecutable
AMACC combina descenso recursivo clásico y análisis de precedencia del operador. Un analizador de precedencia del operador demuestra ser considerablemente más rápido que un analizador de descenso recursivo (RDP) para expresiones cuando la precedencia del operador se define utilizando producciones gramaticales que de otro modo se convertirían en métodos.
AMACC es capaz de compilar archivos de origen C escritos en la siguiente sintaxis:
int i = [expr]int foo[2][2] = { { 1, 0 }, { 0, 1 } };El soporte de arquitectura se dirige a ARMV7HF con Linux ABI, y se ha verificado en Raspberry Pi 2/3/4 con GNU/Linux.
El generador de código en AMACC se basa en varios comportamientos GNU/Linux, y es necesario tener instalado ARM/Linux en su entorno de compilación.
Instale la cadena de herramientas GNU para la arquitectura A-Profile
arm-linux-none-gnueabihf (objetivo AARCH32 con flotante duro)Instale QEMU para la emulación del usuario del brazo
sudo apt-get install qemu-user Ejecute make check y debería ver esto:
[ 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
Verifique los mensajes generados por make help para obtener más información.
AMACC puede generar el código de máquina realmente rápido y proporciona el 70% del rendimiento de gcc -O0 .
Entorno de prueba:
Archivo fuente de entrada: amacc.c
| compilador | Tamaño binario (kib) | compilar el tiempo (s) |
|---|---|---|
GCC con -O0 -ldl (compilar+enlace) | 56 | 0.5683 |
GCC con -O0 -c (solo compilar) | 56 | 0.4884 |
| Amacc | 100 | 0.0217 |
Verifique la representación intermedia (IR) para la compilación AMACC.
AMACC se basa en la infraestructura de C4.