2008-09-25 18 views
8

मैं कुछ सी कोड को पायथन कोड या बाइटकोड में अनुवाद करना चाहता हूं। प्रश्न में सी कोड वह है जिसे मैं पूरी तरह से एल्गोरिदमिक कहूंगा: मंच स्वतंत्र, कोई I/O, केवल एल्गोरिदम और इन-मेमोरी डेटा संरचनाएं।अनुवाद एल्गोरिदमिक सी से पायथन

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

आप किस विशिष्ट दृष्टिकोण, उपकरण और तकनीकों की सिफारिश कर सकते हैं?


नोट: अजगर सी विस्तार या ctypes एक विकल्प नहीं क्योंकि पर्यावरण सैंडबॉक्स जाता है।

एक और टिप्पणी: लग रहा है कि वहाँ एक C-to-Java-bytecode compiler है की तरह, वे भी जावा के लिए libjpeg संकलित। क्या जावा बाइटकोड + वीएम सीपीथॉन बाइटकोड + वीएम से बहुत अलग है?

उत्तर

0

क्यों सी कोड और creating a Python C module जो एक चल अजगर वातावरण में आयात किया जा सकता रखने नहीं?

+0

पायथन सी एक्सटेंशन एक विकल्प नहीं है क्योंकि पर्यावरण sandboxed है। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न अपडेट किया। – Constantin

0

सबसे पहले, मैं pythonic अच्छाई के साथ मौजूदा सी पुस्तकालय लपेटकर एक अजगर मॉड्यूल के रूप में एक एपीआई प्रदान करने के लिए विचार करना चाहते हैं। मैं swig, ctypes, pyrex, और इन दिनों वहाँ और भी बाहर देखो देखेंगे। सी लाइब्रेरी स्वयं अपरिवर्तित रहेगी। काम बचाता है

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

मैं Pyrex उल्लेख किया - इस सी के समान है लेकिन यह भी अजगर उन्मुख एक भाषा है। मैंने इसके साथ बहुत कुछ नहीं किया है, लेकिन यह शुद्ध पायथन लिखने से आसान हो सकता है, यह देखते हुए कि आप सी के साथ एक गाइड के रूप में शुरू कर रहे हैं।

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

+0

"मैक्रो जादू" एक मौलिक मुद्दा नहीं है, इसे एक प्रीप्रोसेसर पास से हटा दिया जाता है। – Constantin

12

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

ज्यादा, सामान्य रूप में ज्यादा बेहतर दृष्टिकोण सी सी सीधे ctypes का उपयोग कर रखने के लिए, और एक अजगर विस्तार मॉड्यूल (SWIG, Pyrex, या writing a wrapper manually का उपयोग) में लपेट या कॉल सी पुस्तकालय वास्तव में है। पाइथन में किसी भी कोड के लिए पहले से ही सी या आप बाद में जोड़ने के लिए सी के सभी लाभ (और डाउनसाइड्स) और पाइथन की सभी सुविधा (और डाउनसाइड्स)।

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

0

पाइथन की शक्ति का उपयोग न करने के लिए कोई भी स्वचालित अनुवाद भुगतना होगा। सीधे पाइथन में अनुवाद किए जाने पर सी-प्रकार प्रक्रियात्मक कोड बहुत धीरे-धीरे चलाएगा, आपको अधिक से अधिक पायथन-अनुकूलित कोड के साथ संपूर्ण अनुभागों को प्रोफ़ाइल और प्रतिस्थापित करने की आवश्यकता होगी।

3

सबसे तेज़ तरीका (प्रोग्रामर प्रयास, नहीं दक्षता के मामले में) शायद एक मौजूदा संकलक का उपयोग कर शामिल होगा कुछ सरल (उदाहरण के LLVM के लिए) के लिए सी संकलित करने के लिए और या तो:

  • व्याख्या कि अजगर में (अत्यधिक प्रदर्शन दंड)
  • का अनुवाद है कि अजगर (विशाल प्रदर्शन दंड) के
  • अजगर बाईटकोड (बड़ा प्रदर्शन दंड)

ट्रा है कि अनुवाद करते हैं nslating सी से पायथन सीधे संभव है (और शायद उपर्युक्त दृष्टिकोण की तुलना में तेज़ कोड उत्पन्न करता है), लेकिन आप अनिवार्य रूप से एक सी संकलक बैकएंड लिखना चाहते हैं, जो एक बड़ा काम है।

संपादित करें, बाद में विचार किया गया: ऐसा करने का एक और भी तेज़ और गंदा तरीका सी कोड के लिए पार्स पेड़ लेना है, इसे एक पायथन डेटा संरचना में बदलना और पायथन में इसकी व्याख्या करना है।

+0

मैंने एलएलवीएम के बारे में सोचा था, लेकिन इसे समझने के बारे में नहीं सोचा था। अच्छी बात। – Constantin

+0

ठीक है, शायद पाइथन में सीधे सी पार्स पेड़ की व्याख्या करना आसान होगा - एक संपादन में जोड़ा गया। –

-1

आप हमेशा सी कोड संकलित कर सकते हैं, और पाइथन में ctypes का उपयोग कर पुस्तकालयों में लोड कर सकते हैं।

+0

यह मैं नहीं था जिसने आपको कम किया, लेकिन मैं समझ सकता हूं - कृपया सवाल पर ध्यान दें।लक्ष्य पर्यावरण sandboxed है और केवल शुद्ध पायथन मॉड्यूल स्वीकार करता है। – Constantin

+0

सहमत .. मेरी गलती। –

0

मैं व्यक्तिगत रूप से सी कोड से uml sheme निकालने के लिए एक उपकरण का उपयोग करता हूं, फिर इसे पायथन कोड उत्पन्न करने के लिए उपयोग करें।

इस स्क्लेटन से, मैं अनावश्यक सी-स्टाइल संरचनाओं से छुटकारा पाने के लिए शुरू कर रहा हूं और फिर मैं पाइथन कोड के साथ विधियों को भर दूंगा।

मुझे लगता है कि यह सुरक्षित और फिर भी सबसे प्रभावी तरीका होगा।

+0

आप किस उपकरण का उपयोग करेंगे और आप कौन सा यूएमएल आरेख उत्पन्न करेंगे? स्टेटिक क्लास आरेख? : -एस – Constantin

+0

पावर एएमसी नौकरी करेगा, लेकिन यह बहुत महंगा है। और हां, मैं किसी अन्य व्यक्ति को नहीं सोचता कि स्थैतिक वर्ग आरेखों को स्वचालित प्रक्रिया द्वारा कुशलतापूर्वक पर्याप्त रूप से प्रस्तुत किया जा सकता है। तो आपको सी से पायथन तक कक्षा तर्क का अनुवाद करना होगा। लेकिन यह अभी भी इतना आसान है कि खरोंच से सब कुछ कर रहा है। –

1

शुद्ध पायथन में एक सी दुभाषिया लिखें? ;-)

+0

हे, थॉमस, क्या आपकी अगली परियोजना किसी भी मौके से है? :) – Constantin

+0

अगर मुझे ऐसा जानवर लिखना पड़ा तो मैं निश्चित रूप से पायथन का उपयोग करता। लेकिन मुझे नहीं करना है ... – theller

4

इंडेंट (1) और सीटीपी (1) का उपयोग करें ... अतिरिक्त क्रेडिट टेस्ट गति के लिए ... क्रेडिट बोनस क्रेडिट उपयोग पाइस्ट्रा असेंबली कोड उत्पन्न करने के लिए।

भाषा के बावजूद आपको हमेशा रन-टाइम स्पेस (सीपीयू) या मेमोरी-स्पेस (रैम) के बीच विभिन्न संरचनाओं और कार्यों के आउटपुट को संग्रहित करना होगा।

महान भाषा शूटआउट पता लगाएं कि आपको यह देखने के लिए कि मैं क्या किसी भी तरह के बारे में बात कर रहा हूँ इस बहुत ज्यादा कंप्यूटर अनुप्रयोग विज्ञान दंभ है चाहते हैं ...

यहाँ एक उदाहरण है, फ्लोटिंग का उपयोग किए बिना चल बिन्दु गणित का उपयोग करना चाहते बिंदु संख्या?

x * 1,000,000 = a 
y * 1,000,000 = b 
a {function} b = result 
result/1,000,000 = z 

झमेले में न करो, आदि मिलता है, गुफा गणित का उपयोग करता है, तो आप के लिए है।

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