Немного о том, что происходит во время компилирования программы в 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 компилятор получает ассемблерный код.
Пара интересных ссылок по теме:
ОтветитьУдалитьftp://gcc.gnu.org/pub/gcc/summit/2003/GENERIC%20and%20GIMPLE.pdf
http://rishi.fedorapeople.org/GCC_Internals__A_Conceptual_View_into_GCC_409.pdf
Спасибо за ссылки, очень интересно, но пока детально изучить не успел. Вообще, с gcc проблема в почти полном отсутствии документации. Я пока не нашёл адекватного описания event'ов, происходящих при компиляции. А происходят они не самым очевидным способом.
УдалитьЯ Вам посоветовал бы почитать последню редакцию книги дракона (Compilers: Principles, Techniques, and Tools, 2nd Edition).
УдалитьСпасибо. Книга, безусловно, нужная и интересная (у меня только первая редакция).
УдалитьТолько у меня вопрос. Это просто рекомендация, или намёк на грубую фактическую ошибку? :)