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



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



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




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




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




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




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



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

804   7  

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

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

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

(Application Binary Яnterface) спецификация для конкретной аппаратной платформы в сочетании с операционной системой. Это один шаг за пределы API (Application 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.

Comments

    Ничего не найдено.