Компиляция
Суть
Компиляция — перевод исходного кода на языке высокого уровня в машинный код целевого процессора до запуска (ahead-of-time). Для iOS это единственный путь: сторонним приложениям запрещено генерировать код в рантайме (JIT), поэтому Swift и Objective-C компилируются полностью.
Конвейер swiftc
- Parse — текст → AST (синтаксическое дерево). Здесь ловятся ошибки синтаксиса.
- Sema — проверка и вывод типов, разрешение перегрузок. Самая дорогая стадия: длинные выражения с литералами могут собираться секунды.
- SILGen → SIL — Swift Intermediate Language: сюда встроены проверки инициализации,
retain/releaseдля ARC, проверка эксклюзивного доступа, оптимизации уровня Swift (devirtualization, специализация generics, inlining). - IRGen → LLVM IR — машинно-независимое представление; LLVM оптимизирует и генерирует код под arm64 (устройство) или arm64/x86_64 (симулятор).
- Linker (
ld) — объектные файлы и библиотеки объединяются в исполняемый файл; динамические фреймворки подгружаютсяdyldпри запуске.
swiftc -emit-sil main.swift # посмотреть SIL
swiftc -emit-ir main.swift # LLVM IR
swiftc -O -wmo main.swift # оптимизация, модуль целиком
Что из этого спрашивают на практике
- Debug vs Release:
-Onone(быстрая сборка, точная отладка) против-O/-Osize;-wmo(whole-module optimization) даёт компилятору видеть весь модуль и убирать динамическую диспетчеризацию. finalиprivateпомогают компилятору: он знает, что метод не переопределят, и вызывает его напрямую.- Инкрементальная сборка и модуляризация (SPM-пакеты) — главный способ сократить время сборки.
- Bitcode для iOS больше не принимается (с Xcode 14); App Thinning и Mach-O-бинарники под arm64 — то, что реально уходит в App Store.
- Компилятор также проверяет Swift 6 strict concurrency: гонки данных становятся ошибками компиляции, а не крэшами в проде.
На что смотрит интервьюер
Понимаете ли вы, что проверка типов, ARC и concurrency-проверки — это работа компилятора, а не рантайма, и как настройки сборки (-O, -wmo, final) влияют на производительность приложения.