За исключением, возможно, нескольких высокоуровневых (например, осведомленных о высокоуровневых языковых возможностях или деталях, которые не кодируются в LLVM IR) оптимизаций, бэкэнд Clang делает чуть больше, чем просто генерирует IR и запускает некоторый набор LLVM оптимизация проходит по нему. Все они (или, по крайней мере, большинство) должны быть доступны через команду opt
, а также в виде вызовов API при использовании библиотек C ++, на которых построены все инструменты LLVM. См. учебник для простого примера. Я вижу несколько преимуществ:
- LLVM IR намного проще, чем C, и уже есть удобный API для его генерации программно. Чтобы сгенерировать C, у вас либо есть много уродливых и ненадежных игр с строками, либо вы должны создать AST для языка C самостоятельно. Или оба.
- Вы можете сами выбрать набор оптимизаций (вполне возможно, что набор проходов Clang не идеален для кода, поддерживаемого языком, и для IR-представления, создаваемого вашим компилятором). Это также означает, что во время разработки вы можете просто выполнить проходную проверку на корректность IR (обнаружение ошибок компилятора быстрее). Вы можете просто скопировать пропуск Clang, но если вам так хочется, вы также можете поэкспериментировать.
- Это позволит лучше компилировать время. Clang быстр для компилятора C, но вы бы добавили ненужные накладные расходы: вы генерируете C-код, затем Clang анализирует его, преобразует его в IR и продолжает делать то, что вы могли бы сделать прямо сейчас.
- У вас может быть доступ к более широкому диапазону функций или, по крайней мере, вы получите их проще (т. Е. Без необходимости включать
#define
s, скрытые прагмы, инстинкты или параметры командной строки) для их предоставления. Я говорю о одинаковых векторах, гарантированных (ну, во всяком случае, больше, чем в C - AFAIK, некоторые генераторы кода игнорируют их) хвостовых вызовов, чисто / только для чтения функций, большего контроля над макетом памяти и преобразованиями типов (например, расширение нуля против знака расширение). Конечно, большинство из них вам может не понадобиться.