A AMACC é um compilador de arquitetura de braço de 32 bits construído do zero. Serve como uma versão despojada do C, projetada como uma ferramenta pedagógica para aprender sobre compiladores, ligantes e carregadores.
Existem dois modos de execução AMACC implementos:
Vale ressaltar que a AMACC foi projetada para compilar um subconjunto de C necessário para se auto-hospedeiro com os modos de execução acima. Por exemplo, ele suporta variáveis globais, particularmente matrizes globais.
Uma simples árvore de sintaxe abstrata (AST) baseada em pilha é gerada através de funções de análise stmt() e expr() cooperativas, ambas alimentadas por uma função generadora de token. A função expr() executa algumas otimizações constantes literais. O AST é transformado em uma representação intermediária da VM baseada em pilha (IR) usando a função gen() . O IR pode ser examinado por meio de uma opção de linha de comando. Finalmente, a função codegen() gera instruções do ARM32 do IR, que podem ser executadas via geração jit() ou elf32()
A AMACC combina a descida recursiva clássica e a precedência do operador. Um analisador de precedência do operador prova ser consideravelmente mais rápido que um analisador de descida recursiva (RDP) para expressões quando a precedência do operador é definida usando produções gramaticais que, de outra forma, seriam transformadas em métodos.
A AMACC é capaz de compilar os arquivos de origem C escritos na seguinte sintaxe:
int i = [expr]int foo[2][2] = { { 1, 0 }, { 0, 1 } };A arquitetura suporta alvo o ARMV7HF com Linux ABI e foi verificado no Raspberry Pi 2/3/4 com GNU/Linux.
O gerador de código no AMACC conta com vários comportamentos GNU/Linux e é necessário instalar o ARM/Linux em seu ambiente de construção.
Instale a Chapa de ferramentas GNU para a arquitetura A-Profile
arm-linux-none-gnueabihf (alvo AARCH32 com hard flutuante)Instale o qemu para a emulação do usuário do braço
sudo apt-get install qemu-user Executar make check e você deve ver isso:
[ 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 as mensagens geradas pela make help para aprender mais.
A AMACC é capaz de gerar código da máquina muito rápido e fornece 70% do desempenho do gcc -O0 .
Ambiente de teste:
Arquivo de origem de entrada: amacc.c
| Driver do compilador | Tamanho binário (KIB) | Compilar tempo (s) |
|---|---|---|
GCC com -O0 -ldl (compilação+link) | 56 | 0,5683 |
GCC com -O0 -c (somente compilar) | 56 | 0,4884 |
| AMACC | 100 | 0,0217 |
Verifique a representação intermediária (IR) para a compilação AMACC.
A AMACC é baseada na infraestrutura do C4.