LLVM: инфраструктура для разработки компиляторов. Знакомство с основами LLVM и использование базовых библиотек для создания продвинутых инструментов
Покупка
Тематика:
Программирование на C и C++
Издательство:
ДМК Пресс
Перевод:
Киселев Артём Николаевич
Год издания: 2023
Кол-во страниц: 343
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-89818-603-6
Артикул: 817108.01.99
LLVM — новейший фреймворк для разработки компиляторов. Благодаря простоте расширения и организации в виде множества библиотек, LLVM легко поддается освоению даже начинающими программистами, вопреки устоявшемуся мнению о сложности разработки компиляторов.
Сначала эта книга покажет, как настроить, собрать и установить библиотеки, инструменты и внешние проекты LLVM. Затем познакомит с архитектурой LLVM и особенностями работы всех компонентов компилятора: анализатора исходных текстов, генератора кода промежуточного представления, генератора выполняемого кода, механизма JIT-компиляции, возможностями кросс-компиляции и интерфейсом расширений. На множестве наглядных примеров и фрагментов исходного кода книга поможет вам войти в мир разработки компиляторов на основе LLVM.
Издание предназначено энтузиастам, студентам, а также разработчикам компиляторов, интересующимся LLVM. Читатели должны знать язык программирования C++ и, желательно, иметь некоторые представления о теории компиляции.
- Полная коллекция по информатике и вычислительной технике
- ДМК Пресс. Информационные системы и технологии
- ДМК Пресс. ИТ-технологии для профессионалов
- Интермедиатор. Информационные системы и технологии (сводная)
- Интермедиатор. ИТ-технологии для профессионалов (сводная)
- Программирование
- Программирование на C и C++
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Бруно Кардос Лопес Рафаэль Аулер LLVM: инфраструктура для разработки компиляторов Знакомство с основами LLVM и использование базовых библиотек для создания продвинутых инструментов
Getting Started with LLVM Core Libraries Get to grips with LLVM essentials and use the core libraries to build advanced tools Bruno Cardoso Lopes Rafael Auler BIRMINGHAM - MUMBAI
LLVM: инфраструктура для разработки компиляторов Знакомство с основами LLVM и использование базовых библиотек для создания продвинутых инструментов Москва, 2023 2-е издание, электронное
УДК 004.4’422LLVM ББК 32.973.33 Л77 Л77 Лопес, Бруно Кардос. LLVM: инфраструктура для разработки компиляторов. Знакомство с основами LLVM и использование базовых библиотек для создания продвинутых инструментов / Б. К. Лопес, Р. Аулер ; пер. с англ. А. Н. Киселёва. — 2-е изд., эл. — 1 файл pdf : 343 с. — Москва : ДМК Пресс, 2023. — Систем. требования: Adobe Reader XI либо Adobe Digital Editions 4.5 ; экран 10". — Текст : электронный. ISBN 978-5-89818-603-6 LLVM — новейший фреймворк для разработки компиляторов. Благодаря простоте расширения и организации в виде множества библиотек, LLVM легко поддается освоению даже начинающими программистами, вопреки устоявшемуся мнению о сложности разработки компиляторов. Сначала эта книга покажет, как настроить, собрать и установить библиотеки, инструменты и внешние проекты LLVM. Затем познакомит с архитектурой LLVM и особенностями работы всех компонентов компилятора: анализатора исходных текстов, генератора кода промежуточного представления, генератора выполняемого кода, механизма JIT-компиляции, возможностями кросс-компиляции и интерфейсом расширений. На множестве наглядных примеров и фрагментов исходного кода книга поможет вам войти в мир разработки компиляторов на основе LLVM. Издание предназначено энтузиастам, студентам, а также разработчикам компиляторов, интересующимся LLVM. Читатели должны знать язык программирования C++ и, желательно, иметь некоторые представления о теории компиляции. УДК 004.4’422LLVM ББК 32.973.33 Электронное издание на основе печатного издания: LLVM: инфраструктура для разработки компиляторов. Знакомство с основами LLVM и использование базовых библиотек для создания продвинутых инструментов / Б. К. Лопес, Р. Аулер ; пер. с англ. А. Н. Киселёва. — Москва : ДМК Пресс, 2015. — 342 с. — ISBN 978-5-97060-305-5. — Текст : непосредственный. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации. ISBN 978-5-89818-603-6 © 2014 Packt Publishing © Оформление, перевод на русский язык, ДМК Пресс, 2015
Оглавление Об авторах ...................................................... 11 О рецензентах.................................................. 12 предисловие ................................................... 14 Содержание книги ......................................................................... 17 Что потребуется для работы с книгой ............................................ 19 Кому адресована эта книга ............................................................ 19 Типографские соглашения ............................................................ 20 Отзывы и пожелания ..................................................................... 21 Скачивание исходного кода примеров .......................................... 21 Список опечаток............................................................................ 22 Нарушение авторских прав ........................................................... 22 Глава 1. Сборка и установка LLVM ........................ 23 Порядок нумерации версий LLVM .................................................. 24 Установка скомпилированных пакетов LLVM ................................. 25 Установка скомпилированных пакетов с официального сайта ............... 25 Установка с использованием диспетчера пакетов ................................. 27 Сборка из исходных текстов .......................................................... 28 Системные требования ......................................................................... 28 Получение исходных текстов................................................................. 29 Сборка и установка LLVM ...................................................................... 30 Windows и Microsoft Visual Studio ........................................................... 37 Mac OS X и Xcode .................................................................................. 41 В заключение ................................................................................ 45 Глава 2. Внешние проекты .................................. 47 Введение в дополнительные инструменты Clang ........................... 47 Сборка и установка дополнительных инструментов Clang ..................... 49 Compiler-RT .......................................................................................... 50 Compiler-RT в действии ......................................................................... 51 Расширение DragonEgg ................................................................. 52 Сборка DragonEgg ................................................................................ 53
Оглавление Конвейер компиляции с применением DragonEgg и инструментов LLVM ............................................................................ 54 Пакет тестов LLVM ................................................................................ 56 Использование LLDB............................................................................. 57 Введение в стандартную библиотеку libc++ .......................................... 59 В заключение ................................................................................ 63 Глава 3. Инструменты и организация ................... 64 Введение в основные принципы организации LLVM ...................... 64 LLVM сегодня ................................................................................ 67 Взаимодействие с драйвером компилятора .................................. 71 Использование автономных инструментов .................................... 72 Внутренняя организация LLVM ...................................................... 75 Основные библиотеки LLVM .................................................................. 76 Приемы программирования на C++ в LLVM ........................................... 78 Эффективные приемы программирования на C++ в LLVM ..................... 80 Демонстрация расширяемого интерфейса проходов............................ 83 Реализация первого собственного проекта LLVM .......................... 84 Makefile ................................................................................................. 85 Реализация ........................................................................................... 87 Общие советы по навигации в исходных текстах LLVM .................. 89 Читайте код как документацию ............................................................. 89 Обращайтесь за помощью к сообществу .............................................. 90 Знакомьтесь с обновлениями – читайте журнал изменений в SVN как документацию ....................................................................... 90 Заключительные замечания .................................................................. 93 В заключение ................................................................................ 93 Глава 4. Анализатор исходного кода .................... 94 Введение в Clang........................................................................... 94 Работа анализатора исходного кода ..................................................... 95 Библиотеки ........................................................................................... 97 Диагностика в Clang ............................................................................ 100 Этапы работы анализатора Clang ................................................ 105 Лексический анализ ............................................................................ 105 Синтаксический анализ ...................................................................... 112 Семантический анализ........................................................................ 119 Все вместе .................................................................................. 122 В заключение .............................................................................. 126 Глава 5. промежуточное представление LLVM ..... 127 Обзор .......................................................................................... 127 Зависимость LLVM IR от целевой архитектуры .................................... 130
Оглавление Основные инструменты для работы с форматами IR ................... 131 Введение в синтаксис языка LLVM IR ........................................... 132 Представление LLVM IR в памяти ........................................................ 136 Реализация собственного генератора LLVM IR ............................ 139 Сборка и запуск генератора IR ............................................................ 143 Как генерировать любые конструкции IR с использованием генератора кода C++ ........................................................................... 144 Оптимизация на уровне IR ........................................................... 145 Оптимизации времени компиляции и времени компоновки ................ 145 Определение проходов, имеющих значение ....................................... 147 Зависимости между проходами .......................................................... 149 Прикладной интерфейс проходов ....................................................... 151 Реализация собственного прохода ..................................................... 152 В заключение .............................................................................. 157 Глава 6. Генератор выполняемого кода ............... 158 Обзор .......................................................................................... 158 Инструменты генераторов кода .......................................................... 161 Структура генератора кода ......................................................... 162 Библиотеки генераторов кода ..................................................... 163 Язык TableGen ............................................................................. 165 Язык ................................................................................................... 167 Использование файлов .td с генераторами кода ................................. 168 Этап выбора инструкций ............................................................. 174 Класс SelectionDAG ............................................................................. 175 Упрощение ......................................................................................... 178 Объединение DAG и легализация ........................................................ 179 Выбор инструкций с преобразованием «DAG-to-DAG» ........................ 181 Визуализация процесса выбора инструкций ....................................... 184 Быстрый выбор инструкций ................................................................ 185 Планирование инструкций .......................................................... 186 Маршруты инструкций ........................................................................ 186 Определение опасностей ................................................................... 188 Единицы планирования ....................................................................... 188 Машинные инструкции ................................................................ 188 Распределение регистров ........................................................... 189 Объединение регистров ..................................................................... 191 Замена виртуальных регистров .......................................................... 196 Архитектурно-зависимые обработчики ............................................... 197 Пролог и эпилог .......................................................................... 198 Индексы кадров стека ......................................................................... 199 Инфраструктура машинного кода ................................................ 199
Оглавление Инструкции MC ................................................................................... 200 Эмиссия кода ..................................................................................... 200 Реализация собственного прохода для генератора кода ............. 203 В заключение .............................................................................. 206 Глава 7. Динамический компилятор .................. 208 Основы механизма динамической компиляции в LLVM ................ 209 Введение в механизм выполнения ...................................................... 210 Управление памятью ........................................................................... 212 Введение в инфраструктуру llvm::JIT ........................................... 213 Запись блоков двоичного кода в память .............................................. 213 JITMemoryManager ............................................................................. 214 Механизмы вывода целевого кода ...................................................... 214 Информация о целевой архитектуре ................................................... 215 Практика применения класса JIT ......................................................... 217 Введение в инфраструктуру llvm::MCJIT ...................................... 222 Механизм MCJIT ................................................................................. 223 Как MCJIT компилирует модули .......................................................... 224 Диспетчер памяти ............................................................................... 227 Использование механизма MCJIT ............................................... 228 Инструменты компиляции LLVM JIT ............................................. 231 Инструмент lli ...................................................................................... 231 Инструмент llvm-rtdyld ........................................................................ 232 Дополнительные ресурсы ........................................................... 233 В заключение .............................................................................. 234 Глава 8. Кросс-платформенная компиляция ....... 235 Сравнение GCC и LLVM ............................................................... 236 Триады определения целевой архитектуры ................................. 238 Подготовка инструментария ....................................................... 240 Стандартные библиотеки C и C++ ....................................................... 240 Библиотеки времени выполнения ....................................................... 241 Ассемблер и компоновщик ................................................................. 242 Анализатор исходного кода Clang ....................................................... 242 Кросс-компиляция с аргументами командной строки Clang ........ 244 Параметры драйвера, определяющие архитектуру ............................. 244 Зависимости ...................................................................................... 245 Кросс-компиляция .............................................................................. 246 Изменение корневого каталога ........................................................... 248 Создание кросс-компилятора Clang ............................................ 250 Параметры настройки ......................................................................... 250 Сборка и установка кросс-компилятора на основе Clang .................... 251 Альтернативные методы сборки .......................................................... 252
Оглавление Тестирование .............................................................................. 254 Одноплатные компьютеры .................................................................. 254 Симуляторы ........................................................................................ 255 Дополнительные ресурсы ........................................................... 255 В заключение .............................................................................. 256 Глава 9. Статический анализатор Clang .............. 257 Роль статического анализатора ................................................... 258 Сравнение классического механизма предупреждений со статическим анализатором Clang ................................................... 258 Возможности механизма символического выполнения ....................... 262 Тестирование статического анализатора .................................... 265 Использование драйвера и компилятора ............................................ 265 Получение списка доступных средств проверки .................................. 266 Использование статического анализатора в Xcode IDE ....................... 268 Создание графических отчетов в формате HTML ................................ 269 Анализ больших проектов ................................................................... 269 Расширение статического анализатора Clang собственными средствами определения ошибок .....................................................275 Архитектура проекта ........................................................................... 275 Разработка собственного средства проверки ..................................... 277 Дополнительные ресурсы ........................................................... 287 В заключение .............................................................................. 289 Глава 10. Инструменты Clang и фреймворк LibTooling ................................... 290 Создание базы данных команд компиляции ................................ 290 Clang-tidy .................................................................................... 292 Проверка исходного кода с помощью Clang-tidy ................................. 293 Инструменты рефакторинга ........................................................ 294 Clang Modernizer ................................................................................. 295 Clang Apply Replacements .................................................................... 296 ClangFormat ........................................................................................ 298 Modularize ........................................................................................... 300 Module Map Checker ............................................................................ 308 PPTrace ............................................................................................... 309 Clang Query ......................................................................................... 311 Clang Check ........................................................................................ 313 Удаление вызовов c_str()..................................................................... 314 Создание собственного инструмента .......................................... 314 Определение задачи – создание инструмента рефакторинга кода на C++ ......................................................................................... 315 Определение структуры каталогов для исходного кода ....................... 315
Оглавление Шаблонный код инструмента .............................................................. 317 Использование предикатов AST .......................................................... 321 Создание обработчиков ...................................................................... 326 Тестирование нового инструмента рефакторинга ............................... 328 Дополнительные ресурсы ........................................................... 329 В заключение .............................................................................. 329 предметный указатель .................................... 331