0Pricing
C++ Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ヘッダーオンリーライブラリとコンパイル済みライブラリ
  2. APIのバージョニングとABI安定性
  3. PIMPLによる実装の隠蔽
  4. 現代的なヘッダーオンリー・ユーティリティライブラリを書く
← C++ Academyに戻る