Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Архитектура компилятора Swift

558 views

Published on

Доклад с конференции nixDv 2015
Андрей Волобуев Хабаровск
Andrey Volobuev Khabarovsk
blob8129@gmail.com

Published in: Software
  • Be the first to comment

Архитектура компилятора Swift

  1. 1. Архитектура компилятора Swift Андрей Волобуев
  2. 2. Тезисы LLVM виртуальная машина, с открытым исходным кодом Классическая архитектура компиляторов Реализация трехфазной архитектуры в LLVM Bitcode формат LLVM IR промежуточное представление кода на примере Swift Вопросы
  3. 3. Что такое LLVM LLVM низкоуровневая виртуальная машина (виртуальный процессор) Проект с открытым исходным кодом Набор инструментов и библиотек, для создания компиляторов Крис Латтнер Создатель LLVM Директор по инструментам разработки в Apple 4 года работал над созданием Swift Сейчас разрабатывает Xcode
  4. 4. Классическая архитектура компиляторов Исходный код Машинный код Фронтэнд Оптимизатор Бэкэнд
  5. 5. Реализация трехфазной архитектуры в LLVM Swift фронтэнд ARM Оптимизатор АRM бэкэнд Swift
  6. 6. Реализация трефхазной архитектуры в LLVM ARM бэкэнд Swift ARM Swift фронтэнд C C фронтэнд Haskell GHC фронтэнд LLVM IR LLVM IR x86 бэкэнд x86 Общий оптимизатор LLVM IR LLVM IR
  7. 7. Bitcode формат Начиная с iOS 9 приложения загружаются в Apple Store в Bitcode формате Bitcode это сериализованный LLVM IR Это дает возможность в будущем сменить архитектуру процессора на устройствах Apple
  8. 8. Bitcode формат swiftc фронтэнд LLVM оптимизатор LLVM линкер hello.swift hello2.swift hello.o hello2.o LLVM оптимизатор
  9. 9. Промежуточное представление кода на примере Swift // add.swift func addTwoNumbers(first: UInt8, second: UInt8) -> UInt8 { return first + second } $SDK/usr/bin/swiftc -emit-ir add.swift define hidden i8 @_TF3add13addTwoNumbersFTVSs5UInt86secondS0__S0_(i8, i8) #0 { entry: %2 = call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 %0, i8 %1) %3 = extractvalue { i8, i1 } %2, 0 %4 = extractvalue { i8, i1 } %2, 1 br i1 %4, label %6, label %5 ; <label>:5 ; preds = %entry ret i8 %3 ; <label>:6 ; preds = %entry call void @llvm.trap() unreachable } 2. 1. 3.
  10. 10. ВОПРОСЫ?
  11. 11. Бонусный слайд Почему ?

×