0Pricing
C++ Academy · Урок

Версионирование API и стабильность ABI

Планируйте семантическое версионирование и обеспечивайте стабильность ABI между выпусками.

«Версионирование API и стабильность ABI» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Два вида совместимости

Есть два аспекта совместимости:

  • Совместимость API — исходный код, компилирующийся с версией N, также компилируется с версией N+1
  • Совместимость ABI — двоичные файлы, скомпилированные с версией N, работают с версией N+1 без перекомпиляции

Почему важен ABI

Совместимость ABI позволяет обновлять динамические библиотеки без перекомпиляции зависимых компонентов. Это особенно важно для дистрибутивов, подключаемых модулей и приложений с длительным сроком эксплуатации.

Что нарушает ABI

Многие изменения, которые выглядят безобидными, нарушают ABI:

  • Добавление, удаление или изменение порядка полей данных
  • Добавление или удаление виртуальных функций
  • Изменение наследования
  • Изменение параметров шаблонов
  • Изменения встроенных функций (иногда)

Семантическое версионирование (SemVer)

Передавайте информацию о совместимости через номера версий MAJOR.MINOR.PATCH:

  • MAJOR — несовместимые изменения
  • MINOR — новые возможности с обратной совместимостью
  • PATCH — исправления

Версионирование в заголовках

Предоставляйте макросы версий в заголовках.

#define MYLIB_VERSION_MAJOR 2
#define MYLIB_VERSION_MINOR 1
#define MYLIB_VERSION_PATCH 3

SONAME для динамических библиотек

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

# libmylib.so.2 -> libmylib.so.2.1.3
# SONAME = libmylib.so.2

Сокрытие деталей реализации

Для стабильного ABI необходимо держать реализацию вне заголовков. Используйте PIMPL (в следующем уроке), чтобы добавлять или удалять закрытые члены без влияния на потребителей.

ABI компилятора

ABI C++ различается у разных компиляторов (GCC и MSVC используют разное искажение имён и разное размещение классов). Распространяйте двоичные файлы, собранные конкретными компиляторами, либо придерживайтесь интерфейсов extern "C".

ABI стандартной библиотеки

Стандартная библиотека также может нарушать ABI, хотя у libstdc++ и libc++ есть соответствующие правила. Если нужна совместимость между версиями, избегайте типов стандартной библиотеки в стабильном общедоступном API.

Совместимое добавление возможностей

Безопасные добавления:

  • Новые свободные функции
  • Новые классы
  • Новые невиртуальные функции-члены (с осторожностью)

Небезопасно: изменять классы, экземпляры которых потребители размещают в стеке или код которых уже скомпилирован в потребителях.

Инструменты проверки ABI

Инструменты для сравнения двух сборок:

  • abidiff — сравнивает ABI
  • abicompliance-checker — создаёт отчёты

Долгосрочная стратегия

Заранее проектируйте систему с расчётом на стабильность: небольшой общедоступный API, непрозрачные типы, осторожное использование шаблонов и наследования. После выпуска нарушение ABI обходится дорого — планируйте повышение основной версии и ясно сообщайте о нём.

Быстрая проверка

Какое изменение класса C++ с наибольшей вероятностью нарушит ABI?

Итоги

Совместимость API означает совместимость исходного кода, а совместимость ABI — совместимость двоичных файлов. ABI хрупок: добавление членов, виртуальных функций или изменение наследования нарушает его. Используйте SemVer, скрывайте реализацию с помощью PIMPL, устанавливайте несколько основных версий параллельно и запускайте средства проверки ABI.

Часто задаваемые вопросы

Урок «Версионирование API и стабильность ABI» бесплатный?

Да — полный текст урока «Версионирование API и стабильность ABI» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Версионирование API и стабильность ABI»?

Планируйте семантическое версионирование и обеспечивайте стабильность ABI между выпусками. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Версионирование API и стабильность ABI»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Библиотеки только из заголовков и скомпилированные библиотеки
  2. Версионирование API и стабильность ABI
  3. Сокрытие реализации с помощью PIMPL
  4. Создание современной библиотеки утилит только из заголовков
← Назад к C++ Academy