पहले जब कोड-बेस सी ++ में था, तो मेरे पास सी ++ रैपर फाइलें थीं जो कोड बेस से लिंक होंगी और मैं swig
(सी ++ 11 समर्थन के लिए संस्करण 3) चलाने के लिए चलाऊंगा लक्षित भाषा के लिए इंटरफ़ेस फ़ाइलें (पायथन, जावास्क्रिप्ट, सी #, आदि)। फिर निश्चित रूप से इन सभी फ़ाइलों और पुस्तकालयों को एक साझा ऑब्जेक्ट में संकलित करें और इसे आवश्यक भाषाओं से लिया गया है। अब कोड बेस जंग में बदल दिया जा रहा है। तो काम करने के लिए स्विग के लिए मेरे पास निम्न है:अन्य भाषाओं से जंग का उपयोग कैसे करें
- मुख्य जंग कोड फ़ाइल एक आरएलआईबी में संकलित।
- जंग कोड रैपर फ़ाइल जो मुख्य कोड बेस में कॉल करती है लेकिन
no_mangle
औरextern
FFI
के लिए वाक्यविन्यास का उपयोग करती है और एक staticlib में संकलित करता है। - एक सी फ़ाइल जो जंग रस्सी को बुलाती है और इसकी प्रतिकृति है।
अब मैं सी फाइल पर swig
का उपयोग करें, लक्षित भाषा के लिए इंटरफ़ेस फ़ाइल मिलता है, लक्षित भाषा से एक साझा वस्तु में सभी फाइलों (दो कदम और तीन) और बड़ा घूँट इंटरफ़ेस फ़ाइल) गठबंधन और कॉल ।
तो:
दृष्टिकोण ठीक है?
मुझे काम करने के लिए नि: शुल्क कार्य मिल सकते हैं। हालांकि मैं काम करने के लिए सदस्य कार्य (विधियों) को कैसे प्राप्त करने के बारे में उलझन में हूं। सी ++ में सदस्य कार्यों का पहला पैरामीटर अंतर्निहित
this
पॉइंटर है। इसलिए मैंvoid*
सी इंटरफ़ेस के लिए कक्षा या संरचना को संभाल सकता हूं जो इसे स्टोर करना चाहता था (जैसे फ़ायरफ़ॉक्स के लिए jsctypes) और फिर इसेreinterpret_cast
को कंक्रीट/वास्तविक प्रकार में प्राप्त करने और फिर से प्राप्त करने पर उस पर सदस्य समारोह। मैं जंग के साथ यह कैसे करूँ?
जैसे,
pub struct A { id: SomeType, }
impl A {
pub fn some_funct_0(&mut self) {}
pub fn some_funct_1(&self) {}
}
impl SomeTrait for A {
fn some_trait_funct(&mut self) {}
}
तो मैं कैसे लक्ष्य भाषाओं से (अप्रबंधित और ढेर मुझे लगता है पर होना चाहिए?) A
की एक वस्तु पर इन सदस्य कार्यों का उपयोग करते हैं (पायथन, सी के लिए, आदि) या यहां तक कि बस एक सी इंटरफेस?
विधि परिभाषाओं में, 'स्वयं' स्वयं के लिए 'स्वयं', स्वयं 'और स्वयं' के लिए चीनी है: स्वयं और स्वयं के लिए 'स्वयं' और 'mut mut' : और म्यूट Self'। निश्चित रूप से, 'स्वयं' कीवर्ड * अभी भी जंग में विशेष है, लेकिन 'ए :: some_trait_funct' और' ए :: some_funct_0' अभी भी उनके पहले पैरामीटर के प्रकार के रूप में 'और mut A' के साथ कार्य करता है। –
आप एक कंपाइलर-प्लगइन के माध्यम से अपनी खुद की विशेषता बनाने का प्रयास कर सकते हैं, जो स्वचालित रूप से 'no_mangle' डालता है, उस फ़ंक्शन के लिए एक सी-हेडर फ़ाइल बनाता है और उस पर स्विग चलाता है। –