Что означают версии API и ABI для Ruby? - PullRequest
0 голосов
/ 24 марта 2020

Мне попался комментарий в " Неправильная ruby версия при указании целевого пути (--path) # 5424 ", который я не понял:

Я полагаю, так как версии API и ABI 2.3.0, вот почему это используется для каталога? Таким же образом rubygems устанавливает вещи для 1.9.3 в каталог с именем 1.9.1. Если это не вызывает проблем для вашей установки, я думаю, что это может быть скорее любопытством, чем ошибкой

Для контекста, версия Ruby, которая обсуждалась в этом выпуске, была 2.3.1. Таким образом, очевидно, что «версии API и ABI» для Ruby 2.3.1 являются 2.3.0. Я могу принять это, но я не понимаю, что именно может означать версия API или версия ABI.

Что означают эти термины?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

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

0 голосов
/ 25 марта 2020

Впервые я услышал об ABI и API в Ruby из "Ruby изменений политики версий, начиная с Ruby 2.1.0 ".

Совместимость API The Следующие черты могут быть помечены как несовместимые изменения, требующие увеличения версии MINOR:

Удаление C -уровневых функций API Обратно несовместимые изменения или дополнения

Совместимость ABI ABI будет соответствовать следующая схема: {MAJOR}. {MINOR} .0

Мы приложим все усилия, чтобы обеспечить совместимость ABI в тех же выпусках уровня MINOR, поэтому для TEENY будет установлено значение 0.

Насколько я понимаю, API - это то, что используют Ruby пользователи, что является высоким уровнем, а ABI - то, что используют Ruby разработчики, которые являются низкоуровневыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...