استدعاء دوال C عبر FFI
استدعِ دوال libc ودوال المكتبات المشتركة المخصصة من Lua دون تكلفة إضافية
استدعاء دوال C عبر FFI درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
استدعاء دوال C مباشرة
بعد تعريف دوال C باستخدام ffi.cdef، تُستدعى تمامًا مثل دوال Lua من خلال كائن المكتبة. ويجري تحويل الوسائط والقيم المُعادة تلقائيًا.
local ffi = require("ffi")
ffi.cdef[[ double sin(double x); ]]
local m = ffi.load("m")
print(m.sin(math.pi / 2)) -- 1.0تحويل الأنواع
تتحول أعداد Lua إلى أعداد C من النوع double افتراضيًا. وتحول FFI القيم تلقائيًا إلى نوع وسيط C المعلن. تتحول القيم المنطقية إلى 0 أو 1، والسلاسل إلى const char*.
استدعاء printf
إن printf دالة C متغيرة الوسائط. استدعُوها عبر ffi.C.printf باستخدام سلاسل التنسيق والوسائط.
ffi.cdef[[ int printf(const char *fmt, ...); ]]
ffi.C.printf("Sum: %d\n", 42)معالجة القيمة المُعادة
تُحوّل القيم التي تعيدها C تلقائيًا إلى أنواع Lua. تتحول الأعداد الصحيحة إلى أعداد Lua، بينما تتحول char* إلى lightuserdata؛ استخدموا ffi.string للتحويل.
ffi.cdef[[ char *getenv(const char *name); ]]
local ptr = ffi.C.getenv("HOME")
if ptr ~= nil then
print(ffi.string(ptr))
endffi.string
تحوّل ffi.string(ptr, len) مؤشر char* إلى سلسلة Lua. وعند عدم تمرير len، تستمر في القراءة حتى تصل إلى بايت صفري.
معالجة الأخطاء
تعيد دوال C رموز خطأ أو تضبط errno. تحقّقوا صراحةً من القيم المُعادة. ويمكنكم الوصول إلى errno عبر ffi.errno().
ffi.cdef[[ int open(const char *path, int flags); ]]
local fd = ffi.C.open("missing.txt", 0)
if fd < 0 then
print("Error:", ffi.errno())
endوسائط البنى
مرّروا هياكل C بالقيمة أو عبر مؤشر. أنشئوها باستخدام ffi.new.
ffi.cdef[[
typedef struct { int x, y; } Point;
void printPoint(Point p);
]]
local p = ffi.new("Point", {x=3, y=4})
lib.printPoint(p)وسائط المؤشرات
مرّروا مؤشرات إخراج إلى الدوال التي تعيد قيمًا متعددة عبر وسائط المؤشرات.
ffi.cdef[[
void minmax(double *arr, int n, double *min, double *max);
]]
local arr = ffi.new("double[5]", {5,2,8,1,9})
local mn, mx = ffi.new("double[1]"), ffi.new("double[1]")
lib.minmax(arr, 5, mn, mx)
print(mn[0], mx[0])أداء استدعاءات FFI
تتميز استدعاءات FFI إلى دوال C بوقت إضافي يقترب من الصفر، وهي أسرع بكثير من استدعاءات Lua إلى C عبر واجهة C التقليدية. وغالبًا ما يستطيع JIT تضمين الاستدعاء بالكامل.
الدوال متغيرة الوسائط
يجب استدعاء دوال C متغيرة الوسائط (...) باستخدام الأنواع الصحيحة. مرّروا تحويلات أنواع صريحة عند الحاجة لتجنب الالتباس.
ffi.C.printf("%d %f\n", ffi.cast("int", 42), ffi.cast("double", 3.14))ممارسات الأمان
تحقّقوا دائمًا من أن قيم المؤشرات المُعادة ليست NULL. لا تمرّروا مؤشرًا حُررت ذاكرته أو خرج عن نطاقه. استخدموا ffi.gc لإرفاق دوال إنهاء بتخصيصات C.
سؤال حول استدعاءات FFI
كيف تتعامل FFI مع تحويل سلسلة Lua إلى const char* في C؟
مراجعة: استدعاء C عبر FFI
استدعوا دوال C من خلال كائن المكتبة تمامًا مثل دوال Lua. تتولى FFI تحويل الأنواع. استخدموا ffi.string للقيم المُعادة من نوع char*، وffi.errno() للأخطاء، وffi.new لوسائط البنى والمصفوفات.
الأسئلة الشائعة
هل درس «استدعاء دوال C عبر FFI» مجاني؟
نعم — نص درس «استدعاء دوال C عبر FFI» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «استدعاء دوال C عبر FFI»؟
استدعِ دوال libc ودوال المكتبات المشتركة المخصصة من Lua دون تكلفة إضافية تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «استدعاء دوال C عبر FFI»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات FFI: ffi.cdef وffi.load
- استدعاء دوال C عبر FFI
- المؤشرات والبُنى والمصفوفات في FFI
- دوال الاستدعاء العكسي: تمرير دوال Lua إلى C