libffi

مكتبة libffi هي مكتبة واجهة دوال خارجية . توفر واجهة لغة برمجة C لاستدعاء الدوال المُترجمة أصلاً، وذلك بمعرفة معلومات عن الدالة المستهدفة أثناء التشغيل بدلاً من وقت الترجمة . كما أنها تُنفذ الوظيفة المعاكسة: إذ يُمكن لـ libffi إنشاء مؤشر إلى دالة تقبل وتفك تشفير أي مجموعة من الوسائط المُحددة أثناء التشغيل.

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

ومن بين المستخدمين البارزين: بايثون ، هاسكل ، دالفيك ، إف-سكريبت ، باي باي ، باي أوبج سي ، روبي كوكوا ، جيه روبي ، روبينيوس ، ماك روبي ، جي سي جيه ، جنو سمول توك ، آيسد تي ، سايكريبت ، باون ، جافا نيتيف أكسس ، كومون ليسب (عبر سي إف إف آي)، راكيت ، [ 3 ] كومون ليسب القابلة للتضمين ، وموزيلا . [ 4 ]

في نظام التشغيل Mac OS X ، يتم استخدام libffi بشكل شائع مع BridgeSupport ، الذي يوفر أوصافًا محايدة للغة البرمجة لواجهات الإطار ، و Nu الذي يربط الوصول المباشر إلى Objective-C من Lisp .

تم نقل مكتبة libffi على نطاق واسع وهي متاحة بموجب ترخيص MIT .

خلفية

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

تتمتع مكتبة libffi بمعرفة جيدة بآلية استدعاء الدوال على العديد من المنصات ( مجموعات المعالج ونظام التشغيل). وتُسهّل واجهة برمجة التطبيقات (API) الخاصة بها، والمكتوبة بلغة C والمشتركة بين جميع إصدارات libffi بغض النظر عن المنصة، عملية تحميل التعليمات البرمجية على مختلف المنصات. بالإضافة إلى الدوال العادية، تدعم المكتبة أيضًا الدوال المتغيرة الوسائط على نمط لغة C.

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

تاريخ

استُلهمت مكتبة libffi، التي طوّرها أنتوني غرين في الأصل، من مكتبة Gencall التابعة لشركة Silicon Graphics . طوّر جياني مارياني، الذي كان يعمل آنذاك لدى SGI ، مكتبة Gencall بهدف تمكين استدعاء الدوال عن طريق العنوان وإنشاء إطار استدعاء لاتفاقية الاستدعاء المحددة ( MIPS O32). قام أنتوني غرين بتحسين الفكرة وتوسيعها لتشمل بنى معمارية أخرى واتفاقية استدعاء مختلفة، ثم أتاح libffi كمصدر مفتوح.

التبني

تُعد مكتبة libffi مفيدة في بناء جسر بين التعليمات البرمجية المفسرة والتعليمات البرمجية المترجمة أصلاً. ومن أبرز مستخدميها:

د

libffi-d
روابط لمكتبة libffi للغة D. تستخدم بشكل أساسي لـ MCI (البنية التحتية للمترجم المُدار).

إف-سكريبت

إف-سكريبت
يقوم بإنشاء فئات Cocoa المكتوبة بلغة F-Script بشكل ديناميكي.

غايل

جنو غايل
تُستخدم مكتبة libffi في Guile 1.9.8 والإصدارات الأحدث

هاسكل

جي إتش سي
تم استخدام libffi في غالبية عمليات FFI التي نفذتها GHC منذ أواخر عام 2009.

جافا

OpenJDK
يستخدم تطبيق Java Platform Standard Edition مفتوح المصدر مكتبة libffi للربط بين المفسر والتعليمات البرمجية الأصلية لمنفذ Zero-Assembly.
دالفيك
دالفيك هي الآلة الافتراضية التي تُشغّل منصة جافا على أجهزة أندرويد المحمولة. تُستخدم مكتبة libffi في إصدارات أندرويد التي لم يُكتب لها أي كود ربط مخصص.
الوصول الأصلي في جافا (JNA)
طريقة استدعاء التعليمات البرمجية الأصلية من جافا بدون استخدام JNI.
gcj
تستخدم مكتبة وقت التشغيل الخاصة بمترجم GNU للغة برمجة Java مكتبة libffi لمعالجة عمليات الاستدعاء المتبادل بين التعليمات البرمجية المفسرة والتعليمات البرمجية المترجمة أصلاً. وكانت gcj جزءًا من GCC، وهي مجموعة مترجمات GNU .

جافا سكريبت

JSCocoa
استدعاء كود Objective-C من جافا سكريبت على نظام التشغيل Mac OS X و iPhone (عبر منفذ libffi-iphone).
موزيلا
تُستخدم مكتبة libffi في مكتبة js-ctypes (المعروفة سابقًا باسم ctypes.jsm) لاستدعاء وظائف C داخل كود JavaScript (متوفرة في تطبيقات XULRunner ، وإضافات Firefox ، وما إلى ذلك). [ 5 ]
node-ffi
إضافة Node.js لتحميل واستدعاء المكتبات الديناميكية من جافا سكريبت .

التلعثم

cffi-libffi
تتضمن مكتبة واجهة الوظائف الخارجية القياسية لـ Common Lisp CFFI نظام cffi-libffi لتضمين دعم تمرير وإرجاع وسائط البنية بالقيمة.
عابث
يستخدم pixie ( لهجة Lisp مستوحاة من Clojure ) libffi كآلية واجهة الوظائف الخارجية الافتراضية.

بيرل

FFI::Raw
غلاف رقيق حول libffi.
FFI::Platypus
غلاف أحدث وأكثر ملاءمة حول libffi.

بايثون

استدعاء مكتبة مشتركة من داخل برنامج بايثون نصي.
سي بايثون
يستخدم التنفيذ الافتراضي والأكثر استخدامًا للغة البرمجة بايثون مكتبة libffi في مكتبة ctypes القياسية.
PyObjC
استدعاء كود Objective-C من بايثون على نظام التشغيل Mac OS X.

مضرب

مضرب
استدعاء كود C من تطبيق Scheme الشهير هذا.

روبي

كمان
غلاف libffi في مكتبة روبي القياسية
روبي-إف إف آي
امتداد لواجهة الوظائف الخارجية للغة روبي.
روبي كوكوا
استدعاء كود Objective-C من Ruby على نظام التشغيل Mac OS X.

مراجع

  1. "الإصدار 3.7.1" . 10 يوليو 2026. تم الاطلاع عليه في 11 يوليو 2026 .
  2. "الحالة" . جيت هاب . 25 أبريل 2022.
  3. "نسخة مؤرشفة" (PDF) . مؤرشفة من الأصل (PDF) بتاريخ 2009-09-02 . تم الاطلاع عليها بتاريخ 2009-08-02 .{{cite web}}: CS1 maint: archived copy as title ( link )
  4. "Mozilla-central @ 2dc00d4b379a files manifest" .
  5. https://developer.mozilla.org/en/js-ctypes مؤرشف بتاريخ 29-06-2011 في Wayback Machine ، مرجع js-ctypes مؤرشف بتاريخ 29-06-2011 في Wayback Machine