Алексей Рагозин (Deutsche Bank)
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

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

on

  • 357 views

 

Statistics

Views

Total Views
357
Views on SlideShare
342
Embed Views
15

Actions

Likes
0
Downloads
4
Comments
0

2 Embeds 15

http://ritconf.ru 12
http://www.highload.ru 3

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • 1. LLVM – не виртуальная машина Алексей Рагозин
  • 2. В докладе Генерация машинного кода  AST Vs. Byte code Vs. Machine code Архитектура компилятора LLVM как экосистема
  • 3. Генерация кода Исходный код double distance( double x1, double y1, double x2, double y2) { return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); }
  • 4. Генерация кода AST (Abstract Syntax Tree) x2 x1 x2 x1 y2 y1 y2 y1
  • 5. Генерация кода Интерпретация AST  Простота реализации  Гибкость  Не слишком эффективно
  • 6. Генерация кода Байт код (byte code)  Псевдокод, предназначенный для интерпретации  Простая система инструкций  Как правило, стековая машина
  • 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. Генерация кода Почему стековая машина?  Компактный набор инструкций  Простота интерпретации  Простота генерации кода  Обход AST в глубину
  • 9. Генерация кода Реальный CPU Vs. Стековая ВМ  Ограниченное количество регистров  Неравноценные регистры  CISC – сложные инструкции  “Векторные” инструкции SIMD – single instruction multiple data
  • 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. Генерация кода Байт код  Простой набор инструкций  Может интерпретироваться напрямую Бит код  Бинарноепредставлениеграфавыполнения  Не предназначен для интерпретации
  • 12. Архитектура компилятора Парсер Промежуточное Представление Runtime библиотека Трансформация высокоуровневых конструкций в граф исполнения Оптимизация на уровне графа Промежуточное Представление Генерация машинного кода Исключения Сборкамусора Поддержкаотладчика
  • 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. Генерация кода 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. Генерация кода LLVM IR  Блок – набор инструкций без переходов  SSA – single statement assignment  Базовый набор инструкций  “интринсики” для дополнительных инструкций  Аннотация кода мета данными
  • 16. Проблема регистров  Ограниченное число  Неравноценность регистров  Ограничение конвенции вызовов  Дорогое сохранение / восстановление регистров
  • 17. Генерация кода Data Flow Graph x2 x1 y2 y1
  • 18. Генерация кода LLVM – генерация кода  CFG – Control Flow Graph  DFG – Data Flow Graph  Распределение регистров  Упорядочивание инструкций + Эвристические оптимизации
  • 19. Генерация кода LLVM – фазы кодогенератора  Instruction selection  Scheduling and formation  SSA based optimization  Register allocation  Prolog/Epilog code  Late machine code optimization  Code emission
  • 20. Генерация кода LLVM IR – общий язык для алгоритмов оптимизации  loop unrolling  autovectorization  global variable numbering  constant folding  …
  • 21. Архитектура компилятора Парсер Промежуточное Представление Runtime библиотека Трансформация высокоуровневых конструкций в граф исполнения Оптимизация на уровне графа Промежуточное Представление Генерация машинного кода Исключения Сборкамусора Поддержкаотладчика
  • 22. Экосистема LLVM Лицензия в стиле BSD CLang – C/C++ компилятор LLVM JIT  IR интерпретатор / Интеграция с окружением (переменные и п.р.) VMKit Различныекоммерческиепроекты  XCode / MacOS OpenGL / Компиляторы Intel
  • 23. LLVM не … LLVM не реализует  Управление памятью / сборку мусора  “Динамическую” оптимизацию кода но LLVM поддерживает  Работу с картами стека (stack maps)  Маркировку GC корней  Вставку GC барьеров в IR
  • 24. LLVM и JIT  Интерпретатор IR  Линковка JIT кода с родительским процессом  Качественная статическая оптимизация Для трассирующих компиляторов  Трассы можно записывать в IR
  • 25. LLVM Compile once, generate code anywhere  Компилятор производит IR на выходе  Код распространяется в виде IR  Генерация машинного кода в процессе инсталляции / загрузки  Apple XCode, NativeCL, Android ART
  • 26. Спасибо! Алексей Рагозин alexey.ragozin@gmail.com http://blog.ragozin.info