LLVM
– не виртуальная машина
Алексей Рагозин
В докладе
Генерация машинного кода
 AST Vs. Byte code Vs. Machine code
Архитектура компилятора
LLVM как экосистема
Генерация кода
Исходный код
double distance(
double x1, double y1,
double x2, double y2) {
return Math.sqrt((x2-x1)*(x2-x1...
Генерация кода
AST (Abstract Syntax Tree)
x2 x1 x2 x1 y2 y1 y2 y1
Генерация кода
Интерпретация AST
 Простота реализации
 Гибкость
 Не слишком эффективно
Генерация кода
Байт код (byte code)
 Псевдокод, предназначенный
для интерпретации
 Простая система инструкций
 Как прав...
Генерация кода
Байт код (JVM)
DLOAD 4: x2
DLOAD 0: x1
DSUB
DLOAD 4: x2
DLOAD 0: x1
DSUB
DMUL
DLOAD 6: y2
DLOAD 2: y1
DSUB
...
Генерация кода
Почему стековая машина?
 Компактный набор инструкций
 Простота интерпретации
 Простота генерации кода
 ...
Генерация кода
Реальный CPU Vs. Стековая ВМ
 Ограниченное количество регистров
 Неравноценные регистры
 CISC – сложные ...
Генерация кода
Машинный код (x86)
# {method} 'distance' '(DDDD)D'
# parm0: xmm0:xmm0 = double
# parm1: xmm1:xmm1 = double
...
Генерация кода
Байт код
 Простой набор инструкций
 Может интерпретироваться напрямую
Бит код
 Бинарноепредставлениеграф...
Архитектура компилятора
Парсер
Промежуточное
Представление
Runtime
библиотека
Трансформация
высокоуровневых
конструкций в ...
Генерация кода
LLVM IR
define double @distance(
double %x1, double %y1,
double %x2, double %y2) {
%dx = fsub double %x2, %...
Генерация кода
LLVM IR
for.body:
...
%val0 = load i32* %arrayidx
...
store i32 %val0, i32* %arrayidx1
...
br i1 %exitcond,...
Генерация кода
LLVM IR
 Блок – набор инструкций без переходов
 SSA – single statement assignment
 Базовый набор инструк...
Проблема регистров
 Ограниченное число
 Неравноценность
регистров
 Ограничение
конвенции вызовов
 Дорогое сохранение /...
Генерация кода
Data
Flow
Graph
x2 x1 y2 y1
Генерация кода
LLVM – генерация кода
 CFG – Control Flow Graph
 DFG – Data Flow Graph
 Распределение регистров
 Упоряд...
Генерация кода
LLVM – фазы кодогенератора
 Instruction selection
 Scheduling and formation
 SSA based optimization
 Re...
Генерация кода
LLVM IR – общий язык
для алгоритмов оптимизации
 loop unrolling
 autovectorization
 global variable numb...
Архитектура компилятора
Парсер
Промежуточное
Представление
Runtime
библиотека
Трансформация
высокоуровневых
конструкций в ...
Экосистема LLVM
Лицензия в стиле BSD
CLang – C/C++ компилятор
LLVM JIT
 IR интерпретатор / Интеграция с окружением (перем...
LLVM не …
LLVM не реализует
 Управление памятью / сборку мусора
 “Динамическую” оптимизацию кода
но LLVM поддерживает
 ...
LLVM и JIT
 Интерпретатор IR
 Линковка JIT кода с родительским
процессом
 Качественная статическая оптимизация
Для трас...
LLVM
Compile once, generate code anywhere
 Компилятор производит IR на выходе
 Код распространяется в виде IR
 Генераци...
Спасибо!
Алексей Рагозин
alexey.ragozin@gmail.com
http://blog.ragozin.info
Upcoming SlideShare
Loading in...5
×

Алексей Рагозин (Deutsche Bank)

296

Published on

Published in: Internet
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
296
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Алексей Рагозин (Deutsche Bank)

  1. 1. LLVM – не виртуальная машина Алексей Рагозин
  2. 2. В докладе Генерация машинного кода  AST Vs. Byte code Vs. Machine code Архитектура компилятора LLVM как экосистема
  3. 3. Генерация кода Исходный код double distance( double x1, double y1, double x2, double y2) { return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); }
  4. 4. Генерация кода AST (Abstract Syntax Tree) x2 x1 x2 x1 y2 y1 y2 y1
  5. 5. Генерация кода Интерпретация AST  Простота реализации  Гибкость  Не слишком эффективно
  6. 6. Генерация кода Байт код (byte code)  Псевдокод, предназначенный для интерпретации  Простая система инструкций  Как правило, стековая машина
  7. 7. Генерация кода Байт код (JVM) DLOAD 4: x2 DLOAD 0: x1 DSUB DLOAD 4: x2 DLOAD 0: x1 DSUB DMUL DLOAD 6: y2 DLOAD 2: y1 DSUB DLOAD 6: y2 DLOAD 2: y1 DSUB DMUL DADD INVOKESTATIC Math.sqrt (D)D DRETURN
  8. 8. Генерация кода Почему стековая машина?  Компактный набор инструкций  Простота интерпретации  Простота генерации кода  Обход AST в глубину
  9. 9. Генерация кода Реальный CPU Vs. Стековая ВМ  Ограниченное количество регистров  Неравноценные регистры  CISC – сложные инструкции  “Векторные” инструкции SIMD – single instruction multiple data
  10. 10. Генерация кода Машинный код (x86) # {method} 'distance' '(DDDD)D' # parm0: xmm0:xmm0 = double # parm1: xmm1:xmm1 = double # parm2: [sp+0x30] = double # parm3: [sp+0x38] = double mov %eax,0xffffd000(%esp) push %ebp sub $0x28,%esp ;*dload movsd 0x38(%esp),%xmm3 movsd 0x30(%esp),%xmm2 subsd %xmm0,%xmm2 movapd %xmm2,%xmm0 mulsd %xmm2,%xmm0 subsd %xmm1,%xmm3 movapd %xmm3,%xmm1 mulsd %xmm3,%xmm1 addsd %xmm1,%xmm0 sqrtsd %xmm0,%xmm0 add $0x28,%esp pop %ebp test %eax,0x320100 ; {poll_return} ret
  11. 11. Генерация кода Байт код  Простой набор инструкций  Может интерпретироваться напрямую Бит код  Бинарноепредставлениеграфавыполнения  Не предназначен для интерпретации
  12. 12. Архитектура компилятора Парсер Промежуточное Представление Runtime библиотека Трансформация высокоуровневых конструкций в граф исполнения Оптимизация на уровне графа Промежуточное Представление Генерация машинного кода Исключения Сборкамусора Поддержкаотладчика
  13. 13. Генерация кода LLVM IR define double @distance( double %x1, double %y1, double %x2, double %y2) { %dx = fsub double %x2, %x1 %dy = fsub double %y2, %y1 %sx = fmul double %dx, %dx %sy = fmul double %dy, %dy %ss = fadd double %sx, %sy %dst = call double @llvm.sqrt.f64(%ss) ret double %dst }
  14. 14. Генерация кода LLVM IR for.body: ... %val0 = load i32* %arrayidx ... store i32 %val0, i32* %arrayidx1 ... br i1 %exitcond, label %for.end, label %for.body for.end:
  15. 15. Генерация кода LLVM IR  Блок – набор инструкций без переходов  SSA – single statement assignment  Базовый набор инструкций  “интринсики” для дополнительных инструкций  Аннотация кода мета данными
  16. 16. Проблема регистров  Ограниченное число  Неравноценность регистров  Ограничение конвенции вызовов  Дорогое сохранение / восстановление регистров
  17. 17. Генерация кода Data Flow Graph x2 x1 y2 y1
  18. 18. Генерация кода LLVM – генерация кода  CFG – Control Flow Graph  DFG – Data Flow Graph  Распределение регистров  Упорядочивание инструкций + Эвристические оптимизации
  19. 19. Генерация кода LLVM – фазы кодогенератора  Instruction selection  Scheduling and formation  SSA based optimization  Register allocation  Prolog/Epilog code  Late machine code optimization  Code emission
  20. 20. Генерация кода LLVM IR – общий язык для алгоритмов оптимизации  loop unrolling  autovectorization  global variable numbering  constant folding  …
  21. 21. Архитектура компилятора Парсер Промежуточное Представление Runtime библиотека Трансформация высокоуровневых конструкций в граф исполнения Оптимизация на уровне графа Промежуточное Представление Генерация машинного кода Исключения Сборкамусора Поддержкаотладчика
  22. 22. Экосистема LLVM Лицензия в стиле BSD CLang – C/C++ компилятор LLVM JIT  IR интерпретатор / Интеграция с окружением (переменные и п.р.) VMKit Различныекоммерческиепроекты  XCode / MacOS OpenGL / Компиляторы Intel
  23. 23. LLVM не … LLVM не реализует  Управление памятью / сборку мусора  “Динамическую” оптимизацию кода но LLVM поддерживает  Работу с картами стека (stack maps)  Маркировку GC корней  Вставку GC барьеров в IR
  24. 24. LLVM и JIT  Интерпретатор IR  Линковка JIT кода с родительским процессом  Качественная статическая оптимизация Для трассирующих компиляторов  Трассы можно записывать в IR
  25. 25. LLVM Compile once, generate code anywhere  Компилятор производит IR на выходе  Код распространяется в виде IR  Генерация машинного кода в процессе инсталляции / загрузки  Apple XCode, NativeCL, Android ART
  26. 26. Спасибо! Алексей Рагозин alexey.ragozin@gmail.com http://blog.ragozin.info
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×