AMACC-это 32-битный архитектурный компилятор ARM, построенный с нуля. Он служит урезанной версией C, разработанной как педагогический инструмент для изучения компиляторов, линкеров и погрузчиков.
Есть два режима выполнения Amacc Refrance:
Стоит упомянуть, что AMACC предназначен для составления подмножества C, необходимого для самостоятельности с вышеуказанными режимами выполнения. Например, он поддерживает глобальные переменные, особенно глобальные массивы.
Простое абстрактное синтаксисное дерево на основе стека (AST) генерируется с помощью функций анализа кооперативного stmt() и expr() , которые подают функцию, создаваемую токен. Функция expr() выполняет некоторые буквальные постоянные оптимизации. AST преобразуется в промежуточное представление на основе стека (IR) с использованием функции gen() . IR может быть проверен с помощью параметра командной строки. Наконец, функция codegen() генерирует инструкции ARM32 из IR, которые могут быть выполнены через jit() или elf32() исполняемая генерация
AMACC сочетает в себе классический рекурсивный спуск и приоритет оператора. Сандитор -приоритет оператора оказывается значительно быстрее, чем рекурсивный анализатор спуска (RDP) для выражений, когда приоритет оператора определяется с использованием грамматических производств, которые в противном случае были бы превращены в методы.
AMACC способен собирать исходные файлы C, записанные в следующем синтаксисе:
int i = [expr]int foo[2][2] = { { 1, 0 }, { 0, 1 } };Архитектурная поддержка нацелена ARMV7HF с Linux ABI, и она была проверена на Raspberry Pi 2/3/4 с GNU/Linux.
Генератор кода в AMACC опирается на несколько поведений GNU/Linux, и необходимо установить ARM/Linux в вашей среде сборки.
Установите инструментальную щетку GNU для A-Profile Architecture
arm-linux-none-gnueabihf (цель Aarch32 с жестким поплавком)Установите QEMU для эмуляции пользователя ARM
sudo apt-get install qemu-user Запустите make 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 может очень быстро генерировать машинный код и обеспечивает 70% производительности gcc -O0 .
Тестовая среда:
Входной исходный файл: amacc.c
| Драйвер компилятора | бинарный размер (киб) | Время компиляции (ов) |
|---|---|---|
GCC с -O0 -ldl (компиляция+ссылка) | 56 | 0,5683 |
GCC с -O0 -c (только компиляция) | 56 | 0,4884 |
| Амакк | 100 | 0,0217 |
Проверьте промежуточное представление (IR) для компиляции AMACC.
AMACC основан на инфраструктуре C4.