Откуда приходит SWIFT ABI? - PullRequest
       43

Откуда приходит SWIFT ABI?

3 голосов
/ 18 апреля 2019

Заголовок может быть недостаточным для обзора контекста вопроса. Итак, вот описание:

Процесс компиляции SWIFT Компилятор Swift выполняет следующие шаги для компиляции файла Swift

Swift compilation steps

Согласно Apple ,

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

Запрос номер 1 - Все мы знаем, что компилятор превращает наш исходный код в язык ассемблера и ассемблер (в основном встроенный в ОС, по крайней мере компилятор Swift не имеет ассемблера в это) преобразует это в машинный код. Таким образом, согласно приведенному выше утверждению, LLVM в компиляторе заменяет LLVM IR на машинный код. Так что, если это так, то ассемблер не будет играть никакой роли в программе и исполнении Swift?

Запрос № 2 - LLVM в Swift изменяет LLVM IR непосредственно на машинный код. Это означает, что мой скомпилированный исполняемый файл имеет машинный код, а не ассемблерный код. И, насколько я понимаю, машинный код не нуждается в каком-либо конкретном соглашении о вызовах, как в языке ассемблера, и ABI - это все о соглашениях о вызовах, представлениях разметки памяти и т. Д., Посредством которых определяется связь между двумя двоичными файлами. Так откуда же взялся ABI, потому что двоичный исполняемый файл уже имеет машинный код?

Так что, я чего-то упускаю или Apple сохранила это довольно абстрактно?

1 Ответ

2 голосов
/ 18 апреля 2019

Есть хорошее описание роли ABI в Манифесте стабильности ABI .

Таким образом, ABI - это уровень связи между скомпилированными прикладными модулями во время компоновки и выполнения. Например, приложение и скомпилированная статическая библиотека. Или приложение и стандартная библиотека (Swift runtime).

ABI отвечает на такие вопросы, как:

  • как хранится функция? как хранится имя? как хранятся его параметры? Как хранятся значения параметров по умолчанию? как хранятся атрибуты (например, доступность), как хранятся дженерики? Где вы найдете машинные инструкции для функции?

  • как поместить параметры в вызывающий стек перед началом выполнения машинных инструкций функции (то есть, как передать параметры и self в функцию?). Вот что такое соглашение о вызовах .

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

Сборка не играет роли в стабильности ABI. Сборка - это еще один низкоуровневый язык программирования, который не используется в Swift.

...