2010-05-10 13 views
16

मैं एक क्रॉस-प्लेटफ़ॉर्म (मैक ओएस एक्स, विंडोज़ और लिनक्स) एप्लिकेशन को लागू करने की प्रक्रिया में हूं जो वित्तीय डेटा के बहुत सारे सीपीयू गहन विश्लेषण करेगा। विश्लेषण इंजन का बड़ा हिस्सा सी ++ में गति कारणों से लिखा जाएगा, उपयोगकर्ता-सुलभ स्क्रिप्टिंग इंजन सी ++ परीक्षण इंजन के साथ इंटरफेसिंग के साथ। मैं मौजूदा बड़े उपयोगकर्ता अड्डों के साथ अन्य लोकप्रिय सॉफ्टवेयर अनुकरण करने के लिए समय के साथ कई स्क्रिप्टिंग फ्रंट-एंड लिखना चाहता हूं। पहला मोर्चा विजुअलबासिक जैसी स्क्रिप्टिंग भाषा होगी।एलएलवीएम जेआईटी कोड को स्टेटिक एलएलवीएम पुस्तकालयों से जोड़ना?

मैं सोच रहा हूँ कि LLVM मेरी जरूरतों के लिए एकदम सही होगा। डेटा की भारी मात्रा के कारण प्रदर्शन बहुत महत्वपूर्ण है; उत्तर पाने के लिए परीक्षणों के एक रन को चलाने में घंटों या दिन लग सकते हैं। मेरा मानना ​​है कि एलएलवीएम का उपयोग करने से मुझे एक बैक-एंड समाधान का उपयोग करने की इजाजत मिल जाएगी, जबकि मैं समय के साथ स्क्रिप्टिंग भाषा के विभिन्न स्वादों के लिए अलग-अलग फ्रंट-सिरों को लागू करता हूं।

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

मैंने लिखा एक समान वाणिज्यिक परीक्षण प्रणाली के पिछले कार्यान्वयन में, मैंने एक तेज़ दुभाषिया बनाया जो आसानी से परीक्षण पुस्तकालय में हस्तक्षेप करता था क्योंकि यह सी ++ में लिखा गया था और सीधे परीक्षण इंजन लाइब्रेरी से जुड़ा हुआ था। लाइब्रेरी ऑब्जेक्ट्स की जांच करने के लिए स्क्रिप्टिंग कोड से कॉलबैक में महत्वपूर्ण ओवरहेड वाले प्रारूपों के बीच अनुवाद शामिल था।

मैं कल्पना कर रहा हूं कि एलएलवीएम के साथ, मैं कॉलबैक को सी ++ में सीधे कार्यान्वित कर सकता हूं ताकि मैं स्क्रिप्टिंग कोड लगभग उसी तरह काम कर सकूं जैसे यह सी ++ में लिखा गया हो। इसी प्रकार, यदि सभी कोड को एलएलवीएम बाइट-कोड प्रारूप में संकलित किया गया था, ऐसा लगता है कि एलएलवीएम अनुकूलक स्क्रिप्टिंग भाषा और सी ++ में लिखे गए परीक्षण इंजन कोड के बीच की सीमाओं में अनुकूलित कर सकते हैं।

मैं नहीं चाहता कि परीक्षण इंजन हर बार संकलन करने के लिए। आदर्श रूप में, मैं केवल जेआईटी को केवल स्क्रिप्टिंग कोड संकलित करना चाहता हूं। छोटे परीक्षणों के लिए, मैं कुछ अनुकूलन पास छोड़ दूंगा, जबकि बड़े परीक्षणों के लिए, मैं लिंक के दौरान पूर्ण अनुकूलन करता हूं।

तो यह संभव है? क्या मैं परीक्षण इंजन को .o ऑब्जेक्ट फ़ाइल या .a लाइब्रेरी फ़ाइल में प्रीकंपाइल कर सकता हूं और फिर जेआईटी का उपयोग करके स्क्रिप्टिंग कोड में लिंक कर सकता हूं?

अंत में, आदर्श, मैं पटकथा कोड एक विशिष्ट सी ++ वर्ग के लिए उपवर्गों के रूप में विशिष्ट तरीकों को लागू करना चाहते हैं। इसलिए सी ++ परीक्षण इंजन केवल सी ++ ऑब्जेक्ट्स देखेगा जबकि जेआईटी सेटअप कोड ने स्क्रिप्टिंग कोड संकलित किया था जो ऑब्जेक्ट्स के कुछ तरीकों को लागू करता था। ऐसा लगता है कि अगर मैंने सही नाम मैंगलिंग एल्गोरिदम का उपयोग किया है तो यह सी ++ विधि कॉल की तरह दिखने के लिए स्क्रिप्टिंग भाषा के लिए एलएलवीएम पीढ़ी को स्थापित करना अपेक्षाकृत आसान होगा जिसे तब परीक्षण इंजन में जोड़ा जा सकता है।

इस प्रकार लिंकिंग चरण दो दिशाओं में जाएगा, स्क्रिप्टिंग भाषा से परीक्षण इंजन ऑब्जेक्ट्स में मूल्य निर्धारण जानकारी प्राप्त करने और राज्य की जानकारी की जांच करने के लिए कॉल करें और कुछ विशेष सी ++ ऑब्जेक्ट्स के तरीकों के परीक्षण इंजन से कॉल करें जहां कोड प्रदान किया गया था सी ++ से नहीं बल्कि पटकथा भाषा से।

सारांश में:

1) मैं JIT संकलन, कोड पीढ़ी की प्रक्रिया के हिस्से के रूप में precompiled (या तो .bc, ओ, या ए) फ़ाइलों में लिंक कर सकते हैं?

2) मैं इस तरह से है कि मैं कोड के रूप में अगर यह सब सी ++ में लिखा गया था में कार्य करता है कि बनाने के लिए कर रहा हूँ में ऊपर 1 में प्रक्रिया का उपयोग कर) कोड में लिंक कर सकते हैं?

उत्तर

14
  1. हाँ हम कर सकते हैं! एलएलवीएम के संस्करण के आधार पर आप अलग-अलग एपीआई कॉल का उपयोग करते हैं। आपको 2.5 पर llvm :: getBitcodeModuleProvider की आवश्यकता होगी।
  2. सी ++ फ़ंक्शंस को कॉल करने का सबसे आसान तरीका फ्लैग llvm :: फ़ंक्शन :: बाहरी लिंकिंग का उपयोग करके एक फ़ंक्शन (llvm :: फ़ंक्शन :: बनाएं) बनाना है और फिर अपने C++ फ़ंक्शन को इंगित करने के लिए addGlobalMapping जोड़ना है।
+0

आपकी मदद के लिए धन्यवाद। मैं इसे देख लूंगा। – inflector

3
  1. मुझे विश्वास है।
  2. यह बालों वाली है। आपको उन कार्यों के C++ ABI से मिलान करने की आवश्यकता है, जिन्हें आप कॉल कर रहे हैं, और यह सुनिश्चित करने की आवश्यकता है कि जेनरेट कोड समान डेटा संरचनाओं, कक्षाओं, लेआउट इत्यादि का उपयोग करता है (हेडर फ़ाइलों के बराबर के माध्यम से)। सी ++ एबीआई में काफी बारीकियों और पोर्टेबिलिटी मुद्दे हैं। शायद पहले सी के साथ इंटरऑप करने के साथ प्रोटोटाइप। clang अभी सी ++ के लिए सीमित समर्थन है।
1

1) आप लोड और लिंक कर सकते हैं .bc फ़ाइलें, .o फ़ाइलें अगर उन्हें किसी के साथ सम्मिलित किया गया है। इसलिए संग्रह लोड करने योग्य होना चाहिए और उनमें प्रतीकों का उपयोग करने में सक्षम होना चाहिए।

2) जब तक आप कॉलबैक के साथ भयानक चीजें नहीं करना चाहते हैं, तो आप शायद मानक सी फ़ंक्शन पॉइंटर्स पास कर सकते हैं और फ़ंक्शन पॉइंटर्स द्वारा कॉलबैक कर सकते हैं। आप कुछ अन्य चीजें भी कर सकते हैं, लेकिन सी ++ ऑब्जेक्ट्स या टेम्पलेट्स को परिभाषित करने या सी ++ कंपाइलर होने के दौरान सदस्य फ़ंक्शंस को कॉल करने का प्रयास करने से निपटने के लिए कुछ ऐसा करना है जिसे आप नहीं करना चाहते हैं।

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

संबंधित मुद्दे