Разница между API и ABI

Я новичок в системном программировании linux, и я столкнулся с API и ABI во время чтения Системное Программирование Linux.

определение API:

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

определение ABI:

тогда как API определяет источник интерфейс, ABI определяет низкоуровневый двоичный интерфейс между двумя или больше частей программного обеспечения на особая архитектура. Это определяет как приложение взаимодействует с сам по себе, как приложение взаимодействует с ядром, и как приложение взаимодействует с библиотеками.

Как программа может общаться на исходном уровне ? Что такое исходный уровень ? Это связано с исходным кодом в любом случае? Или источник библиотеки попадает в основную программу ?

единственная разница, которую я знаю is API в основном используется программистами, а ABI в основном используется компилятором.

7 ответов


API-это то, что люди используют. Мы пишем исходный код. Когда мы пишем программу и хотим использовать некоторую библиотечную функцию, мы пишем код, например:

 long howManyDecibels = 123L;
 int ok = livenMyHills( howManyDecibels);

и нам нужно было знать, что есть метод livenMyHills(), который принимает длинный целочисленный параметр. Таким образом, как программный интерфейс, все это выражается в исходном коде. Компилятор превращает это в исполняемые инструкции, которые соответствуют реализации этого языка в этой конкретной операционной системе. И в этом случае результат в некоторые низкоуровневые операции на Аудиоблоке. Таким образом, определенные биты и байты разбрызгиваются на некотором оборудовании. Таким образом, во время выполнения происходит много действий двоичного уровня, которые мы обычно не видим.


API: интерфейс прикладной программы

это набор открытых типов / переменных / функций, которые вы предоставляете из своего приложения / библиотеки.

В C / C++ это то, что вы предоставляете в файлах заголовков, которые вы отправляете с приложением.

ABI: двоичный интерфейс приложения

так компилятор создает приложение.
Он определяет вещи (но не ограничивается):

  • как параметры передаются функции (регистры/стек).
  • кто убирает параметры из стека (вызывающий/вызываемый).
  • где возвращаемое значение помещается на возврат.
  • как распространяются исключения.

Я в основном сталкиваюсь с этими терминами В смысле API-несовместимого изменения или ABI-несовместимого изменения.

изменение API-это, по сути, код, который был бы скомпилирован с предыдущей версией, больше не будет работать. Это может произойти из-за добавления аргумента в функцию или изменения имени чего-либо, доступного за пределами локального кода. Каждый раз, когда вы меняете заголовок, он заставляет вас изменить что-то в a .с./cpp файл, вы сделали API-изменение.

изменение ABI - это когда код, который уже был скомпилирован против версии 1, больше не будет работать с версией 2 кодовой базы (обычно библиотеки). Это, как правило, сложнее отслеживать, чем API-несовместимые изменения, так как что-то простое, как добавление виртуального метода в класс, может быть ABI несовместимым.

Я нашел два чрезвычайно полезных ресурса для выяснения того, что такое совместимость ABI и как сохранить это:


Это мои объяснения обывателя:

  • api-think include файлы. они обеспечивают интерфейс программирования
  • модуль ядра abi - think. когда вы запускаете его на каком-то ядре, они должны договориться о том, как общаться без файлов include, т. е. как низкоуровневый двоичный интерфейс

позвольте мне привести конкретный пример того, как ABI и API отличаются в Java.

несовместимое изменение ABI-это если я изменяю метод A#m () от принятия String в качестве аргумента


(наpplication Binary Яnterface) спецификация для конкретной аппаратной платформы в сочетании с операционной системой. Это один шаг за пределы API (наpplication Pпрограмма Яnterface), который определяет вызовы из приложения в операционную систему. ABI определяет API плюс машинный язык для определенного семейства ЦП. API не обеспечивает совместимость во время выполнения, но ABI делает, поскольку он определяет формат машинного языка или среды выполнения.

enter image description here

вежливость


ваша программа (исходный код) может быть скомпилирована с модулями, которые обеспечивают правильное API.

программы (двоичные) может работать на платформах, которые обеспечивают надлежащее ABI.

API ограничивает определения типов, определения функций, макросы, иногда глобальные переменные, которые должна предоставлять библиотека.

ABI ограничивает то, что" платформа " должна предоставить вам программу для запуска. Мне нравится рассматривать его в 3 уровни:

  • уровень процессора-набор инструкций, вызывающее соглашение

  • уровень ядра-соглашение о системном вызове, соглашение о специальном пути к файлу (например,/proc и /sys файлы в Linux) и т. д.

  • уровень ОС-формат объекта, библиотеки времени выполнения и т. д.

рассмотрим кросс-компилятор с именем arm-linux-gnueabi-gcc. "arm" указывает на архитектуру процессора, " linux" указывает ядро, " gnu " указывает, что его целевые программы используют libc GNU в качестве библиотеки времени выполнения, отличной от arm-linux-androideabi-gcc которые используют реализацию libc Android.