واجهة الدوال الخارجية (FFI)
يشرح هذا المستند إتفاقية واجهة الدوال الخارجية (FFI) لاستدعاء الدوال المطبقة خارجياً في لغة Wave. يسمح FFI لبرنامج Wave بالارتباط المباشر بالمكتبات الأصلية المكتوبة بلغات أخرى.
نظرة عامة
تعمل واجهة الدوال الخارجية لـ Wave بناءً على الإعلانات. لا يتم تنفيذ الدوال الخارجية في كود Wave، بل يتم تحديد فقط أي ABI (واجهة ثنائية للتطبيقات) تتبعه. يتم حل التنفيذ الفعلي في مرحلة الربط من خلال المكتبة الخارجية.
تعمل واجهة الدوال الخارجية عن طريق إعلان وجود الدالة فقط وقت الترجمة، بينما يقوم الرابط التلقائي بربط الرموز الفعلية وقت إنشاء الملف القابل للتنفيذ.
إعلان extern
يتم إعلان الدوال الخارجية باستخدام الكلمة المفتاحية extern.
على الحالي، تحتاج إلى تحديد ABI في Wave وتدعم extern(c) فقط.
extern(c) fun function_name(args...) -> return_type;
تحديد ABI
يجب تحديد ABI في الاعلان الخارجي.
حالية ABI المدعومة هي واحدة c.
extern(c) fun printf(fmt: ptr<u8>);
حتى لو يتم تحليل الاعلان الخارجي مثل extern(rust)، بسبب خطأ في الطور التحليلي الحقيقي.
إعلان extern على مستوى الدالة
لإعلان دالة خارجية واحدة، يتم كتابة ما يلي.
extern(c) fun InitWindow(width: i32, height: i32, title: ptr<u8>);
يعني هذا الإعلان أن رمز InitWindow الذي يتبع ABI C موجود في مكتبة خارجية.
إعلان extern على مستوى الكتلة
عند وجود عدة دوال خارجية تستخدم نفس ABI، يمكن تجميعها في كتلة واحدة للإعلان عنها.
extern(c) {
fun InitWindow(width: i32, height: i32, title: ptr<u8>);
fun CloseWindow();
fun BeginDrawing();
fun EndDrawing();
}
يعتبر إعلان مستوى الكتلة مكافئًا تمامًا من الناحية الدلالية لإعلان مستوى الدالة، وهو ببساطة بناء نحوي لغرض القراءة والتنظيم.
تحديد اسم الرمز
في بعض ABI، قد لا يتطابق اسم الدالة في Wave مع اسم الرمز الفعلي في الرابط. في هذه الحالة، يمكن تحديد اسم الرمز الفعلي الذي ستتصل به الدالة الخارجية في شكل سلسلة نصية.
تحديد رمز مستوى الدالة
extern(c, "puts")
fun rust_func(i32);
