ثبات الواجهة الثنائية للتطبيق

مقدمة

تعتبر الواجهة الثنائية للتطبيق طريقة يمكن للبرامج من خلالها أن تستدعي دوال و تستعمل هياكل بيانات من برامج مفسرة أخرى. فهي تعتبر النسخة المفسرة لواجهة برمجة تطبيق الخاصة برنامج ما. بعبارة أخرى، هي ترويسات الملفات التي تصف المصنفات و الدوال و هياكل البيانات و التعدادات إضافة إلى الثوابت التي تسمح لتطبيق بأن ينفذ مهمة مرغوبة استجابة لطريقة تفسير مجموعة من العناوين و قيم الإعدادات المتوقعة سلفاُ إضافة إلى احجام هياكل الذاكرة و الأنساق التي بواسطتها تم تفسير مزود الواجهة الثنائية للتطبيق.

يجب على التطبيق الذي يستعمل الواجهة الثنائية للتطبيق أن يُفسر بطريقة تجعل العناوين و الإعدادات المتوقعة و أحجام هياكل الذاكرة و الأنساق متوافقة مع تلك التي تم بواسطتها تفسير مزود الواجهة الثنئاية للتطبيق، ويتم تحقيق هذا عادة عبر التفسير باستخدام الترويس التي تم توفيرها من طرف مزود الواجهة الثنائية للتطبيق.

بما أن مزود الواجهة الثنائية للتطبيق و مستخدم الواجهة الثنائية للتطبيق قد يتم تفسيرهما في أوقات مختلفة باستعمال نسخ مفسرات مختلفة، فإن القطعة المسؤولة عن عن ضمان توافق الواجهة الثنائية للتطبيق تكون داخل المفسر. يجب على النسخ المختلفة من المفسرات التي قد يتم توفيرها من طرف بائعين مختلفين أن تنتج نفس النسخة من الواجهة الثنائية للتطبيق انطلاقا من ملف ترويسة ذو محتوى محدد، كما يجب عليها ان تنتج شيفرة خاصة بالتطبيق باستعمال الواجهة الثنائية للتطبيق التي يمكنها الوصول إلى الواجهة البرمجية للتطبيق و التي تم وصفها في ترويسة معطاة استنادا إلى الناتج المتفق عليه للواجهة الثنائية للتطبيق الناتجة عن الوصف المتوفر في الترويسة. إن المفسرات الحديثة تمتلك سجل تتبع جيداُ فيما يخص تحقيق التوافق بين الواجهات الثنائية للتطبيقات التي تنتجها.

تقع المسؤولية الباقية فيما يخص ضمان توافق الواجهة الثنائية للتطبيق على عاتق الفرق المسؤول عن صيانة ملفات الترويس التي توفر واجهة برمجية للتطبيق التي بدورها تنتج عن تفسير الواجهة الثنائية للتطبيق التي تبقى ثابتة. يمكن إجراء تغييرات على على ملفات الترويس، لكن يجب تتبع طبيعة هذه التغييرات بدقة لضمان أنه بعد تفسير الواجه الثنائية للتطبيق، ﻻ تتغير بطريقة تؤدي إلى الإخلال بتوافق الواجهات الثنائية للتطبيقات الخاصة بالمستخدمين الحاليين مع النسخ الجديدة.

ثبات الواجهة البرمجية للتطبيقات في الـ Node.js

توفر الـ Node.js ملفات ترويس يتم صيانتها من طرف عدة فرق تقنية مستقلة. على سبيل المثال، ملفات الترويس مثل node.h و node_buffer.h يتم صيانتها من طرف فريق الـ Node.js، بينما يتم صيانة ملف v8.h من طرف فريق الـ V8، الذي هو مستقل و يمتلك اجندته و أولوياته الخاصة رغم تعاونه الوثيق مع فريق الـ Node.js. مع ذلك، ليس لفريق الـ Node.js سوى تحكم جزئي على التغييرات التي يتم طرحها في ملفات الترويس التي يوفرها المشروع. نتيجة لما سبق، فإن مشروع الـ Node.js تبنى سياسة الترميز الدلالي ليضمن أن الواجهة البرمجية للتطبيق الموفرة من المشروع تنتج واجهة ثنائية ثابتة لجميع نسخ الـ Node.js الصغرى و الإصلاحية التي تم إطلاقها تحت نسخة رئيسية واحدة، وهذا يعني أن مشروع الـ Node.js يلزم نفسه بضمان أن الإضافات الأصلية للـ Node.js التي تم تفسيرها بواسطة نسخة رئيسية من الـ Node.js تعمل بنجاح عند تشغيلها من طرف أي نسخة ثانوية أو نسخة اصلاحية للـ Node.js تنتمي للنسخة الرئيسية التي تم تفسيرها اساسا بها.

N-API

لقد تزايد الطلب لتزويد الـ Node.js بواجهة تطبيقات برمجية تنتج واجهة تطبيقات ثنائية تكون ثابتة على عدة نسخ رئيسية من الـ Node.js، و ما حفزنا لإنشاء واجهة برمجية مشابهة هو ما يلي:

  • بقاء لغة الجافاسكريبت متوافقة مع ذاتها من أيامها الأولى، بينما تتغير الواجهة الثنائية للتطبيق الخاصة بالمحرك الذي ينفذ الجافاسكريبت مع كل نسخة رئيسية للـ Node.js و هذا يعني أن أي تطبيق كُتب تماما بالجافاسكريبت لا يحتاج ﻹعادة تفسيره أو تثبيته أو نشره لأن النسخة الرئيسية الجديدة من الـ Node.js قد تم التخلي عنها في البيئة الانتاجية التي يشتغل عليها التطبيق. هذا التفاوت بين حزم الـ Node.js التي تحتوي على إضافات أصلية و تلك المكتوبة كليا بالجافاسكريبت قد أُضيف لعبئ صيانة الأنظمة الانتاجية التي تعتمد على الإضافات الأصلية.

  • وجود مشاريع أخرى بدأت في إنتاج واجهات الجافاسكريبت التي تعتبر بدائل للـ Node.js. بما أن هذه المشاريع قد تم بناؤها اعتمادا على محركات جافاسكريبت مختلفة عن الـ V8، فإن اضافاتها الأصلية تنطوي بالضرورة على هيكلية مختلفة و تستعمل واجهة برمجية مختلفة، و رغم ذلك، فإن استعمال واجهة برمجية واحدة خاصة بإضافة أصلية في عدة نسخ لواجهة الجافاسكريبت البرمجية الخاصة بالـ Node.js سيسمح لهذه المشاريع بأن تستعمل مميزات النظام البيئي لحزم الجافاسكريبت التي تتمحور حول الـ Node.js

  • قد يحتوي الـ Node.js على محركات جافاسكريبت مختلفة مستقبلا، و هذا يعني أن جميع واجهات الـ Node.js ستبقى نفسها خارجيا، لكن سيعني أيضا أن ملفات الترويس الخاصة بالـ V8 ستكون غائبة. مثل هذه الخطوة ستؤدي إلى اختلال النظام البيئي للـ Node.js عموماً و النظام البيئي الخاص بالإضافات خصوصاً إذا كانت الواجهة البرمجية للإضافة التي لا تستعمل محرك جافاسكريبت ليست موفرة من قبل الـ Node.js و غير متبناة من طرف الإضافات الأصلية.

لهذه الأطراف، تم طرح الـ N-API في النسخة 8.6.0 و تم تمييزه كميزة مستقرة في النسخة 8.12.0. هذه الواجهة البرمجية معرفة في ملفات الترويس node_api.h و node_api_types.h و تضمن توافقا متقدما على مستوى عدة نسخ رئيسية من الـ Node.js كما يلي: تتوفر نسخة معينة n من الـ N-API في النسخة الرئيسية من الـ Node.js التي نشرت فيها، و في كافة نسخ الـ Node.js اللاحقة بما فيها النسخ الرئيسية منها.

يمكن لمطوري الإضافات الأصلية إستغلال التوافق المتقدم الذي يضمنه الـ N-API عبر ضمان أن الإضافة تستعمل الواجهات البرمجية المحددة في في ملف ترويس node_api.h فقط مع هياكل البيانات و الثوابت المحدد في ملف node_api_types.h. بالقيام بذلك، يسهل المطورون تبني إضافاتهم عبر تنبيه المستخدمين في مرحلة الإنتاج إلى أن عبء صيانة تطبيقاتهم لن يزيد بتغيير الإضافات الأصلية في مشاريعهم بل بإضافة حزم مكتوبة كليا بالجافاسكريبت.

ينطوي الـ N-API على نسخ عدة لكون أن هناك واجهات برمجية جديدة تضاف من وقت ﻵخر، وعكس الترميز الدلالي، فإن تنسيخ الـ N-API هو تراكمي، أي أن كل نسخة منه تمثل نفس المعنى للنسخ الثانوية في نظام الترميز الدلالي و بالتالي فإن كل التغييرات التي يتم إجراؤها على الـ N-API تكون متوافقة مع النسخ الأقدم. إضافة إلى ما سبق، فإن هناك نسخ جديدة من الـ N-API تضاف تحت بند "تجريبي" لإعطاء المجتمع الفرصة لفحصها في بيئة إنتاجية. تعني الحالة التجريبية أنه على الرغم من ان هناك اهتماماً لضمان أن ﻻ يجب تعديل الواجهات البرمجية الجديدة بطريقة تلغي توافق الواجهات الثنائية للتطبيقات مستقبلا، فإنه لم يتم الموافقة على كونها صحيحة و مفيدة بشكل كافٍ في الانتاج كما تم تصميمها، وعليه فيمكنها ان تنطوي على تغييرات غير متوافقة مع الواجهات الثنائية للتطبيق قبل أن يتم دمجها أخيراً مع نسخة قادمة من الـ N-API. بمعنى آخر، فإن نسخة تجريبية من الـ N-API لا يُضمن ان تحقق توافقا متقدما.

إنتقل إلى الأعلى