Wersjonowanie API i stabilność ABI
Planuj wersjonowanie semantyczne i chroń stabilność ABI między wydaniami
Wersjonowanie API i stabilność ABI to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Dwa rodzaje zgodności
Należy uwzględnić dwa rodzaje zgodności:
- zgodność API — kod źródłowy, który kompiluje się z wersją N, kompiluje się również z wersją N+1
- zgodność ABI — pliki binarne skompilowane z wersją N działają z wersją N+1 bez ponownej kompilacji
Dlaczego ABI ma znaczenie
Zgodność ABI pozwala aktualizować biblioteki współdzielone bez ponownej kompilacji zależnych od nich programów. Ma to kluczowe znaczenie w dystrybucjach, wtyczkach i aplikacjach działających przez długi czas.
Co narusza ABI
Wiele pozornie niewinnych zmian narusza ABI:
- dodawanie, usuwanie lub zmiana kolejności danych składowych
- dodawanie lub usuwanie funkcji wirtualnych
- zmiana dziedziczenia
- zmiana parametrów szablonów
- zmiany funkcji wbudowanych (czasami)
Wersjonowanie semantyczne (SemVer)
Zgodność należy komunikować za pomocą numerów wersji MAJOR.MINOR.PATCH:
- MAJOR — zmiany niezgodne wstecz
- MINOR — nowe funkcje, zgodność wsteczna
- PATCH — poprawki
Wersjonowanie nagłówków
W nagłówkach należy udostępniać makra wersji.
#define MYLIB_VERSION_MAJOR 2
#define MYLIB_VERSION_MINOR 1
#define MYLIB_VERSION_PATCH 3SONAME bibliotek współdzielonych
W systemie Linux biblioteki współdzielone mają element SONAME, który koduje numer główny wersji. Linkery i program ładujący używają go do znajdowania zgodnych wersji.
# libmylib.so.2 -> libmylib.so.2.1.3
# SONAME = libmylib.so.2Ukrywanie szczegółów implementacji
Stabilne ABI wymaga trzymania implementacji poza nagłówkami. Należy użyć PIMPL (w następnej lekcji), aby dodawać lub usuwać prywatne składowe bez wpływu na konsumentów.
ABI kompilatora
ABI C++ różni się między kompilatorami (GCC i MSVC używają innego zmieniania nazw oraz innych układów klas). Należy dystrybuować pliki binarne zbudowane za pomocą określonych kompilatorów albo ograniczyć się do interfejsów extern "C".
ABI biblioteki standardowej
Biblioteka standardowa również może naruszać ABI, choć libstdc++ i libc++ mają odpowiednie zasady. Jeśli potrzebują Państwo zgodności między wersjami, należy unikać typów biblioteki standardowej w stabilnym publicznym API.
Dodawanie funkcji bez naruszania zgodności
Bezpieczne dodatki:
- nowe funkcje wolnostojące
- nowe klasy
- nowe niewirtualne funkcje składowe (z zachowaniem ostrożności)
Niebezpieczne: zmienianie klas, których obiekty konsumenci umieszczają na stosie lub które są przez nich kompilowane.
Narzędzia do sprawdzania ABI
Narzędzia porównujące dwa procesy budowania:
- abidiff — porównuje ABI
- abicompliance-checker — generuje raporty
Strategia długoterminowa
Stabilność należy uwzględnić już na etapie projektowania: małe publiczne API, nieprzezroczyste typy oraz ostrożne stosowanie szablonów i dziedziczenia. Po wydaniu produktu naruszenie ABI jest kosztowne — należy planować zwiększenia numeru głównego wersji i jasno o nich informować.
Szybkie sprawdzenie
Która zmiana w klasie C++ z największym prawdopodobieństwem naruszy ABI?
Podsumowanie
Zgodność API oznacza zgodność kodu źródłowego, a zgodność ABI — zgodność plików binarnych. ABI jest delikatne: dodawanie składowych lub funkcji wirtualnych oraz zmiana dziedziczenia je naruszają. Należy używać SemVer, ukrywać implementację za pomocą PIMPL, wydawać kilka głównych wersji równolegle i uruchamiać narzędzia do sprawdzania ABI.
Często zadawane pytania
Czy lekcja „Wersjonowanie API i stabilność ABI” jest bezpłatna?
Tak — pełny tekst „Wersjonowanie API i stabilność ABI” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wersjonowanie API i stabilność ABI”?
Planuj wersjonowanie semantyczne i chroń stabilność ABI między wydaniami Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wersjonowanie API i stabilność ABI”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Biblioteki tylko nagłówkowe a kompilowane
- Wersjonowanie API i stabilność ABI
- Ukrywanie implementacji za pomocą PIMPL
- Pisanie nowoczesnej biblioteki narzędziowej tylko z nagłówków