2008-09-22 19 views
22

सी ++ शायद static metaprogramming और Java doesn't support it के लिए सबसे लोकप्रिय भाषा है।जनरेटिंग प्रोग्रामिंग के लिए गैर-सी ++ भाषाएं?

क्या सी ++ के अलावा कोई अन्य भाषाएं हैं जो जेनरेटिव प्रोग्रामिंग (प्रोग्राम बनाने वाले प्रोग्राम) का समर्थन करती हैं?

+1

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

+4

मैंने "सर्वश्रेष्ठ" के अनुरोधों को हटाने के लिए इस प्रश्न को संपादित किया है। कृपया फिर से खोलने पर विचार करें। बीटीडब्ल्यू: यह इस सवाल के जवाब के माध्यम से था कि मैंने पहले क्लोजर के बारे में सुना था। तो यह मेरे लिए रचनात्मक था। उन लोगों के लिए धन्यवाद जिन्होंने उत्तर दिया और टिप्पणी की! – jwfearn

उत्तर

32

टेम्पलेट शैली मेटा-प्रोग्रामिंग का विकल्प मैक्रो-शैली है जिसे आप विभिन्न लिस्प कार्यान्वयन में देखते हैं। मैं Paul Graham's On Lisp डाउनलोड करने और Clojure पर एक नज़र डालने का सुझाव दूंगा यदि आप JVM पर चलने वाले मैक्रोज़ के साथ लिस्प में रूचि रखते हैं।

लिस्प में मैक्रोज़ सी/सी ++ शैली से कहीं अधिक शक्तिशाली हैं और अपनी भाषा में एक भाषा का गठन करते हैं - वे मेटा प्रोग्रामिंग के लिए हैं।

+3

हम्म, लिस्प मैक्रोज़ अपने आप में एक भाषा कैसे मैक्रोज़ करते हैं? यह सब लिस्प है, यह इसकी सुंदरता है। –

+0

मैक्रोज़ लिस्प से थोड़ा अलग हैं क्योंकि उनका मूल्यांकन नहीं किया जाता है और विशेष ऑपरेटरों का समूह होता है। मुझे नहीं लगता कि आप लिस्प के साथ मैक्रोज़ का निर्माण कर सकते हैं (इस अर्थ में कि आप अपने लिस्प में मैक्रोज़ को केवल कार्यों के समूह के साथ जोड़ नहीं सकते हैं)। –

+0

आप मैक्रोज़ के समूह के साथ अपने लिस्प में फ़ंक्शन (या चर, या विशेष ऑपरेटर, या ...) जोड़ नहीं सकते हैं। तो फ़ंक्शंस एक भाषा है जो स्वयं के अधिकार में भी है? –

1

लिस्प "मेटाप्रोग्रामिंग" के एक रूप का समर्थन करता है, हालांकि सी ++ टेम्पलेट मेटाप्रोग्रामिंग के समान नहीं है। साथ ही, इस शब्द में "स्थैतिक" का अर्थ अलग-अलग चीजों का हो सकता है, लेकिन लिस्प स्थिर टाइपिंग का भी समर्थन करता है, यदि आपका यही मतलब है।

+0

मैं "स्थैतिक मेटाप्रोग्रामिंग" को समझता हूं, जिसका अर्थ संकलन-समय कोड परिवर्तन के रूप में रन-टाइम पर गतिशील रूप से अवरोध/बदलते व्यवहार के विपरीत होता है (उदाहरण के लिए मेटाक्लास या ईवाल के साथ)। इस अर्थ में, लिस्प मैक्रोज़ एक प्रकार की स्थैतिक मेटाप्रोग्रामिंग सुविधा है। ओपी, क्या आपका मतलब है? –

+0

एक अच्छा कारण है कि लिस्प को "प्रोग्राम करने योग्य प्रोग्रामिंग भाषा" कहा जाता है।यह C++ टेम्पलेट दृष्टिकोण जैसी चीज़ों की तुलना में "मेटाप्रोग्रामिंग" का एक अधिक सामान्य रूप प्रदान करता है/प्रोत्साहित करता है। – simon

+0

@ माथियास, हाँ, यही मेरा मतलब है। धन्यवाद! – jwfearn

12

Nemerle और Boo ऐसी चीजों के लिए मेरे व्यक्तिगत पसंदीदा हैं। इसके खराब दस्तावेज के बावजूद, नेमेरले का एक बहुत ही सुरुचिपूर्ण मैक्रो वाक्यविन्यास है। बू का दस्तावेज उत्कृष्ट है लेकिन इसके मैक्रोज़ थोड़ा कम सुरुचिपूर्ण हैं। हालांकि, दोनों अविश्वसनीय रूप से अच्छी तरह से काम करते हैं।

दोनों लक्ष्य .NET को लक्षित करते हैं, इसलिए यदि आप IKVM का उपयोग करते हैं, तो वे सी # और अन्य .NET भाषाओं - यहां तक ​​कि जावा बाइनरी के साथ आसानी से इंटरऑपरेट कर सकते हैं।

संपादित करें: स्पष्टीकरण के लिए, मेरा मतलब है शब्द के लिस्प अर्थ में मैक्रोज़, सी के प्रीप्रोसेसर मैक्रोज़ नहीं। ये संकलन समय पर नए वाक्यविन्यास और भारी मेटाप्रोग्रामिंग की परिभाषा की अनुमति देते हैं। उदाहरण के लिए, मैक्रोज़ के साथ नेमेरल जहाजों जो आपके SQL सर्वर के विरुद्ध संकलन समय पर आपके SQL सर्वर को सत्यापित करेंगे।

+0

आपके उत्तरों के लिए धन्यवाद, शायद आप नेमेरल और बू के लिए लिंक जोड़ने के लिए संपादित कर सकते हैं? – jwfearn

+1

नेमेरल के लिए साइट http://nemerle.org है। बू http://boo.codehaus.org/ – catbert

+0

पर स्थित है निमेर लिंक: http://code.google.com/p/nemerle –

5

मैं Haskell की अनुशंसा करता हूं। यहां एक paper है जो इसकी संकलन-समय मेटाप्रोग्रामिंग क्षमताओं का वर्णन करता है।

7

"D" programming language सी ++ है - लेकिन इसमें बेहतर मेटाप्रोग्रामिंग समर्थन है।

Ctrace

इसके अतिरिक्त, एक जीसीसी शाखा है, जो metaprogramming contructs कि सी ++ नहीं है (कम से कम नहीं का समर्थन करता है "संकल्पना जीसीसी" कहा जाता है: यहाँ एक किरण-अनुरेखक केवल संकलन समय metaprogramming का उपयोग करके लिखा का एक उदाहरण है अभी तक)।

Concept GCC

+0

+1: डी बहुत अच्छा लगता है –

2

'metaprogramming' वास्तव में इस विशिष्ट सुविधा के लिए एक बुरा नाम है, कम से कम जब आप एक से अधिक भाषा पर चर्चा कर रहे हैं, के बाद से यह सुविधा केवल भाषाओं के एक संकीर्ण टुकड़ा के लिए आवश्यक है कर रहे हैं:

  • स्थिर
  • मशीन भाषा
  • भारी संकलन समय
  • exte पर प्रदर्शन के लिए अनुकूलित करने के लिए संकलित उपयोगकर्ता परिभाषित डेटा प्रकार (सी ++ में OOP के साथ nsible स्थिर metaprogramming 'के मामले)
  • बेहद लोकप्रिय

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

बेशक, गतिशील भाषाएं, और कई कार्यात्मक भाषाएं पूरी तरह से अलग अवधारणाओं का समर्थन करती हैं जिन्हें मेटाप्रोग्रामिंग भी कहा जा सकता है।

13

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

'98 के बारे में इस बारे में चारों ओर घूमने से मुझे बेहतर समाधान देखने के लिए प्रेरित किया गया था। मैं उपयोगी सिस्टम लिख सकता था जो उस पर भरोसा करते थे, लेकिन वे नरक थे। अंततः पोकिंग ने मुझे आम लिस्प के लिए नेतृत्व किया। निश्चित रूप से, टेम्पलेट तंत्र पूर्ण ट्यूरिंग है, लेकिन फिर फिर इंटरकॉल है।

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

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

+0

आपके उत्तर के लिए धन्यवाद! सी ++ टेम्पलेट्स के साथ एमपी निश्चित रूप से गन्दा है (यह मेरे प्रश्न के लिए एक प्रेरणा है)। जब/यदि सी ++ 0x कंपाइलर विक्रेताओं से उपलब्ध है तो इसे थोड़ा क्लीनर प्राप्त करना चाहिए क्योंकि कई नई भाषा विशेषताएं विशेष रूप से एमपी का समर्थन करने के लिए हैं। – jwfearn

+0

दुर्व्यवहार या दुर्व्यवहार नहीं है लेकिन वास्तव में आपके पास C++ में जेनेरिक कोड लिखने का कोई अन्य विकल्प नहीं है। –

24

मुझे एक कुछ महत्वपूर्ण विवरण के बारे में सूचीबद्ध करते हैं कैसे metaprogramming तुतलाना में काम करता है (या scheme, या slate, या अपने पसंदीदा "डायनामिक" भाषा लेने):

  • जब में metaprogramming कर lisp you को दो भाषाओं से निपटने की ज़रूरत नहीं है। मेटा लेवल कोड उसी भाषा में लिखा जाता है जैसे ऑब्जेक्ट लेवल कोड उत्पन्न होता है। मेटाप्रोग्रामिंग दो स्तर तक सीमित नहीं है, और यह मस्तिष्क पर भी आसान है।
  • लिस्प में आपके पास संकलक रनटाइम पर उपलब्ध है। असल में संकलन-समय/रन-टाइम भेद बहुत कृत्रिम लगता है और जहां आप अपना दृष्टिकोण देखते हैं, वहां बहुत अधिक विषय है। केवल फ़ंक्शन कॉल के साथ लिस्प में आप मशीन निर्देशों के लिए फ़ंक्शंस संकलित कर सकते हैं जिन्हें आप पहले कक्षा वस्तुओं के रूप में उपयोग कर सकते हैं; यानी वे अज्ञात कार्यों है कि आप एक स्थानीय चर, या एक वैश्विक hashtable, आदि में रख सकते हो सकता है ...
  • मैक्रो तुतलाना में बहुत सरल कर रहे हैं: एक hashtable में भरवां और संकलक को दिया कार्यों का एक समूह। प्रत्येक रूप के लिए संकलक संकलन करने वाला है, यह हैशटेबल का समर्थन करता है। यदि यह एक फ़ंक्शन पाता है तो इसे मूल रूप से संकलित-समय पर कॉल करता है, और मूल रूप के स्थान पर यह इस फ़ंक्शन को लौटाता है। (मॉड्यूल कुछ गैर-महत्वपूर्ण विवरण) ताकि lisp macros मूल रूप से कंपाइलर के लिए प्लगइन हैं।
  • लिस्प में एक लिस्प फ़ंक्शन लिखना जो लिस्प कोड का मूल्यांकन करता है कोड के लगभग दो पृष्ठ होते हैं (इसे आमतौर पर eval कहा जाता है)। इस तरह के एक समारोह में आप सब जो कुछ भी नए नियमों आप मेटा स्तर पर चाहते शुरू करने की शक्ति है। (जिससे यह तेजी से चलाने के एक नई भाषा bootstrapping मानो ... कुछ प्रयास लेने के लिए एक ही के बारे में जा रहा है ... :)

क्या आप एक उपयोगकर्ता पुस्तकालय तुतलाना metaprogramming का उपयोग कर के रूप में लागू कर सकते हैं के यादृच्छिक उदाहरण

  • एक js करने वाली तुतलाना-RPC मैक्रो को लागू

    • सीमांकित निरंतरता के साथ भाषा का विस्तार (hu.dwim.delico) है कि आप कर सकते हैं: (इन आम तुतलाना पुस्तकालयों की वास्तविक उदाहरण हैं) जावा में प्रयोग करें एस्क्रिप्ट (जो लिस्प से उत्पन्न होता है)। यह js/तुतलाना कोड का एक मिश्रण है कि स्वचालित रूप से पोस्ट (http अनुरोध में) सभी संदर्भित स्थानीय चर, सर्वर साइड पर उन्हें डीकोड में फैलती है, तो सर्वर पर तुतलाना कोड शरीर चलाता है, और जावास्क्रिप्ट को वापसी मान वापस लौटाता है पक्ष। भाषा है कि बहुत मूल "सामान्य" तुतलाना कोड के साथ एकीकृत करने के लिए उलटे पांव लौटने की तरह
    • ऐड prolog आम तुतलाना को (चिल्लाती देखें)
    • एक XML templating extension
    • ( पाठक मैक्रो कि तुतलाना पार्सर के लिए प्लग-इन कर रहे हैं का एक उदाहरण भी शामिल है)
    • आसान पाशन
  • +1

    एक उत्कृष्ट उत्तर के लिए धन्यवाद। एक और जवाब के अनुसार, मैं क्लोजर (एक लिस्प संस्करण जो JVM पर चलता है) की जांच कर रहा हूं। आपको यह दिलचस्प लगेगा। एक सुझाव: अधिक लिंक जोड़ें (उदा।, स्लेट, सीएल-डेलिको, चिल्लाओ, आदि) खोज ठीक है लेकिन एक लिंक पाठकों के समय को बचाता है। – jwfearn

    +1

    मेरे लिए क्लोजर दिलचस्प नहीं है। यह 80% भीड़ द्वारा और अधिक पहुंच योग्य है और इसलिए अधिक लोकप्रिय हो रहा है ... कर्नेल प्रोग्रामिंग भाषा, VPRI.org पर FONC प्रोजेक्ट वास्तव में दिलचस्प है। –

    5

    कॉमन लिस्प के लिए छोटे डीएसएल के, loop या iterate तरह की एक टन प्रोग्राम हैं जो कई अलग अलग तरीकों कार्यक्रमों लिखने का समर्थन करता है।

    1) कार्यक्रम डेटा और प्रोग्राम "सार वाक्य रचना पेड़" वर्दी (एस-भाव कर रहे हैं!)

    2) defmacro

    3) रीडर मैक्रो।

    4) एमओपी

    इनमें से

    , असली दिमाग धौंकनी एमओपी है। पढ़ें "Metaobject प्रोटोकॉल की कला।" यह आपके लिए चीजों को बदल देगा, मैं वादा करता हूँ!

    +0

    आपके उत्तर के लिए धन्यवाद, मैं निश्चित रूप से एमओपी की जांच करूंगा! एक सुझाव: पाठकों के समय को बचाने के लिए, अपने संदर्भों के लिए लिंक जोड़ने या प्रकाशन जानकारी का जवाब संपादित करें। – jwfearn

    +0

    एमओपी चट्टानों; किज़केल्स अब आस्पेक्ट ओरिएंटेड प्रोग्रामिंग में है, जिसे जावा, सी # इत्यादि के लिए एमओपी के रूप में देखा जा सकता है। –

    2

    एमएल भाषाओं के परिवार इस उद्देश्य के लिए विशेष रूप से डिजाइन किए गए थे। OCaml के सबसे प्रसिद्ध सफलता की कहानियों में से एक सी कोड एक OCaml कार्यक्रम द्वारा लगभग पूरी तरह से उत्पन्न है कि उच्च प्रदर्शन FFTs के लिए FFTW पुस्तकालय है।

    चीयर्स, जॉन हारॉप।

    3

    हास्केल में बहुत सारे काम: डोमेन विशिष्ट भाषाएं (डीएसएल), निष्पादन योग्य विनिर्देश, कार्यक्रम परिवर्तन, आंशिक आवेदन, चरणबद्ध गणना।कुछ लिंक आप आरंभ करने के लिए:

    2

    अधिकांश लोगों को नहीं है "परम प्रतिबिंब" आत्म निरीक्षण और की तरह कुछ के लिए "एक भाषा खोजने की कोशिश नया कोड सुधारने के लिए eval "। ऐसी भाषाओं को खोजने के लिए मुश्किल है (LISP एक प्राइम काउंटररेक्स नमूना है) और वे निश्चित रूप से मुख्यधारा नहीं हैं।

    लेकिन एक और तरीका उन उपकरणों के एक सेट का उपयोग करना है जो उत्पन्न कर सकते हैं, और प्रोग्राम कोड में हेरफेर कर सकते हैं। जैकपॉट जावा पर केंद्रित ऐसा टूल है। http://jackpot.netbeans.org/

    हमारे डीएमएस सॉफ्टवेयर पुनर्रचना टूलकिट इस तरह के एक उपकरण है, कि सी, सी ++, C#, जावा, कोबोल, पीएचपी, जावास्क्रिप्ट, एडीए, Verilog, VHDL और अन्य भाषाओं की विविधता पर काम करती है। (यह उत्पादन गुणवत्ता फ्रंट सिरों का उपयोग करता है ताकि यह इन सभी लंगुग को पढ़ने में सक्षम हो सके)। बेहतर, यह एक ही पल में कई भाषाओं के साथ ऐसा कर सकता है। http://www.semdesigns.com/Products/DMS/DMSToolkit.html

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

    3

    निम एक अपेक्षाकृत नई प्रोग्रामिंग भाषा है जिसमें स्थैतिक मेटा-प्रोग्रामिंग के लिए व्यापक समर्थन है और कुशल (सी ++ जैसे) संकलित कोड उत्पन्न करता है।

    http://nim-lang.org/

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

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