واجهة الوظائف الخارجية
واجهة الوظائف الخارجية ( FFI ) هي آلية تُمكّن برنامجًا مكتوبًا بلغة برمجة معينة من استدعاء إجراءات متوافقة أو استخدام خدمات مكتوبة أو مُجمّعة بلغة أخرى. تُستخدم واجهة الوظائف الخارجية غالبًا في سياقات يتم فيها استدعاء مكتبة ارتباط ديناميكي ثنائية .
تسمية
يُستمدّ هذا المصطلح من مواصفات لغة Common Lisp ، التي تُشير صراحةً إلى ميزة لغة البرمجة التي تُتيح استدعاءات بين اللغات؛ [ 1 ] كما يُستخدم المصطلح رسميًا في كثير من الأحيان في وثائق المفسر والمترجم للغات Haskell ، [ 2 ] و Rust ، [ 3 ] و PHP ، [ 4 ] و Python ، و LuaJIT ( Lua ). [ 5 ] [ 6 ] : 35 [ 7 ] تستخدم لغات أخرى مصطلحات مختلفة: فلدى Ada روابط لغوية ، بينما لدى Java واجهة Java الأصلية (JNI)، أو الوصول الأصلي لـ Java (JNA)، أو منذ Java 22، واجهة برمجة تطبيقات الوظائف الخارجية والذاكرة . وقد أصبح مصطلح واجهة الوظائف الخارجية مصطلحًا عامًا للآليات التي تُقدّم مثل هذه الخدمات.
عملية
تتمثل الوظيفة الأساسية لواجهة الوظائف الخارجية في مواءمة دلالات واتفاقيات استدعاء لغة برمجة واحدة ( اللغة المضيفة ، أو اللغة التي تُعرّف واجهة الوظائف الخارجية) مع دلالات واتفاقيات لغة أخرى ( اللغة الضيف ). يجب أن تأخذ هذه العملية في الاعتبار بيئات التشغيل وواجهات التطبيقات الثنائية لكلتا اللغتين. ويمكن تحقيق ذلك بعدة طرق:
- يتطلب ذلك تحديد أو تنفيذ وظائف لغة الضيف التي يجب أن تكون قابلة للاستدعاء بلغة المضيف بطريقة معينة، وغالبًا ما يتم ذلك باستخدام مكتبة توافق من نوع ما.
- استخدام أداة لتغليف وظائف لغة الضيف تلقائيًا برمز الربط المناسب ، والذي يقوم بأي ترجمة ضرورية.
- استخدام مكتبة تغليف
- تقييد مجموعة إمكانيات لغة البرمجة المضيفة التي يمكن استخدامها عبر اللغات. على سبيل المثال، قد لا تتضمن دوال C++ المستدعاة من C (بشكل عام) معلمات مرجعية أو تُطلق استثناءات.
توفر لغة C++ توافقًا مع لغة C بسهولة، ولكن نظرًا لأن C++ تستخدم تغيير أسماء المتغيرات ، يجب تغليف الرموز المراد تصديرها في المكتبات المشتركة بكتل extern "C" لمنع تغيير الأسماء. extern "C"يمكن للدوال استدعاء كود C++ داخليًا، ولكن لا يمكنها إرجاع سوى أنواع C ولا يمكنها طرح استثناءات .
قد تتعقد الأمور المتعلقة بالمؤسسات المالية الأجنبية بسبب الاعتبارات التالية:
- إذا كانت إحدى لغات البرمجة تدعم جمع البيانات المهملة (GC) بينما لا تدعمها الأخرى، فيجب الحرص على ألا يتسبب كود اللغة غير الداعمة لجمع البيانات المهملة في فشل هذه العملية في اللغة الأخرى. في JNI، على سبيل المثال، يجب على كود C الذي يحتفظ بمراجع الكائنات التي يتلقاها من Java أن ينقل هذه المعلومات بنجاح إلى آلة Java الافتراضية أو بيئة تشغيل Java (JRE)، وإلا فقد تحذف Java الكائنات قبل أن ينتهي C من استخدامها. (كما يجب على كود C أيضًا تحرير ارتباطه بأي كائن من هذا القبيل صراحةً بمجرد أن لا يحتاج C إلى هذا الكائن).
- قد يكون من الصعب نقل الكائنات أو أنواع البيانات المعقدة أو غير البسيطة من بيئة إلى أخرى.
- قد لا يكون من الممكن لكلا اللغتين الاحتفاظ بمراجع لنفس مثيل الكائن القابل للتغيير، وذلك بسبب مشكلة التعيين المذكورة أعلاه.
- قد يتم تشغيل لغة واحدة أو كلتا اللغتين على جهاز افتراضي (VM)؛ علاوة على ذلك، إذا كان كلاهما كذلك، فغالبًا ما تكون هذه أجهزة افتراضية مختلفة.
- قد يكون التوريث عبر اللغات والاختلافات الأخرى، مثل الاختلافات بين أنظمة الأنواع أو بين نماذج تركيب الكائنات ، أمرًا صعبًا بشكل خاص.

يمكن إنشاء العديد من واجهات برمجة التطبيقات الخارجية (FFIs) تلقائيًا، على سبيل المثال، SWIG . ومع ذلك، في حالة لغة الإضافة ، قد يحدث انعكاس دلالي لعلاقة الضيف والمضيف، عندما يكون جزء أصغر من لغة الإضافة هو الضيف الذي يستدعي الخدمات في الجزء الأكبر من لغة المضيف، مثل كتابة إضافة صغيرة [ 8 ] لبرنامج GIMP. [ 9 ]
تقتصر بعض واجهات برمجة التطبيقات الخارجية (FFIs) على الوظائف المستقلة ، بينما تسمح أخرى أيضًا باستدعاءات الوظائف المضمنة في كائن أو فئة (تسمى غالبًا استدعاءات الأساليب )؛ بل إن بعضها يسمح بنقل أنواع البيانات المعقدة أو الكائنات عبر حدود اللغة.
في معظم الحالات، يتم تعريف واجهة برمجة التطبيقات الخارجية (FFI) بلغة برمجة عالية المستوى ، بحيث يمكنها استخدام خدمات مُعرَّفة ومُنفَّذة بلغة برمجة منخفضة المستوى ، عادةً ما تكون لغة برمجة أنظمة مثل C أو C++ . ويتم ذلك عادةً إما للوصول إلى خدمات نظام التشغيل (OS) باللغة التي تم تعريف واجهة برمجة التطبيقات (API) الخاصة بنظام التشغيل بها، أو لتحقيق أهداف تتعلق بالأداء.
توفر العديد من واجهات برمجة التطبيقات الخارجية (FFIs) أيضًا الوسائل للغة المستخدمة لاستدعاء الخدمات بلغة المضيف أيضًا.
لا يُستخدم مصطلح "واجهة الوظائف الخارجية" عادةً لوصف بيئات التشغيل متعددة اللغات، مثل بيئة تشغيل اللغة المشتركة من مايكروسوفت (CMR )، حيث تُوفّر بنية أساسية مشتركة تُمكّن أي لغة متوافقة مع CMR من استخدام الخدمات المُعرّفة بأي لغة أخرى. (مع ذلك، في هذه الحالة، تتضمن CMR واجهة وظائف خارجية، P/Invoke ، لاستدعاء الخدمات من خارج بيئة التشغيل). إضافةً إلى ذلك، تسمح العديد من بنى الحوسبة الموزعة، مثل استدعاء الأساليب عن بُعد في جافا (RMI)، وRPC، وCORBA ، و SOAP ، و D-Bus، بكتابة خدمات مختلفة بلغات مختلفة؛ ولا تُعتبر هذه البنى عمومًا واجهات وظائف خارجية.
حالات خاصة
توجد بعض الحالات الخاصة التي تُترجم فيها اللغات إلى نفس الآلة الافتراضية للرمز البايتي، مثل كلوجر وجافا ، وكذلك إليكسير وإرلانج . ولأنها لا تحتوي على واجهة، فهي ليست واجهة خارجية للوظائف ( FFI ) بالمعنى الدقيق، مع أنها توفر نفس الوظائف للمستخدم.
انظر أيضاً
مراجع
- ↑ مسودة مقترحة للمعيار الوطني الأمريكي لنظم المعلومات - لغة البرمجة - كومون ليسب (الإصدار 15.17R ). 12 أغسطس 1994. ص 243.
- ↑ "مقدمة عن واجهة البرامج الخارجية" . ويكي هاسكل . تم الاطلاع عليه في 19 يونيو 2015.
تُستخدم واجهة البرامج الخارجية في هاسكل لاستدعاء الدوال من لغات أخرى (بشكل أساسي لغة C في هذه المرحلة)، ولـ C لاستدعاء دوال هاسكل.
- ↑ "std::ffi" . Rust-lang.org . تم الاطلاع عليه في 1 أبريل 2021.
توفر هذه الوحدة أدوات مساعدة للتعامل مع البيانات عبر واجهات غير Rust، مثل لغات البرمجة الأخرى ونظام التشغيل الأساسي. وهي مفيدة بشكل أساسي لربط FFI (واجهة الوظائف الخارجية) وللبرامج التي تحتاج إلى تبادل سلاسل نصية شبيهة بلغة C مع لغات أخرى.
- ↑ "دليل PHP FFI" . دليل PHP . تم الاطلاع عليه بتاريخ 31 أغسطس 2023.
تُتاح متغيرات C المُعرّفة كخصائص لمثيل FFI.
- ↑ مايك بال. "مكتبة FFI" . Luajit.org . تم الاطلاع عليه بتاريخ 29-09-2013 .
- ↑ هاينتز، يواكيم؛ هوفمان، أليكس؛ مكوردي، إيان (2013). طرق للمضي قدمًا: وقائع المؤتمر الدولي الأول لـ Csound . نيوكاسل أبون تاين: كامبريدج سكولارز للنشر. ISBN 978-1-4438-5122-0. OCLC 855505215 .
- ↑ "وثائق CFFI" . تم الاطلاع عليها بتاريخ 19 يونيو 2015. واجهة الدوال الخارجية للغة C في بايثون .
الهدف هو توفير طريقة سهلة وموثوقة لاستدعاء كود C المُترجم من بايثون باستخدام تعريفات الواجهة المكتوبة بلغة C.
- ↑ "4. نموذج نص برمجي" . Gimp.org. 2001-02-04. مؤرشف من الأصل في 2013-10-07 . تم الاطلاع عليه في 2013-09-29 .
- ↑ "Script-Fu والإضافات لبرنامج GIMP" . Gimp.org . تم الاطلاع عليه بتاريخ 29-09-2013 .
روابط خارجية
- c2.com: واجهة الوظائف الخارجية
- واجهة الوظائف الخارجية في هاسكل 98
- أليجرو كومون ليسب إف إف آي
- واجهات برمجة التطبيقات
- البرامج الفرعية
