Мы поговорим про компиляторы и их архитектуру. Обсудим, что же такое LLVM и зачем он нам нужен. Также рассмотрим, как написать компилятор простого языка программирования на LLVM.
4. Чем будем заниматься
〉Расскажу вкратце про компиляторы и их архитектуру
〉Обзор LLVM - что это такое и зачем он нам нужен
〉Написание компилятора простого Языка Программирования
4
6. Компилятор
Вход: описание программы на исходном языке компилятора
Выход: описание той же программы, но на другом языке
(зачастую в машинном коде или assembler-е)
6
Чтобы не переписывать компилятор “с нуля” под каждую целевую платформу -
используется трехэтапная компиляция программ
15. LLVM
LLVM (Low Level Virtual Machine, compiler infrastructure)
〉Набор модулей и инструментов для разработки компиляторов
〉В основе LLVM лежит промежуточное представление (Intermediate
Representation, IR) кода - типизированный трёхадресный код в SSA-форме
〉Реализует VM c RISC-подобными инструкциями и бесконечным количеством
регистров
〉Есть API для написания frontend-а на С++ и OCaml
15
16. Возможности LLVM
〉Оптимизация промежуточного представления кода
〉Компилятор байт-кода в машинный код
〉 x86, x86-64, ARM, PowerPC, SPARC, MIPS, IA-64, Alpha
〉Интерпретация и JIT-компиляция байт-кода
〉 x86, x86_64, PowerPC, MIPS
〉Имеет множество frontend-ов: С, C++, Objective-C, Fortran, Ada, Haskell, Java,
Python, Ruby, JavaScript, GLSL
16
17. Типы данных в LLVM
Построение компилятора на базе LLVM
18. Простые типы
Целые числа произвольной разрядности
〉 i1, i32, i17, i256, …
Числа с плавающей точкой
〉 float, double, …
Пустое значение
〉 void
18
19. Сложные типы
Указатели (тип*)
〉 i1*, i32*, float*, ...
Массивы ([число элементов х
тип])
〉 [10 x float], [2 x i32]
Вектор (для упрощения SIMD
операций)
〉 <4 x i32>
Структуры
〉 {i1, i32, double}
Функции:
〉i32 (i32, i32)
〉float ({float, float}, i1*)
19
21. Операции
〉 Полный набор арифметических операций
〉 Тип операндов нужно всегда указывать явно
〉 Есть операции приведения типов (аналоги static_cast<> и reinterpret_cast<>)
21
; x = (a + b) * c - d / e
%tmp1 = add float %a, %b
%tmp2 = mul float %tmp1, %c
%tmp3 = fdiv float %d, %e
%x = sub float %tmp2, %tmp3
22. Операции - 2
Инструкции для передачи управления
Инструкции работы с памятью
〉 load, store, malloc, alloca
Работа с исключениями
〉 invoke, unwind
Работа с указателями
〉 getelementptr, extractvalue, insertvalue
22
24. Общая схема работы алгоритма оптимизации
〉Ищем определенный шаблон в коде для преобразования
〉Проверяем, что преобразование ничего не сломает
〉Проводим преобразование
24
25. Простая оптимизация SimplifySubInst
〉Ищет выражения вида:
〉 X - X, X - 0, …
〉Проверяем, что преобразование ничего не сломает
〉 Если X - целое число, то данные выражения всегда можно оптимизировать
〉Проводим преобразование
〉 X - X = 0;
〉 X - 0 = X;
25
26. Встроенные алгоритмы оптимизации
〉Удаление неиспользуемого кода (dead code elimination)
〉Выделение одинаковых подвыражений (common subexpression elimination)
〉Распространение констант (constant propagation, condition propagation)
〉Inline-подстановка функций
〉Раскрутка и размыкание циклов, вынос инвариантов за пределы цикла
〉Оптимизация хвостовой рекурсии
26