خيارات إعادة بيع ديون أجزاء من رمز بعيدا عن الأم C++?

StackOverflow https://stackoverflow.com/questions/147378

سؤال

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

ولكن ماذا إذا كنت تبدأ مع الأم C++ التطبيق ؟ ما هي الخيارات التي لديك إذا كنت تريد أن تكتب سهلة بت أو ريفاكتور القديمة بت في اللغة مثل Python, Ruby, C#, أو أيا كان ؟ نضع في اعتبارنا أن نقل البيانات بين الأم وغيرها من الجانبين يجب أن يكون.كونها قادرة على مجرد استدعاء دالة خطية في "أسهل" اللغة ، بينما يمر C++ فئات البيانات ، من شأنه أن تكون جميلة.

لدينا يابس Win32 التطبيق التي من شأنها أن تستفيد كثيرا إذا نحن يمكن أن كرنك رمز جديد ، أو ريفاكتور القديمة البرمجية في C# أو شيء من هذا.القليل جدا من ذلك يتطلب تعقيد C++ و التعامل مع القليل ذكي بت هو سحب أسفل عملية البرمجة.

هل كانت مفيدة؟

المحلول

كما هارون فيشر يشير محاولة إعادة التحويل البرمجي C++ التطبيق مع /clr تشغيل الخيار ومن ثم البدء في الاستفادة .صافي منصة.

CLI/C++ من السهل جدا لالتقاط إذا كنت تعلم C# و C++ بالفعل ويوفر الجسر بين .صافي العالم و الأم C++.

إذا كان الخاص بك الحالي رمز C++ لا يمكن ترجمة نظيفة مع /clr تشغيل ثم أقترح محاولة لبناء التطبيق الخاص بك كما ثابت lib (بدون /clr تمكين) ثم قد الرئيسي الخاص بك() في CLI/C++ المشروع أن يدعو الإرث الخاص بك التطبيق نقطة الدخول.بهذه الطريقة يمكنك على الأقل أن تبدأ الاستفادة .صافي الوظائف الجديدة.

للحصول على أمثلة من "إرث" C/C++ التطبيقات التي تم "استدار" أن .صافي CLI/C++ تحقق .صافي الموانئ الزلزال 2 و زلزال 3:الساحة.

نصائح أخرى

حسنا, انها حقا يتوقف على اللغة.بيثون التواصل ، على سبيل المثال ، هو أكثر يمكن القيام به بسهولة مع زيادة Python والعديد من اللغات الأخرى التي سوف تتطلب منك أن واجهة لهم كما تفعل مع C ، C مكتبة معلنا الخاص بك الاسترجاعات إلى extern "C" (المؤسف أنه لا يمكنك استخدام فئة C++ التعاريف في اللغات الأخرى عادة).

ولكن أود أن اسأل أيضا ما كنت تنوي استخدامه مثل C++ هي لغة معقدة ، ولكن مرة واحدة يمكنك الحصول على دراية به ، هو قوي جدا جدا وليس أصعب بكثير من المدونة من غيرها من اللغات.فقط جيدة حقا استثناء أنا أفكر إذا كنت تخطط لاستخدام مكتبة القوية التي لا توجد إلا في لغة واحدة و لا يوجد لائق C++ البديلة (مكتبات الرسومات هي على الأرجح أفضل مثال على ذلك لأن عليك أن تكون على دراية لهم استخدامها على نحو فعال).

كما انها تجدر الإشارة إلى أنه إذا كنت واجهة رمز C++ إلى لغة أخرى ، أنت تخسر على جملة منصة التوافق الممنوحة من تلك اللغة.

إذا كنت ترغب في العمل بين C++ و الثعبان من دفعة الثعبان هو ما كنت أبحث عنه.يمكنك كتابة C الثعبان الارتباطات باليد لمدة Cython ، ولكن هذا يحد في العديد من الطرق كيف أنت ذاهب إلى كتابة التعليمات البرمجية الخاصة بك.هذه هي أسهل طريقة ، كما رأينا في بعض قصاصات من هذا البرنامج التعليمي:

وظيفة بسيطة أن ينفذ مرحبا العالم:

char const* greet()
{
   return "hello, world";
}

دفعة كود بايثون اللازمة لفضح إلى الثعبان:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

كيفية استخدام هذا الرمز من الثعبان:

>>> import hello_ext
>>> print hello.greet()
hello, world

تسير في الاتجاه المعاكس هو أصعب قليلا لأن الثعبان لا تجمع إلى التعليمات البرمجية الأصلية.يجب عليك تضمين مترجم بايثون في C++ التطبيق ، ولكن العمل اللازمة للقيام بذلك هو توثيق هنا.هذا هو مثال على استدعاء مترجم بايثون و استخراج النتيجة (مترجم بايثون يحدد فئة الكائن للاستخدام في C++):

object result = eval("5 ** 2");
int five_squared = extract<int>(result);

يمكنك تغيير الشائعة لغة وقت التشغيل دعم في c++ المشروع /clr.من هذه النقطة يمكنك استخدام أي .صافي وظائف في c++ code.وهذا يشمل إنشاء winforms في المشروع الخاص بك وكذلك.يمكنك أيضا إضافة c# مكتبة مقابض واجهة المستخدم وظائف أخرى.

في .صافي العالم دائما يكون لديك خيار crreating COM/ActiveX طبقة إمكانية التشغيل المتداخل الخاص بك C#/VB.صافي الجمعية.

ثم يمكنك استخدام العادي COM API من C++ تطبيق لإنشاء مثيل من هذه COM server فعلا يلتف الخاص بك .صافي الجمعية.

الشيء الجيد في هذا هو أن المعلمات بسيطة مثل int, منطقي, سلسلة, تطفو الخ يتم تعيين إلى COM يعادل بالنسبة لك.لكن على حد علمي أنه ليس من الممكن أن تمر بسهولة كاملة .صافي الكائنات (حالات الدراسة إنشاء).

أيضا أن ندرك أن interop COM المكالمات بطيئة نسبيا.يجب أن لا تكون الدعوة COM interop طريقة باستمرار من C++ في حلقة ضيقة.

COM/ActiveX تعتمد تقليديا على سجل ويندوز ، ليست مثالية كما هو كبير التبعية.ومع ذلك فمن الممكن أيضا استخدام التسجيل مجانا Interop COM لتجنب هذه التبعية.

هذه المادة يغطي الخطوات المطلوبة لتسجيل .صافي الجمعية COM إمكانية التشغيل المتداخل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top