मुख्य कंटेंट तक स्किप करें

FFI

यह दस्तावेज़ वेव भाषा में बाहरी रूप से लागू फंक्शनों को कॉल करने के लिए एफएफआई (विदेशी फंक्शन इंटरफेस) विनिर्देशों की व्याख्या करता है। एफएफआई के माध्यम से, वेव प्रोग्राम अन्य भाषाओं में लिखी गई नेटिव लाइब्रेरी के साथ सीधे अंतःक्रिया कर सकता है।


सारांश

वेव का एफएफआई घोषणा आधारित रहता है। बाहरी फंक्शनों को वेव कोड में लागू नहीं किया जाता है और केवल यह निर्दिष्ट करते हैं कि वे कौन से एबीआई (एप्लिकेशन बाइनरी इंटरफेस) का पालन करते हैं। वास्तविक कार्यान्वयन लिंक चरण में बाहरी लाइब्रेरी से हल होता है।

एफएफआई केवल कंपाइल टाइम पर फंक्शन की उपस्थिति को घोषित करता है और जब संगणना फाइल बनती है तब लिंककर्ता वास्तविक प्रतीकों को जोड़ने की विधि में कार्य करता है।


extern घोषणा

बाहरी फंक्शनों को extern कीवर्ड का उपयोग करके घोषित किया जाता है। वर्तमान में वेव में एबीआई निर्दिष्ट करना अनिवार्य है और केवल extern(c) का समर्थन करता है।

extern(c) fun function_name(args...) -> return_type;

ABI निर्दिष्ट करें

extern घोषणा में 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 प्रतीक, जो C ABI का पालन करता है, बाहरी पुस्तकालय में मौजूद है।


ब्लॉक यूनिट extern घोषणा

जब कई बाहरी फंक्शन समान ABI का उपयोग करते हैं, तो उन्हें ब्लॉक के रूप में समूहित करके घोषित किया जा सकता है।

extern(c) {
fun InitWindow(width: i32, height: i32, title: ptr<u8>);
fun CloseWindow();
fun BeginDrawing();
fun EndDrawing();
}

ब्लॉक यूनिट घोषणा और फ़ंक्शन यूनिट घोषणा अर्थ में पूरी तरह से समान हैं, यह बस पठनीयता और संरचना के लिए एक सिंटैक्स है।


प्रतीक नाम निर्दिष्ट करें

कुछ ABI में, वेव फ़ंक्शन नाम और वास्तविक लिंक प्रतीक नाम मेल नहीं खा सकते हैं। इस मामले में, बाहरी फ़ंक्शन के जुड़े होने के वास्तविक प्रतीक नाम को स्ट्रिंग के रूप में निर्दिष्ट किया जा सकता है।

फ़ंक्शन यूनिट प्रतीक निर्दिष्ट करें

extern(c, "puts")
fun rust_func(i32);

यह घोषणा 'rust_func' कॉल करते समय वास्तविक लिंक प्रतीक के रूप में 'puts' का उपयोग करने के लिए निर्दिष्ट करती है।


ब्लॉक यूनिट प्रतीक निर्दिष्ट करें

ब्लॉक यूनिट घोषणा में, प्रत्येक फ़ंक्शन के पीछे प्रतीक नाम को व्यक्तिगत रूप से निर्दिष्ट किया जा सकता है।

extern(c) {
fun my_puts(ptr<i8>) "puts";
fun my_strlen(ptr<i8>) "strlen";
}

पॉइंटर प्रकार

पॉइंटर्स को ptr<T> रूप में दर्शाया जाता है।

ptr<u8>
ptr<MyStruct>

ptr<T> बाहरी भाषा के पॉइंटर से सीधे मेल खाता है, और मेमोरी स्वामित्व या जीवन चक्र Wave द्वारा प्रबंधित नहीं किया जाता।


संरचना का उपयोग

संरचना को बाहरी फ़ंक्शन के पैरामीटर या रिटर्न वैल्यू के रूप में उपयोग किया जा सकता है।

struct Color {
r: u8,
g: u8,
b: u8,
a: u8,
}

FFI में संरचना का उपयोग करते समय, फ़ील्ड क्रम घोषित क्रम को बनाए रखता है और ABI द्वारा आवश्यक मेमोरी लेआउट का पालन करते हैं।


बाहरी फ़ंक्शन कॉलिंग

extern के रूप में घोषित कार्यों को सामान्य कार्यों की तरह ही कॉल किया जाता है।

fun main() -> i32 {
InitWindow(800, 600, "Wave");
BeginDrawing();
EndDrawing();
CloseWindow();
return 0;
}

कॉल के समय कोई सिंटैक्टिक अंतर नहीं है, और कॉल कन्वेंशन और प्रतीक लिंक पूरी तरह से ABI और लिंक द्वारा प्रबंधित किए जाते हैं।


लिंकिंग

बाहरी फ़ंक्शन की वास्तविक कार्यान्वयन लिंक चरण में बाहरी पुस्तकालय से प्राप्त की जाती है। Wave कंपाइलर बाहरी फ़ंक्शन कॉलिंग के लिए ऑब्जेक्ट फाइल बनाता है, और लिंक निर्दिष्ट पुस्तकालय के माध्यम से प्रतीक हल करता है।

पुस्तकालय निर्दिष्ट करने की विधि बिल्ड टूल्स और CLI विकल्प के माध्यम से की जाती है।


सीमाएं

Wave निम्नलिखित सुविधाएँ प्रदान नहीं करता।

  • फ़ंक्शन पॉइंटर
  • कोलबैक फ़ंक्शन
  • स्वचालित मेमोरी प्रबंधन
  • भाषा के बीच अपवाद हैंडलिंग एकीकरण

ये विशेषताएँ बाद के संस्करणों में अलग से संबोधित की जा सकती हैं।