Версионирование 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 3SONAME для динамических библиотек
В 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 — локальная установка не требуется.
Все уроки этого курса
- Библиотеки только из заголовков и скомпилированные библиотеки
- Версионирование API и стабильность ABI
- Сокрытие реализации с помощью PIMPL
- Создание современной библиотеки утилит только из заголовков