إصدار 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++ سياسات بهذا الشأن. تجنب أنواع std في واجهة 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المكتبات المقتصرة على الترويسات مقابل المكتبات المترجمة
- إصدار API واستقرار ABI
- إخفاء التنفيذ باستخدام PIMPL
- كتابة مكتبة أدوات حديثة مقتصرة على الترويسات