2013-04-05 14 views
8

से C++ निष्पादित करें स्ट्रिंग चर से C++ कोड निष्पादित करने के लिए C++ में यह संभव है। जावास्क्रिप्ट में तरह:स्ट्रिंग वेरिएबल

var theInstructions = "alert('Hello World'); var x = 100"; 

var F=new Function (theInstructions); 

return(F()); 

मैं सी में जैसे Javascript ++ बहुत कुछ इसी तरह चाहते हैं। उसको कैसे करे ?

+0

नहीं। यह। आपको अपने ऐप के भीतर पूरे सी ++ कंपाइलर कॉम्प्लेक्स को ऐसी चीज के लिए दूरस्थ रूप से संभव होने के लिए एम्बेड करना होगा। –

+3

यदि आप एक एम्बेडेड स्क्रिप्टिंग भाषा चाहते हैं, तो लुआ पर विचार करें। –

+0

@jrok: बेशक यह है। मैंने वास्तव में अतीत में ऐसा कुछ किया था (मेरे द्वारा एक पुराने रे ट्रैसर के लिए सॉफ़्टवेयर शेडर कार्यान्वयन के लिए)। एकमात्र "जादू" एक कंपाइलर का आह्वान करना है। –

उत्तर

7

आप एक संकलक आह्वान करने के लिए कोड को संकलित करने की आवश्यकता होगी। इसके अलावा, आपको फ़ंक्शन घोषणा में स्ट्रिंग को लपेटने के लिए कुछ कोड उत्पन्न करने की आवश्यकता होगी। अंत में, आपको किसी भी तरह संकलित कोड लोड करने की आवश्यकता होगी।

यदि मैं यह कर रहे थे (जो मैं करूंगा नहीं) मैं करूंगा:

  1. जुटना कोड के चारों ओर एक मानक आवरण समारोह हैडर
  2. कमांड लाइन (system()) का निर्माण करने के माध्यम से एक संकलक आह्वान एक साझा पुस्तकालय (linux पर खिड़कियों पर .dll या .so)
  3. साझा लाइब्रेरी को लोड करें और समारोह
  4. Invok नक्शा ई समारोह

यह वास्तव में ऐसा नहीं है कि आप ज्यादातर मामलों में सी कोड लिखना चाहते हैं।

+0

यह एक योजना की तरह लगता है, और मुझे रूचि है। क्या आप एक विंडोज़ सरल उदाहरण के साथ आ सकते हैं? – Jigberto

+3

@ जिगबर्टो: आपने जाहिर तौर पर यहां उत्तरों के अंतर्निहित अर्थ को नहीं पकड़ा है। इसके बारे में कुछ भी आसान नहीं है, क्योंकि यह सी ++ के बारे में नहीं है। और यदि आप एक साधारण उदाहरण के लिए पूछते हैं, तो आपको इस "योजना" में "रुचि" नहीं होना चाहिए। – DevSolar

+0

@ डेवसोला अच्छी तरह से, जवाब मेरी जरूरतों के अनुरूप है :) इसलिए मुझे इसे और अधिक वास्तविक बनाने में खुशी है। मुझे पता है कि सी ++ इस तरह डिज़ाइन नहीं किया गया था, लेकिन हम चीजों में सीमित नहीं हैं, और हम हमेशा कामकाज पा सकते हैं। मुझे जवाब पसंद है, और जिसे लूचियन ग्रिगोर – Jigberto

5

सीधे, नहीं। लेकिन आप कर सकते हैं:

  • उस स्ट्रिंग को फ़ाइल में लिखें।
  • संकलक का आह्वान करें और उस फ़ाइल को संकलित करें।
  • परिणामी बाइनरी निष्पादित करें।
3

सी ++ संकलित भाषा है। आप सी ++ स्रोत को मशीन कोड, निष्पादन योग्य में संकलित करते हैं। वह लोड और निष्पादित है। कंपाइलर सी ++ के बारे में जानता है (और इसमें सभी लाइब्रेरी हेडर उपलब्ध हैं)। निष्पादन योग्य नहीं है, और यही कारण है कि यह एक स्ट्रिंग निष्पादन योग्य कोड में नहीं बदल सकता है। तुम्हें पता है, वास्तव में, एक स्ट्रिंग की सामग्री को निष्पादित कर सकते हैं अगर यह मशीन कोड निर्देश को रोकने के लिए होता है, लेकिन है कि आम तौर एक बहुत बुरा विचार है ...

मतलब यह नहीं है कि यह है कि यह संभव नहीं होगा इस तरह के रन-टाइम संकलन करने के लिए। बहुत कम (अगर, वास्तव में, कुछ भी) सी ++ में असंभव है। लेकिन आप जो कर रहे हैं वह एक सी ++ कंपाइलर ऑब्जेक्ट को कार्यान्वित करेगा ... यह तय करने से पहले कि आप वास्तव में यह चाहते हैं, अन्य कंपाइलर परियोजनाओं को देखें।

व्याख्या की गई भाषाएं आसानी से ऐसा कर सकती हैं - उन्हें केवल उस स्ट्रिंग को पास करना होगा जो पहले से ही प्रोग्राम चला रहा है। वे अन्य संबंधों में इस तरह की लचीलापन के लिए भुगतान करते हैं।

0

संक्षिप्त उत्तर नहीं है। हैकर्स का क्षेत्र का दिन होगा। हालांकि आप Java/VB स्क्रिप्ट का उपयोग करने के लिए Windows IActiveScriptSite इंटरफ़ेस का उपयोग कर सकते हैं। Google IActiveScriptSite, वेब पर कई उदाहरण हैं। या आप जो कर रहे हैं वह कर सकते हैं, अपना खुद का स्क्रिप्ट इंजन रोल करें।

8

नहीं, सी ++ एक स्थिर टाइप किया गया है, जिसे देशी बाइनरी भाषा में संकलित किया गया है।

हालांकि आप रनटाइम को बाधित किए बिना एलएलवीएम जेआईटी संकलन, संकलन और लिंक का उपयोग कर सकते हैं। ऐसा करने योग्य होना चाहिए, लेकिन यह सिर्फ C++ के डोमेन में नहीं है।

यदि आप सी ++ के तहत एक स्क्रिप्टिंग इंजन चाहते हैं, तो आप उदाहरण के लिए जेएस का उपयोग कर सकते हैं - यह अब तक का सबसे तेज़ गतिशील समाधान है। लुआ, पायथन, रुबी ठीक है, लेकिन आम तौर पर धीमी है, जो कि एक भयानक बात नहीं हो सकती है क्योंकि आप इसे स्क्रिप्टिंग के लिए उपयोग कर रहे हैं।

उदाहरण के लिए, क्यूटी में आप की तरह कुछ कर सकते हैं:

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QScriptEngine engine; 
    QScriptValue value = engine.evaluate("var a = 20; var b = 30; a + b"); 

    cout << value.toNumber(); 

    return a.exec(); 
} 

और आप 50 मिल जाएगा;)

+0

आप लुआजिट के बारे में भूल गए हैं, जो निकट है, अगर पहले से नहीं है, तो सबसे तेज़ –

+0

@ डब्लू.बी. होने के नाते। हाँ लुआजिट काफी तेज दिखता है। इच्छा है कि अन्य भाषाओं की तुलना में सिर की ओर मुड़ें, लेकिन उनकी साइट पर बेंचमार्क केवल लुआ से तुलना करते हैं। – dtech

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