ABI ( двоичный интерфейс приложения ) - это стандарт, который определяет соответствие между концепциями низкого уровня в языках высокого уровня и возможностями компьютера конкретной платформы аппаратного обеспечения / ОС. код. Это включает в себя такие вещи, как:
- как C / C ++ / Fortran / ... типы данных располагаются в памяти (размеры данных / выравнивания)
- как работают вложенные вызовы функций (где и как хранится информация о том, как вернуться к вызывающей функции, где в регистры ЦП и / или в аргументы функции памяти передаются)
- как запуск / инициализация программы (какой формат данных имеет "исполняемый файл", как оттуда загружается код / данные, как работают DLL ...)
Ответы на эти вопросы:
- для конкретного языка (следовательно, у вас есть C ABI, C ++ ABI, Fortran ABI, Pascal ABI, ... даже спецификация Java-байт-кода, хотя нацеленность на «виртуальный» процессор вместо реального аппаратное обеспечение, является ABI),
- для конкретной операционной системы (MS Windows и Linux на одном оборудовании используют разные ABI),
- для оборудования / процессора (ABI ARM и x86 различаются).
- эволюционирование в течение (длительного) времени (существующие ABI часто обновлялись / обновлялись, чтобы можно было использовать новые функции ЦП, например, указывать, как должны быть регистры SSE x86) использование приложениями, конечно, было возможно только после того, как процессоры имели этих правил, поэтому необходимо уточнить существующие ABI).
Без такой стандартизации (машинный) код, созданный разными компиляторами, не мог бы использовать библиотеки одного и того же типа (как бы вы узнали, каким образом код библиотеки ожидает передачи аргументов функции или структур данных?).
Каждая платформа (комбинация конкретного аппаратного обеспечения, программного обеспечения операционной системы и кода, написанного на определенных языках программирования / скомпилированная с определенными компиляторами) определяет целый набор ABI , чтобы сделать вещи совместимыми , Терминология в этой области не ясна, иногда люди просто говорят о «ABI», иногда это называется «дополнением к платформе», или кто-то упоминает язык программирования и говорит, например, "C ++ ABI". Имейте в виду, такой вещи не существует.
Все документы, на которые вы ссылались в своем вопросе, являются конкретными примерами этого (ABI для языка / операционной системы / оборудования).
Даже на конкретной платформе нет необходимости иметь один и только один ABI (набор), потому что разные такие соглашения могут иметь разные преимущества (и, следовательно, обеспечивать лучшую производительность / меньший код / лучшее использование памяти /) ... - в зависимости от программы) и разработчики системы обычно стараются быть гибкими / допустимыми.
Например, в 32-битной Microsoft Windows существует множество ABI (fastcall, stdcall, pascal, ...) для частей соглашения о вызове функций.
В любом случае, общий поиск в стеке потока для «ABI» (включая ссылки под боковой панелью «Связанные») дает так много поводов для исследования этого вопроса, что я закрываю свой ответ на этом этапе.