Немного о том, что происходит во время компилирования программы в GCC.
Обычно рассказывается, что преобразование происходит по следующей схеме:
Обычно рассказывается, что преобразование происходит по следующей схеме:
- препроцессирование (команда gcc -E)
- ассемблирование (команда gcc -S)
- создание объектного файла (команда gcc -o)
- связывание (ld)
- Парсинг интерфейсом (front-end) текущего языка. После этого получается AST файла, но в зависимости от реализации интерфейса языка, оно может быть как в обощённом (GENERIC) представлении, так и во внутреннем, понятным только самому интерфейсу.
- Гимплификация (gimplification). Это процесс преобразования функции из промежуточного представления в язык GIMPLE. Это трёх-адресный ассемблер, куда преобразуются выражения из GENERIC.
- Оптимизация. На данном этапе выполняются различные виды оптимизаций. Они выполняются в несколько проходов. Сначала устанавливаются и упорядочиваются сами проходы (passes), после чего они последовательно запускаются. Это могут быть оптимизации OpenMP, удаление мёртвых ветвей кода, оптимизация работы переменных и т.п. Это называется Tree optimization passes.
- Транслирование в RTL. RTL - Register Transfer Language. Это специальный низкоуровневый промежуточный язык. Для него тоже производятся некоторые оптимизации.
- Ассемблирование. И, наконец, из RTL компилятор получает ассемблерный код.