واجهة الدالة الخارجية

**واجهة الوظائف الخارجية** (بالإنجليزية: **Foreign function interface**)؛ (اختصارًا **FFI**) هي آلية يمكن من خلالها لبرنامج مكتوب بلغة برمجة معينة أن يستدعي إجراءات أو يستخدم خدمات مكتوبة أو مُصرَّفة بلغة أخرى. تُستخدم واجهة الوظائف الخارجية غالبًا في السياقات التي تتم فيها استدعاءات لمكتبة برمجية ثنائية من نوع مكتبة الربط الديناميكي.

## التسمية
يأتي المصطلح من مواصفات لغة كومون ليسب، التي تشير صراحة إلى هذه الميزة البرمجية التي تتيح الاستدعاء بين اللغات بهذا الاسم. كما يُستخدم المصطلح رسميًا في توثيقات المفسرات والمصرّفات للغات مثل هاسكل، وراست، وPHP، وبايثون، وLuaJIT.

تستخدم لغات أخرى مصطلحات مختلفة: فلغة أيدا لديها «روابط لغوية» (language bindings)، بينما تستخدم جافا «واجهة جافا المحلية» (JNI) أو «وصول جافا المحلي» (JNA). وقد أصبح مصطلح «واجهة الوظائف الخارجية» مصطلحًا عامًا للآليات التي تقدم مثل هذه الخدمات.

## آلية العمل
يسار|250px
الوظيفة الأساسية لواجهة الوظائف الخارجية هي التوفيق بين دلالات واصطلاحات الاستدعاء الخاصة بلغة برمجة معينة (اللغة "المضيفة" أو اللغة التي تعرّف الواجهة)، مع دلالات واصطلاحات لغة أخرى (اللغة "الضيفة"). يجب أن تأخذ هذه العملية في الاعتبار أيضًا بيئات وقت التشغيل وواجهة التطبيق الثنائية لكلا اللغتين. يمكن تحقيق ذلك بعدة طرق:
* اشتراط أن يتم تحديد أو تنفيذ دوال اللغة الضيفة المراد استدعاؤها من اللغة المضيفة بطريقة معينة، غالبًا باستخدام مكتبة توافق من نوع ما.
* استخدام أداة لتغليف دوال اللغة الضيفة تلقائيًا بـ«شفرة غراء» (glue code) مناسبة، تقوم بأي ترجمة ضرورية.
* استخدام مكتبة مغلفة.
* تقييد مجموعة قدرات اللغة المضيفة التي يمكن استخدامها عبر اللغات. على سبيل المثال، دوال لغة سي++ التي يتم استدعاؤها من لغة سي قد لا تتضمن (بشكل عام) معلمات مرجعية أو تثير استثناءات.

قد تتعقد واجهات الوظائف الخارجية بسبب الاعتبارات التالية:
* إذا كانت إحدى اللغات تدعم جمع القمامة (GC) والأخرى لا تدعمه؛ فيجب توخي الحذر حتى لا يتسبب كود اللغة التي لا تدعم GC في فشل عملية جمع القمامة في اللغة الأخرى.
* قد يكون من الصعب ربط الكائنات أو أنواع البيانات المعقدة من بيئة إلى أخرى.
* قد لا يكون من الممكن لكلتا اللغتين الاحتفاظ بمراجع لنفس نسخة كائن قابل للتغيير، بسبب مشكلة الربط المذكورة أعلاه.
* قد تكون إحدى اللغتين أو كلتاهما تعملان على آلة افتراضية؛ وعلاوة على ذلك، إذا كان كلاهما يعمل على آلة افتراضية، فغالبًا ما تكونان مختلفتين.
* قد تكون الوراثة عبر اللغات والاختلافات الأخرى، مثل بين نظام الأنواع أو نماذج تكوين الكائنات، صعبة بشكل خاص.

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

لا يُستخدم مصطلح واجهة الوظائف الخارجية عمومًا لوصف بيئات التشغيل متعددة اللغات مثل بنية اللغة المشتركة (CLR) من مايكروسوفت، حيث يتم توفير "ركيزة" مشتركة تمكّن أي لغة متوافقة مع CLR من استخدام الخدمات المعرفة في أي لغة أخرى. (ومع ذلك، في هذه الحالة، يتضمن CLR واجهة وظائف خارجية، وهي P/Invoke، للاستدعاء خارج بيئة التشغيل).

## حالات خاصة
هناك بعض الحالات الخاصة التي يتم فيها تصريف اللغات إلى نفس كود البايت للآلة الافتراضية، مثل كلوجر وجافا، وكذلك إلكسير وإرلانج. نظرًا لعدم وجود واجهة فعلية، فهي ليست واجهة وظائف خارجية بالمعنى الدقيق للكلمة، ولكنها تقدم نفس الوظائف للمستخدم.

## انظر أيضًا
* واجهة برمجة التطبيقات
* عامل التحميل الزائد
* مؤشر لدالة

## المراجع

تصنيف:برمجة كائنية التوجه
تصنيف:واجهات برمجة التطبيقات
تصنيف:الوظائف الفرعية
تصنيف:أنواع البيانات
تصنيف:مشغلات (برمجة)