SlideShare a Scribd company logo
1 of 25
Download to read offline
Мир LLVM
Вадим Евард, 445 группа
       01.02.13
Сегодняшний доклад
●   Что есть LLVM;
●   LLVM IR;
●   Оптимизация;
●   Кодогенерация;
●   Сопутствующие проекты;
●   Clang.
Определения
● универсальная система анализа,
  трансформации и оптимизации программ;
● compiler infrastructure designed for compile-
  time, link-time, run-time, and "idle-time"
  optimization of programs written in arbitrary
  programming languages;
● an umbrella project that hosts and develops
  a set of close-knit, low-level toolchain
  components (assemblers, compilers,
  debuggers, etc.)
Основные идеи
● Чёткие интерфейсы;
● Реализация в виде переиспользуемых
  библиотек;
● Универсальное промежуточное
  представление (IR).
Архитектура компилятора
Примеры проблем GCC
● Back end обходит AST для создания
  генерации отладочной информации;
● Формирование front end'ом структур
  данных back end'а;
● Использование глобальных переменных;
● Магические макросы;
● Трудности с выводом промежуточных
  результатов.
История
● 2000 - запуск исследовательского проекта
  в University of Illinois;
● 2003 - Открыт LLVM 1.0;
● 2007 - Открыт Clang frontend;
● 2008 - LLVM GCC 4.2 в составе Apple
  Xcode;
● 2009 - Clang 1.0, LLVM 2.6, сборка ядер
  BSD-систем, полноценная поддержка
  C++, ObjC;
● 2010-2012 - сборка Linux, 91% пакетов
  Debian, основной компилятор FreeBSD.
Intermediate Representation: идея
● Предназначен для промежуточного
  анализа и оптимизирующих
  преобразований;
● Тщательно специфицирован;
● Полное и единственное представление
  кода для оптимизатора и кодогенератора.
Intermediate Representation: детали
● RISC-подобный набор инструкций;
● Строгая типизация;
● Бесконечный набор временных
  переменных;
● Абстрагирование архитектурных
  особенностей (например, соглашения о
  вызовах).
Intermediate Representation:
пример
define i32 @add1(i32 %a, i32 %b) {
entry:
  %tmp1 = add i32 %a, %b
  ret i32 %tmp1
}

define i32 @add2<i32 %a, i32 %b) {
entry:
 %tmp1 = icmp eq i32 %a, 0
 br i1 %tmp1, label %done, label %recurse

recurse:
 %tmp2 = sub i32 %a, 1
 %tmp3 = add i32 %b, 1
 %tmp4 = call i32 @add2(i32 %tmp2, i32 %tmp3)
 ret i32 %tmp4

done:
  ret i32 %b
}
Тот же код на Си
unsigned add1(unsigned a, unsigned b) {
  return a+b;
}

unsigned add2(unsigned a, unsigned b) {
  if (a == 0) return b;
  return add2(a-1, b+1);
}
Intermediate Representation:
формы
● Текст (program.ll);
● Рабочее представление (в оперативной
  памяти, обрабатывается оптимизатором);
● Компактное представление для
  сохранения на диск (биткод, program.bc).

.ll <-> .bc: llvm-as, llvm-dis.
Оптимизирующий проход
● Сопоставление с образцом;
● Проверка корректности;
● Замена кода на преобразованный.
// X - 0 -> X
if (match(Op1, m_Zero()))
  return Op0;

// X - X -> 0
if (Op0 == Op1)
  return Constant::getNullValue(Op0->getType());

// (X*2) - X -> X
if (match(Op0, m_Mul(m_Specific(Op1), m_ConstantInt<2>())))
  return Op1;

…

return 0; // Nothing matched, return null to indicate no transformation.
Снова архитектура
Оптимизатор составляется из
отдельных проходов
Кодогенерация для разных
платформ
Снова максимальное переиспользование
кода:
● Выбор инструкций;
● Выделение регистров;
● Упорядочение инструкций;
● Генерация машинного кода.
Декларативное описание целевых
платформ
Ъ Unix Way
● Не монолитный, переиспользуемый код:
  программы и библиотеки выполняют свою
  задачу и взаимодействуют друг с другом;
● Инструмент, а не политика.
Link (and Install) Time Optimization
Подпроекты LLVM
●   LLVM Core;
●   Clang aka LLVM Native;
●   Dragonegg (замена LLVM-GCC);
●   LLDB (отладчик);
●   libc++;
●   vmkit (Java- и .NET-машины);
●   libclc -реализация OpenCL;
●   klee - символьная виртуальная машина;
●   SAFECode - безопасная работа с памятью
    без сборщика мусора.
Clang: цели
● Лёгкость разработки и поддержки;
● Либеральная лицензия;
● Интеграция с IDE;
● Подробные сообщения об ошибках;
● Быстрая, требующая мало памяти
  компиляция;
● Поддержка стандартов C, ObjC, C++ и
  языковых расширений GCC;
● ...
Заявленные преимущества перед
GCC
● Современная, понятная архитектура и
  реализация;
● Предоставление API, простота
  переиспользования;
● Сериализация AST;
● Скорость, малое потребление памяти;
● Лучшая поддержка C++;
● ...
Производительность Clang
Родственные проекты
●   Emscripten - компилятор IR в JavaScript;
●   qt.js aka Emscripten-qt;
●   S2E - selective symbolic execution;
●   MAO - дизассемблер из x86 в IR;
●   llvmpipe - реализация OpenGL;
●   cling - интерпретатор C++;
●   qling - cling с поддержкой Qt;
●   Компиляторы.
Спасибо за внимание!
http://www.drdobbs.com/architecture-and-
   design/the-design-of-llvm/240001128

More Related Content

What's hot

C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не оченьcorehard_by
 
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...Омские ИТ-субботники
 
XP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architectureXP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architectureAnton Katkov
 

What's hot (6)

C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не очень
 
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
 
Enter: code style
Enter: code styleEnter: code style
Enter: code style
 
лаб 6 7
лаб 6 7лаб 6 7
лаб 6 7
 
XP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architectureXP.Party (iOS) - testable code & architecture
XP.Party (iOS) - testable code & architecture
 
Enter: legacy code
Enter: legacy codeEnter: legacy code
Enter: legacy code
 

Similar to доклад про Llvm

SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...e-Legion
 
20100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture0620100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture06Computer Science Club
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2Technopark
 
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторыОмские ИТ-субботники
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
 
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...DrupalCamp MSK
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs..."How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...Provectus
 
Robot Framework: универсальный инструмент автоматизатора
Robot Framework: универсальный инструмент автоматизатораRobot Framework: универсальный инструмент автоматизатора
Robot Framework: универсальный инструмент автоматизатораSQALab
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовКирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовOlesya_V
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняLuxoftTraining
 
RDSDataSource: Основы LLVM
RDSDataSource: Основы LLVMRDSDataSource: Основы LLVM
RDSDataSource: Основы LLVMRAMBLER&Co
 
[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)Alexander Bausk
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Yandex
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Yandex
 

Similar to доклад про Llvm (20)

SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
 
20100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture0620100314 virtualization igotti_lecture06
20100314 virtualization igotti_lecture06
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
 
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
Continuous integration сайтов на Drupal: Jenkins, Bitbucket, Features, Drush ...
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
Conflux: GPGPU .NET
Conflux: GPGPU .NETConflux: GPGPU .NET
Conflux: GPGPU .NET
 
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs..."How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
 
Breaking logs
Breaking logsBreaking logs
Breaking logs
 
New Android NDK & JNI
New Android NDK & JNINew Android NDK & JNI
New Android NDK & JNI
 
Robot Framework: универсальный инструмент автоматизатора
Robot Framework: универсальный инструмент автоматизатораRobot Framework: универсальный инструмент автоматизатора
Robot Framework: универсальный инструмент автоматизатора
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектовКирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектов
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровня
 
RDSDataSource: Основы LLVM
RDSDataSource: Основы LLVMRDSDataSource: Основы LLVM
RDSDataSource: Основы LLVM
 
[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 

доклад про Llvm

  • 1. Мир LLVM Вадим Евард, 445 группа 01.02.13
  • 2. Сегодняшний доклад ● Что есть LLVM; ● LLVM IR; ● Оптимизация; ● Кодогенерация; ● Сопутствующие проекты; ● Clang.
  • 3. Определения ● универсальная система анализа, трансформации и оптимизации программ; ● compiler infrastructure designed for compile- time, link-time, run-time, and "idle-time" optimization of programs written in arbitrary programming languages; ● an umbrella project that hosts and develops a set of close-knit, low-level toolchain components (assemblers, compilers, debuggers, etc.)
  • 4. Основные идеи ● Чёткие интерфейсы; ● Реализация в виде переиспользуемых библиотек; ● Универсальное промежуточное представление (IR).
  • 6. Примеры проблем GCC ● Back end обходит AST для создания генерации отладочной информации; ● Формирование front end'ом структур данных back end'а; ● Использование глобальных переменных; ● Магические макросы; ● Трудности с выводом промежуточных результатов.
  • 7. История ● 2000 - запуск исследовательского проекта в University of Illinois; ● 2003 - Открыт LLVM 1.0; ● 2007 - Открыт Clang frontend; ● 2008 - LLVM GCC 4.2 в составе Apple Xcode; ● 2009 - Clang 1.0, LLVM 2.6, сборка ядер BSD-систем, полноценная поддержка C++, ObjC; ● 2010-2012 - сборка Linux, 91% пакетов Debian, основной компилятор FreeBSD.
  • 8. Intermediate Representation: идея ● Предназначен для промежуточного анализа и оптимизирующих преобразований; ● Тщательно специфицирован; ● Полное и единственное представление кода для оптимизатора и кодогенератора.
  • 9. Intermediate Representation: детали ● RISC-подобный набор инструкций; ● Строгая типизация; ● Бесконечный набор временных переменных; ● Абстрагирование архитектурных особенностей (например, соглашения о вызовах).
  • 10. Intermediate Representation: пример define i32 @add1(i32 %a, i32 %b) { entry: %tmp1 = add i32 %a, %b ret i32 %tmp1 } define i32 @add2<i32 %a, i32 %b) { entry: %tmp1 = icmp eq i32 %a, 0 br i1 %tmp1, label %done, label %recurse recurse: %tmp2 = sub i32 %a, 1 %tmp3 = add i32 %b, 1 %tmp4 = call i32 @add2(i32 %tmp2, i32 %tmp3) ret i32 %tmp4 done: ret i32 %b }
  • 11. Тот же код на Си unsigned add1(unsigned a, unsigned b) { return a+b; } unsigned add2(unsigned a, unsigned b) { if (a == 0) return b; return add2(a-1, b+1); }
  • 12. Intermediate Representation: формы ● Текст (program.ll); ● Рабочее представление (в оперативной памяти, обрабатывается оптимизатором); ● Компактное представление для сохранения на диск (биткод, program.bc). .ll <-> .bc: llvm-as, llvm-dis.
  • 13. Оптимизирующий проход ● Сопоставление с образцом; ● Проверка корректности; ● Замена кода на преобразованный. // X - 0 -> X if (match(Op1, m_Zero())) return Op0; // X - X -> 0 if (Op0 == Op1) return Constant::getNullValue(Op0->getType()); // (X*2) - X -> X if (match(Op0, m_Mul(m_Specific(Op1), m_ConstantInt<2>()))) return Op1; … return 0; // Nothing matched, return null to indicate no transformation.
  • 16. Кодогенерация для разных платформ Снова максимальное переиспользование кода: ● Выбор инструкций; ● Выделение регистров; ● Упорядочение инструкций; ● Генерация машинного кода.
  • 18. Ъ Unix Way ● Не монолитный, переиспользуемый код: программы и библиотеки выполняют свою задачу и взаимодействуют друг с другом; ● Инструмент, а не политика.
  • 19. Link (and Install) Time Optimization
  • 20. Подпроекты LLVM ● LLVM Core; ● Clang aka LLVM Native; ● Dragonegg (замена LLVM-GCC); ● LLDB (отладчик); ● libc++; ● vmkit (Java- и .NET-машины); ● libclc -реализация OpenCL; ● klee - символьная виртуальная машина; ● SAFECode - безопасная работа с памятью без сборщика мусора.
  • 21. Clang: цели ● Лёгкость разработки и поддержки; ● Либеральная лицензия; ● Интеграция с IDE; ● Подробные сообщения об ошибках; ● Быстрая, требующая мало памяти компиляция; ● Поддержка стандартов C, ObjC, C++ и языковых расширений GCC; ● ...
  • 22. Заявленные преимущества перед GCC ● Современная, понятная архитектура и реализация; ● Предоставление API, простота переиспользования; ● Сериализация AST; ● Скорость, малое потребление памяти; ● Лучшая поддержка C++; ● ...
  • 24. Родственные проекты ● Emscripten - компилятор IR в JavaScript; ● qt.js aka Emscripten-qt; ● S2E - selective symbolic execution; ● MAO - дизассемблер из x86 в IR; ● llvmpipe - реализация OpenGL; ● cling - интерпретатор C++; ● qling - cling с поддержкой Qt; ● Компиляторы.