APIのバージョニングとABI安定性
セマンティックバージョニングを計画し、リリース間のABI安定性を守ります。
「APIのバージョニングとABI安定性」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
異なる2つの互換性
互換性には、次の2つの観点があります。
- 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(次のレッスン)を使うと、利用側に影響を与えずにprivateメンバーを追加または削除できます。
コンパイラーABI
C++のABIはコンパイラーによって異なります(GCCとMSVCでは、名前修飾やクラスレイアウトが異なります)。特定のコンパイラーでビルドしたバイナリを配布するか、extern "C"インターフェースに限定してください。
標準ライブラリのABI
標準ライブラリによってもABIが壊れることがあります。ただし、libstdc++とlibc++にはそれぞれ方針があります。異なるバージョン間の互換性が必要な場合は、安定した公開APIでstdの型を使用しないようにしてください。
互換性を保った機能追加
安全な追加:
- 新しいフリー関数
- 新しいクラス
- 新しい非仮想メンバー関数(慎重に扱う必要があります)
安全でない変更:利用側がスタック上に保持している、またはコンパイルに組み込んでいるクラスを変更すること。
ABIチェック用ツール
2つのビルドを比較するツール:
- abidiff — ABIを比較する
- abicompliance-checker — レポートを生成する
長期的な方針
最初から安定性を考えて設計してください。公開APIを小さくし、opaque型を使い、テンプレートと継承を慎重に使用します。いったんリリースするとABIを壊す変更には大きなコストがかかるため、メジャーバージョンの更新を計画的に行い、明確に伝えてください。
確認問題
C++クラスに対する変更のうち、ABIを壊す可能性が最も高いのはどれですか。
まとめ
API互換性はソース互換性を意味し、ABI互換性はバイナリ互換性を意味します。ABIは壊れやすく、メンバーや仮想関数の追加、継承の変更によって壊れます。SemVerを使用し、PIMPLで実装を隠し、複数のメジャーバージョンを並行して配布し、ABIチェッカーを実行してください。
よくある質問
「APIのバージョニングとABI安定性」レッスンは無料ですか?
はい。「APIのバージョニングとABI安定性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「APIのバージョニングとABI安定性」で何を学びますか?
セマンティックバージョニングを計画し、リリース間のABI安定性を守ります。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「APIのバージョニングとABI安定性」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ヘッダーオンリーライブラリとコンパイル済みライブラリ
- APIのバージョニングとABI安定性
- PIMPLによる実装の隠蔽
- 現代的なヘッダーオンリー・ユーティリティライブラリを書く