Архитектура компилятора 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 может продолжить оптимизацию и генерировать машинный код.
А про разработку можно прочитать в моём авторском канале.
