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

128

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

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

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

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

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

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

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

  • 1
    под уровнем источника они подразумевают что-то вроде включаемого файла, чтобы выставить определения функций
  • 1
    Также см. Stackoverflow.com/q/2171177/632951
Теги:
abi

7 ответов

32
Лучший ответ

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

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

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

204

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

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

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

ABI: Application Binary Interface

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

  • Как параметры передаются в функции (регистры/стек).
  • Кто очищает параметры из стека (вызывающий/вызываемый).
  • Если для возврата возвращается возвращаемое значение.
  • Как распространяются исключения.
  • 13
    Это, вероятно, лучшее краткое объяснение того, что такое ABI, которое я когда-либо видел; GJ!
  • 3
    Вы, ребята, должны решить, является ли этот ответ кратким или подробным. :)
Показать ещё 5 комментариев
32

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

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

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

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

  • 4
    +1 за указание на их взаимную исключительность. Например, введение Java ключевого слова assert является несовместимым с API, но совместимым с ABI изменением docs.oracle.com/javase/7/docs/technotes/guides/language/… .
15

это объяснения моего непрофессионала:

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

( A pplication B inary I nterface) Спецификация конкретной аппаратной платформы в сочетании с операционной системой. Это один шаг за пределы API ( A pplication P rogram I nterface), который определяет вызовы из приложения в операционную систему. ABI определяет API плюс машинный язык для конкретного семейства процессоров. API не обеспечивает совместимость во время выполнения, но ABI делает это, потому что он определяет формат машины или формат времени исполнения.

Изображение 7879

Предоставлено

1

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

Несовместимое изменение ABI заключается в том, что я изменяю метод A # m() от принятия a String в качестве аргумента аргументу String.... Это не совместимо с ABI, потому что вам нужно перекомпилировать код, который его вызывает, но он совместим с API, так как вы можете его решить, перекомпилировав без каких-либо изменений кода в вызывающем абоненте.

Вот пример, изложенный. У меня есть Java-библиотека с классом A

// Version 1.0.0
public class A {
    public void m(String string) {
        System.out.println(string);
    }
}

И у меня есть класс, который использует эту библиотеку

public class Main {
    public static void main(String[] args) {
        (new A()).m("string");
    }
}

Теперь автор библиотеки скомпилировал свой класс A, я скомпилировал свой класс Main, и все это хорошо работает. Представьте, что появилась новая версия A

// Version 2.0.0
public class A {
    public void m(String... string) {
        System.out.println(string[0]);
    }
}

Если я просто возьму новый скомпилированный класс A и вытащу его вместе с ранее скомпилированным классом Main, я получаю исключение при попытке вызвать метод

Exception in thread "main" java.lang.NoSuchMethodError: A.m(Ljava/lang/String;)V
        at Main.main(Main.java:5)

Если я перекомпиляю Main, это исправлено и все снова работает.

0

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

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

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

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

  • уровень процессора - набор команд, соглашение о вызове

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

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

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

  • 1
    Это очень краткое объяснение различия между ними, и в очень уникальной перспективе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню