Архитектура компилятора Swift — что там внутри?

Архитектура компилятора Swift — что там внутри?

 Victor

В целом, компилятор Swift в основном отвечает за трансляцию исходного кода Swift в эффективный исполняемый машинный код. Однако внешний интерфейс компилятора Swift также поддерживает ряд других инструментов, включая интеграцию с IDE с подсветкой синтаксиса, код-комплитом и другими удобствами. 


Ниже приведу высокоуровневое описание основных компонентов компилятора Swift:


Парсинг (синтаксический анализ)

Парсер - это простой парсер с рекурсивным углублением (реализованный в lib/Parse) с интегрированным лексером, написанным вручную. Парсер отвечает за генерацию абстрактного синтаксического дерева (AST) без какой-либо семантической или типовой информации и выдает предупреждения или ошибки в случае грамматических проблем с входным источником.


Семантический анализ 

Семантический анализ (реализованный в lib/Sema) отвечает за получение разобранного AST и преобразование его в хорошо сформированную, полностью проверенную по типам форму AST, выдавая предупреждения или ошибки о семантических проблемах в исходном коде. 


Семантический анализ включает в себя вывод типов и, в случае успеха, указывает, что можно безопасно генерировать код на основе полученного AST с проверкой типов.


Импортер Clang

Импортер Clang (реализован в lib/ClangImporter) импортирует модули Clang и отображает экспортируемые ими API C или Objective-C в соответствующие API Swift. Полученные импортированные AST могут быть использованы для семантического анализа.


Генерация SIL (Swift Intermediate Language)

SIL — это высокоуровневый, специфический для Swift промежуточный язык, подходящий для дальнейшего анализа и оптимизации Swift-кода. Фаза генерации SIL (реализованная в lib/SILGen) понижает уровень проверенного по типу AST до так называемого "сырого" SIL. Проектирование SIL описано в docs/SIL.rst.


SIL-гарантированные преобразования

SIL-гарантированные преобразования (реализованы в lib/SILOptimizer/Mandatory) выполняют дополнительную диагностику потока данных, которая влияет на корректность программы (например, неинициализированные переменные). Конечным результатом этих преобразований является "канонический" SIL.


Оптимизации SIL

Оптимизации SIL (реализованные в lib/Analysis, lib/ARC, lib/LoopTransforms и lib/Transforms) выполняют дополнительные высокоуровневые, специфические для Swift оптимизации программы, включая (например) оптимизацию автоматического подсчета ссылок, девиртуализацию и общую специализацию.


Генерация LLVM IR

LLVM — это не акроним, это название проекта

IR — intermediate representation (промежуточное представление)


Генерация IR (реализована в lib/IRGen) переводит, а фактически, понижает SIL до уровня LLVM IR, после чего LLVM может продолжить оптимизацию и генерировать машинный код.


А про разработку можно прочитать в моём авторском канале.


Report Page