2009-07-11 25 views

उत्तर

16

वहाँ perlcc जो सी

करने के लिए पर्ल "अनुवाद"

है यह वास्तव में सी संकलक करने के लिए एक पर्ल; इसका उत्पादन केवल पर्ल दुभाषिया का एक बंडल है और आपके प्रोग्राम के पार्सड बाइटकोड है।

+2

perlcc और संबंधित बी :: मॉड्यूल सीपीएएन पर रेनी शहरी द्वारा अलग से बनाए रखा जाता है। –

+0

इस समय 'बी :: सी' और' बी :: सीसी 'दोनों टूटा हुआ प्रतीत होता है। –

9

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

+0

ठीक है, पर्ल ने डेटा प्रकार निर्धारित किए हैं, न कि उनमें से कई। समस्या यह है कि पर्ल गतिशील है। यह किसी भी कारकों के आधार पर अलग-अलग संकलित हो सकता है, और यह बदल सकता है कि संकलक आगामी स्रोत कोड के लिए कैसे कार्य करता है। –

26

इसका कैननिकल उत्तर MJD's "Why Not Translate Perl to C?" है।

+3

+1, अपने सोना पर्ल विशेषज्ञ बैज का आनंद लें। :) –

+0

-1, एमजेडी का पुराना ब्लॉग पोस्ट 2001 से है और पुराना है। आपको स्प्लिट और अन्य स्ट्रिंग हैंडलिंग फ़ंक्शंस के साथ अंतर नहीं मिलेगा, लेकिन आपको बहुत सारी मेमोरी बचत, स्टार्टअप टाइम, विनाश का समय और इंट, फ्लोट और एएसपी के लिए रन-टाइम मिलेगा। सरणी हैंडलिंग, जैसा कि एमजेडी ने अपनी पोस्ट के अंत में बताया था। उदाहरण देखें बी :: सीसी संकलित perl के साथ 6 गुना तेज बेंचमार्क के लिए http://blogs.perl.org/users/rurban/2012/10/optimizing-compiler-benchmarks-part-3.html। – rurban

+0

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

0

कनवर्टर को प्रोग्रामर कहा जाता है, और रूपांतरण प्रक्रिया प्रोग्रामिंग। गंभीरता से, पर्ल का उचित भाषा इतनी विशाल और शक्तिशाली है कि कोई भी कनवर्टर लिखने का प्रयास करने से जीवनभर के कार्य को देखेगा। इसके अतिरिक्त, प्रदर्शन सुधार में प्रभाव परिमाण का क्रम नहीं हो सकता है, तो परेशान क्यों?

2

मैंने पर्ल में एक बहुत बड़ा कार्यक्रम लिखा है जो एचटीएमएल और डेटाबेस क्वेरीज पर आधारित पीडीएफ बनाता है जो वर्चुअल रूप से ब्राउज़र की तरह काम कर रहा है। कुल स्रोत कोड मात्रा 1 एमबी से अधिक है। कार्यक्रम एचटीएमएल का मूल्यांकन करते हैं, एसक्यूएल प्रश्न बनाता है और डेटा पुनर्प्राप्त करता है, डिस्क पर छवियों की खोज करता है या उन्हें HTTP सर्वर से डाउनलोड करता है, एक दस्तावेज़ संरचना बनाता है, सभी लेआउट गणना करता है और अंत में, एक पीडीएफ उत्पन्न करता है।

मुझे यह पता लगाना था कि ऑपरेशन को कई तरीकों से कैसे बढ़ाया जाए। उस पर आधारित मैं कहता हूं कि पर्ल काफी तेज़ है, और कई कार्यों ने पर्ल में तेजी से और सफलतापूर्वक पूरा किया, सी में और सी ++ में भी काफी समय लगा।

पर्ल धीमा या स्मृति उपभोग करने के 2 तरीके हैं: जटिल डेटा संरचनाओं की एक बड़ी संख्या - उन्हें बहुत मेमोरी की आवश्यकता है - और बड़ी संख्या में गणना की आवश्यकता है। हां, पर्ल में गणना वास्तव में बहुत धीमी है।

$a = $b * $c 

पर्ल में काफी समय ले रहा है, लेकिन किसी भी संकलित भाषा में बहुत तेज़ है। यहां पर ऑपरेटर भी पूर्णांक हो सकते हैं, फ्लोटिंग पॉइंट वेरिएबल्स नहीं - यह धीमा है। मुझे लगता है कि यही कारण है कि पर्ल स्कोर भाषा शूटआउट प्रतियोगिता में बहुत खराब है [http://shootout.alioth.debian.org/](कंप्यूटर भाषा बेंचमार्क गेम)।

मुझे पता चला कि मेरा बहुत बड़ा कार्यक्रम -ट कई पर्ल कोर और अतिरिक्त सीपीएएन मॉड्यूल का उपयोग करता है - साथ ही साथ शुरूआत करने के बावजूद, जल्दी से शुरू करने के लिए।

यह बहुत अच्छा प्रदर्शन करता है ... जब तक कि टेक्स्ट आकार और लेआउट निर्देशांक की गणना की बात न हो जाए। बहुत समय लेने वाली चीजें। यह कहने के बाद, मैंने छोटे पर्ल परीक्षण कार्यक्रमों को सिर्फ लाखों अंकगणितीय गणनाएं लिखीं और उन्हें बहुत धीमी गति से पाया।

इसके अलावा, मैं प्रत्येक लेआउट तत्व को मॉडल करने के लिए उन्मुख दृष्टिकोण का उपयोग और उद्देश्य कर रहा हूं। प्रत्येक ऑब्जेक्ट को हैश द्वारा दर्शाया जाता है - कम से कम लगभग 10kbytes प्रति ऑब्जेक्ट। यदि प्रिंट करने के लिए बड़ी मात्रा में डेटा है, तो उस कार्यक्रम के लिए कई 100 एमबीसाइट्स की स्मृति खपत असामान्य नहीं है।

तो, मेरे पास अब भी लेआउट की गणना करने के लिए भाग लेने के लिए एक अच्छा कारण है, जिसमें structs का उपयोग किया गया है, जहां अब मेरे पास निश्चित कुंजी के साथ हैश है और सी पूर्णांक अंकगणित है जहां अब पर्ल धीमी नौकरी करता है।

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

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

+0

* "पर्ल में तेजी से और सफलतापूर्वक पूरा किए गए कई कार्य सी, और यहां तक ​​कि सी ++ में काफी समय लेते हैं।" * क्या आप इसके बारे में निश्चित हैं? याद रखें, पर्ल सी में लिखा गया है, इसलिए पर्ल जो कुछ भी कर रहा है वह पहले ही सी :-) में किया जा रहा है – psmears

1

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

100% सही आसान है: यदि आपकी पर्ल स्क्रिप्ट myperl.pl है तो सी प्रोग्राम void main(){system("perl myperl.pl")} ठीक से करेगा myperl.pl क्या करेगा; हालांकि यह बल्कि व्यर्थ है। perlcc कंपाइलर थोड़ा अधिक परिष्कृत है, लेकिन अभी भी बहुत अधिक लाभ नहीं लग रहा है। मैंने सादे पर्ल की तुलना में perlcc किसी भी तेज नहीं देखा है। इसके अलावा, जबकि पर्ल कोड को पढ़ने के लिए कुख्यात रूप से मुश्किल हो सकता है, मैं print "Hello World\n" को 700 लाइन लंबी राक्षसता से perlcc में अनुवाद करता हूं। मैंने इन कार्यक्रमों को कुछ भी नहीं देखा है जो एक कोड-समीक्षा के साथ-साथ लिखित सुरुचिपूर्ण सी कोड पास करेगा। ओटीओएच, यदि आप एक कंपाइलर चाहते हैं क्योंकि आप अपने स्रोत कोड को गैर-अप्रचलित तरीके से वितरित नहीं करना चाहते हैं, तो perlcc अद्भुत काम कर सकता है।

RPerl गति अप प्राप्त कर सकते हैं, लेकिन यह अनुवाद करने में बहुत सीमित है।

एक छोटे से "सुरुचिपूर्ण लेकिन सही नहीं" अनुवादक के उदाहरण के लिए, प्रोटोटाइप perl2c++.pl देखें। यह सी ++ - आईएमएस के साथ (कुछ) मानक पर्ल-इस्म्स को प्रतिस्थापित करके काम करता है। क्योंकि यह पर्ल की तरह एक उच्च स्तरीय भाषा है, लेकिन अभी भी सी

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

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

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