Все статьи / А что такое Compiler Driver?


Драйвер компилятора объединяет фронтенд и бекенд как удобный фасад, в полном соответствии с паттерном Фасад (Facade). В том числе он:

  • создаёт и параметризует фронтенд и бекенд
  • вызывает методы фронтенда для начала разбора загруженного из файла текста
  • получает Abstract Syntax Tree (AST) и передаёт его бекенду для кодогенерации

Что делает компилятор в системе?

Вместе с языком C в моду вошла раздельная компиляция — компилятор C обрабатывает один файл на языке C и получает объектный файл, где для каждой функции сгенерирован машинный код, но информация о функциях ещё не потеряна, поскольку не все функции известны (реализации некоторых функций находятся в других файлах проекта или в статических библиотеках). Соединением объектных файлов в программу занимается компоновщик, а не компилятор:

  • Схема

На практике хороший компилятор может сам вызвать компоновщик как утилиту командной строки. Для поиска компоновщика в системе используются эвристические методы и переменные окружения, такие как %ProgramFiles% на Windows. Например, вы можете попытаться найти компоновщик в составе Visual Studio, перебирая заранее известные пути для различных версий Visual Studio.

Для вызова внешних утилит в C++ можно использовать system, но у неё много ограничений: например, нельзя прочитать сообщение об ошибке из другого процесса, нельзя его остановить, нельзя запускать его асинхронно. Часть недостатков устраняет POSIX-функция popen, на Windows доступная как _popen.

Аргументы командной строки

Драйвер обрабатывает аргументы командной строки: пути к файлам, опции компиляции, опции компоновщика. Для простейшего компилятора будет достаточно обрабатывать только пути к входным файлам и несколько простейших опций, например:

  • Опция уровня оптимизации: -odebug (по умолчанию) генерирует отладочную сборку без оптимизаций, а -orelease генерирует сборку с оптимизациями

Читать далее