Давайте сначала посмотрим, что означают API и ABI .
Интерфейс прикладного программирования - это набор типов, ограничений, протоколов , модули, функции, классы, признаки, методы, процедуры и т. д. c. (в зависимости от языка программирования), который предоставляется вам кем-то еще. Затем вы можете использовать эти предоставленные «вещи» для создания новых «вещей» поверх.
API всегда определяются на уровне времени компиляции, источника . Например, для C API будет определяться в терминах имен функций, типов параметров и т. Д. c. и предоставляется в виде (набора) .h
заголовочных файлов.
Двоичный интервал приложения определяет точное время выполнения в памяти расположение всех битов, составляющих API.
Вот простой пример:
- POSIX определяет API . Таким образом, он определяет, например, что
gethostid
возвращает long
. - Linux Стандартная база определяет (среди прочего) ABI для POSIX. Так, например, он определяет, что в AMD64
long
составляет 64 бита, а в x86 - 32 бита.
Другим примером являются системные вызовы в ядре Linux: системный вызов Имена являются частью API, но системный вызов Числа являются частью ABI.
Очень простой способ думать об этом, это: если API изменяется обратно несовместимым способом (например, если системный вызов переименовывается), вам необходимо внести изменения в исходный код , то есть разработчику необходимо активно вмешивается, тогда как если ABI изменяется обратно несовместимым образом, вам нужно внести изменения в двоичный код , обычно просто перекомпилировать, без каких-либо «творческое» вмешательство разработчика.
Хорошо, теперь мы знаем, что такое API и ABI и чем они отличаются… о каком API и ABI мы здесь говорим?
Хорошо, мы говорим о C расширении API / ABI YARV . Реализация YARV Ruby предоставляет программный интерфейс, с помощью которого вы можете писать расширения, которые ведут себя так, как если бы они были частью реализации. Например, большая часть реализации стандартной библиотеки Ruby в YARV записывается как расширение YARV C, а не в Ruby (например, openssl
). Многие гемы содержат расширения YARV C, либо по соображениям производительности, либо потому, что целью гема является предоставление доступа к некоторой библиотеке C.
Итак, версии API и ABI, о которых мы здесь говорим, относится к Gems с расширениями YARV C .
Пока версия ABI не меняется, вы можете обновить YARV без необходимости переустановки ваших драгоценных камней. Если версия ABI изменяется, вам необходимо переустановить ваши драгоценные камни, но вам не нужно их обновлять.
Если версия API изменяется, автору драгоценных камней необходимо адаптировать драгоценный камень к изменению. Вам нужно подождать с обновлением YARV до тех пор, пока это не произойдет, а затем обновиться до новой версии гема.