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

Like this? Share it with your network

Share

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

  • 424 views
Uploaded on

 

More in: Internet
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
424
On Slideshare
406
From Embeds
18
Number of Embeds
3

Actions

Shares
Downloads
5
Comments
0
Likes
0

Embeds 18

http://ritconf.ru 12
http://www.highload.ru 5
http://2012.highload.ru 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

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