क्या उच्च स्तरीय भाषा को पठनीय C ++ में संकलित करना संभव है? [बन्द है]


12

C ++ कई मायनों में एक महान भाषा है, लेकिन विशेष रूप से कुछ चीजें आईडीई के बिना लिखना बोझिल हैं। एक VIM उपयोगकर्ता के रूप में, यह बहुत दिलचस्प होगा यदि मेरे पास उच्च स्तर की भाषा तक पहुंच है जो मुझे S-Expressions के साथ C ++ लिखने में सक्षम है और संभवतः लिस्प की तरह मैक्रोज़ के साथ, उसी पेटेंट को फिर से लिखने से बचते हुए स्वच्छ कोड की पीढ़ी के लिए अनुमति देता है। बार बार।

मैंने फ़्रीनोड पर पूछा है और कई विचारों का परीक्षण किया है, जैसे कि लिस्प-> सी को ईसीएल और बिग्लू जैसे संकलक के साथ संकलित करना, लेकिन उनमें से कोई भी विशेष रूप से स्वच्छ सी कोड उत्पन्न नहीं करता है।

क्या इस मुद्दे पर कोई काम हो रहा है?


3
अपने कोड को मैक्रोज़ के साथ एक लिस्प में क्यों न लिखें जैसे कि यह सभी C ++ है और फिर उन विशेषताओं को जिन्हें आप चाहते हैं, लेकिन मुश्किल से सफाई करते हैं बस एक LISP मैक्रो द्वारा एक साधारण वाक्यविन्यास से अधिक जटिल C ++ तक विस्तारित हो जाते हैं। बेहतर अभी तक, आप सिर्फ LISP में अपना कोड लिख सकते हैं। :)
जिमी होफा

2
क्या आप Lisp -> C ++ अनुवाद के लिए स्वच्छ C ++ कोड का उत्पादन करने की उम्मीद कर रहे हैं, जब (यकीनन सरल) C ++ -> असेंबली अपठनीय (राय का मामला) विधानसभा का उत्पादन करती है? वैसे भी संकलन का लक्ष्य कौन है?

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

2
मैं सहमत हूं कि लिस्प कुछ चीजें कर सकता है जो सी ++ में कठिन हैं (जैसे क्लोजर)। क्या आपको उन चीजों को करने की आवश्यकता है? फिर चूंकि वे सी ++ में करना मुश्किल हैं, इसलिए आप चाहे उन्हें सी ++ में, स्वचालित रूप से या मैन्युअल रूप से प्राप्त करें, यह सुंदर नहीं होगा। मेरा सुझाव: यदि आपको वास्तव में वास्तव में उन कठिन चीजों की आवश्यकता नहीं है जो लिस्प कर सकते हैं, तो लिस्प का उपयोग न करें। C ++ पर अच्छा प्राप्त करें। यदि आप उन चीजों का उपयोग करते हैं, लेकिन आपको सी ++ में कोड करना होगा, तो यह पता करें कि इसे सी ++ में कैसे किया जाए। यही इस व्यवसाय में वयस्कों को बच्चों से अलग करता है।
माइक डनलैवी

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

जवाबों:


13

उच्च स्तर की भाषाओं को निचले स्तर के लोगों के लिए संकलित करना केक है। इसके अनगिनत उदाहरण हैं। एक स्पर्शरेखा के बहुत दूर जाने के बिना, हम प्रारंभिक C ++ संकलक को इंगित कर सकते हैं जो C पर संकलित है।

जब आप मिश्रण में "साफ" और "पठनीय" फेंकना शुरू करते हैं, हालांकि, चीजें वास्तव में कठिन हो जाती हैं। स्वच्छ, पठनीय कोड आप जो लिख रहे थे उसका अर्थ और आशय व्यक्त करता है । कंप्यूटर अर्थ की व्याख्या करने और बनाने में कुख्यात हैं। आप नामांकित चर के साथ समाप्त होने की अधिक संभावना int_147है input_buffer_length। निश्चित रूप से, यदि आप वास्तव में इस परियोजना को काम करना चाहते हैं , तो आप अपने Lisp को शालीनता से पठनीय C ++ में परिवर्तित करने के लिए एक विशाल AI प्रोजेक्ट में संलग्न हो सकते हैं, लेकिन पूरी तरह से ईमानदार होने के लिए, कॉमन लिस्प कंपाइलर बहुत अच्छे हैं जो वे करते हैं ।

लिस्प से सी ++ उत्पन्न करने की कठिनाई से अधिक महत्वपूर्ण इस की उपयोगिता है। पठनीय C ++ के पठनीय होने के लिए यह क्या उद्देश्य होगा? यदि लिस्प आपका स्रोत कोड है, तो मध्यवर्ती अभ्यावेदन अप्रासंगिक होना चाहिए। यदि आप प्रोग्रामर को C ++ सौंपने में सक्षम होना चाहते हैं जो आपके मूल लिस्प को नहीं समझता है, तो आपको अब एक और समस्या मिल गई है। जब वे आपके उत्पन्न C ++ को संशोधित करना चाहते हैं तो क्या होता है? यदि वे C ++ में ऐसी चीजें लिखते हैं जो आपके लिस्प में सफाई से अनुवाद नहीं करती हैं तो क्या होगा?

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

अरे हाँ। आपका बॉस चाहता है कि आप C ++ लिखें और आप नहीं। अपना रिज्यूमे अपडेट करें और नई नौकरी खोजें।


काश मैं अपना रिज्यूम अपडेट कर पाता और दूसरी नौकरी पा लेता। दुर्भाग्य से जब नौकरी = "विद्यार्थी" और बॉस = "प्राध्यापक" इतने सीधे नहीं होते। और सबसे दुर्भाग्य से, मैं एक डिप्लोमा करने वाला हूं। इस तथ्य के बावजूद कि मैं कक्षाओं में नहीं जाता, लेकिन इसे स्वयं घर पर सीखें। इस तथ्य से कि मैं पहले से ही उद्योग पर काम कर रहा हूं और मुझे पता है कि ज्यादातर स्नातकों की तुलना में अधिक पैसा कमाता हूं। बस यही काम करता है। अफसोस की बात है। अगर मैं C ++ में कुछ जटिल लिखता हूं, तो खुशी से मेरे प्रोफेसर ने मुझे पास करना स्वीकार कर लिया। मैं पहले से ही सी ++ जानता हूं। इसलिए मैं कुछ अलग सीखने का मौका ले सकता हूं (, रेंट एक तरफ, शानदार जवाब। धन्यवाद।
MaiaVictor

@ डॉककट: मुझे विश्वास नहीं है कि आप सी ++ जानते हैं। क्या आप विशेष कार्यान्वयन के साथ टेम्पलेट लिख सकते हैं यह इस बात पर निर्भर करता है कि पैरामीटर में कुछ विधि या फ़ंक्शन है? क्या आपने Boost.MPL का उपयोग करके संकलन-समय की गणना की है? क्या आप समझते हैं कि Boost.ForEach कैसे काम करता है? यदि आपको इसे C ++ में करना है, तो इसे और अधिक उन्नत C ++ सीखने के अवसर के रूप में लें। यह आपके काम के लिए अधिक उपयोगी होगा।
Jan Hudec

1
जब मैंने C ++ उन उदास वर्षों के साथ काम किया, तो मैंने कुछ बहुत जटिल टेम्प्लेट किए हैं। हाँ, मैंने Boost.ForEach का बहुत उपयोग किया, मुझे याद है कि मैक्रोज़ को बहुत अधिक परिभाषित करते हुए इसे अधिक उपयोगी माना जा सकता है। वैसे भी मैं एक बच्चा था, यह एक मजेदार अनुभव नहीं था। मुझे कोई और सीखने में बात नहीं आती है, जब लिस्प इतना अधिक ठोस, कम दर्दनाक मैक्रो सिस्टम प्रदान करता है, जो बिल्कुल उस तरह के मेटाप्रोग्रामिंग को पूरा करता है कि सी + + को गुरिश कौशल की आवश्यकता होती है।
MaiaVictor

3

संक्षिप्त उत्तर, वर्तमान में ऐसा कुछ नहीं है जो लिस्प को READABLE C ++ में परिवर्तित करने में आपकी सहायता करेगा। सुनिश्चित करें कि आप कुछ भी C ++ या C में परिवर्तित कर सकते हैं लेकिन पठनीय कोड मनुष्यों द्वारा लिखा जाता है, न कि कार्यक्रमों द्वारा। सुनिश्चित करें कि आप उचित स्वरूपण, इंडेंट, अच्छी श्रेणी के नाम के साथ C ++ कोड का उत्पादन कर सकते हैं, और शायद किसी भी तरह Lisp वर्ग की वस्तुओं से C ++ कक्षाओं तक सही अनुवाद प्राप्त कर सकते हैं। हो सकता है कि आप अपनी लाइब्रेरी की निर्भरता को सही से जोड़ सकते हैं, और हो सकता है कि आप उन बायनेरिज़ को संकलित कर सकते हैं जो सी भाषा के उत्पादन के बहुत करीब हैं। आपने सी में पूरी बात लिखी है लेकिन अंततः पठनीय कोड एक ऐसा सौंदर्य है जिसे समझा नहीं जाता है किसी के द्वारा भी, कम से कम अभी तक नहीं, और संभवतः इस बात पर कभी विचार नहीं किया गया कि यह शब्द पठनीय है के साथ शुरू करने के लिए काफी व्यक्तिपरक है और जो डेवलपर्स के एक समूह के बीच पठनीय माना जा सकता है, उसे दूसरों द्वारा अत्याचार माना जा सकता है।

C ++ को पठनीय बनाने के लिए, आपको C ++ में लिखना होगा, लिस्प में नहीं। आपको अपने कोडिंग स्टाइल को बदलने में सक्षम होना होगा जो आपके कोड को पढ़ने वाले लोगों को सबसे अच्छी तरह से समझ में आएगा। किताबों की तरह ही, कार्यक्रम एक विशिष्ट दर्शक को ध्यान में रखकर लिखे जाते हैं और अगर अच्छी तरह से लिखे गए हों, तो सुंदर और स्पर्श हो सकते हैं, और यदि नहीं तो आपत्तिजनक और थकाऊ हो सकते हैं। और अगर हम हमारे लिए सुंदर फिक्शन उपन्यास लिखने के लिए एक कार्यक्रम नहीं ला सकते हैं, तो हम पठनीय C ++ में बदलने के लिए कुछ के साथ आने में सक्षम नहीं होंगे।


मुझे लगता है कि आप "पठनीय" के साथ मेरा क्या मतलब है! यह वास्तव में सुंदर होना जरूरी नहीं है। बस इतना है कि आप इसे पढ़ सकते हैं और समझ सकते हैं कि क्या चल रहा है। मुझे लगता है कि मैं एक प्रत्यक्ष अनुवाद के लिए कुछ लिस्प मैक्रोज़ के साथ जाऊंगा, जैसा कि जिमीहोफा ने टिप्पणियों पर सुझाव दिया था।
माईविक्टर

3

ViM C ++ के लिए एक बेहतरीन IDE है। मेरे पास अब तक का सबसे अच्छा समापन है, हालांकि यह थोड़ा धीमा हो जाता है यदि आप बहुत सारे हेडर में खींचते हैं, तो क्लैंग पूरा हो जाता है । और संकलन के लिए मुझे वैसे भी सभी IDE की कमी महसूस हुई; आप अंत में CMake या कुछ भी लिखने की व्यवस्था का निर्माण करते हैं। और मैंने लिस्प, अवधि के लिए कोई भी सहायता प्रदान करने के लिए कुछ भी नहीं देखा है ।

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

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


और अंतिम प्रत्यक्ष प्रश्न का उत्तर देने के लिए: C ++ में बेल्ट के नीचे इतने अधिक मुहावरे हैं कि किसी भी चीज़ से मुहावरेदार C ++ उत्पन्न करने का कोई तरीका नहीं है। सिर्फ इसलिए कि उन मुहावरों को किसी और चीज में व्यक्त करने का कोई तरीका नहीं होगा। इस तथ्य से शुरू कि कुछ भी कचरा संग्रह ढेर पर सब कुछ आवंटित करेगा जबकि सी ++ में स्टैक का लाभ लेना मुहावरेदार है।


VIM पर सहमत हैं। यह सी विकास के लिए एक दस्ताने की तरह फिट बैठता है। मैं एक विम उपयोगकर्ता हूं लेकिन लिस्प के लिए मैं SLIME और Paredit के साथ बुराई-मोड में Emacs का उपयोग करता हूं। बेसिक REPL हुक के साथ विम में लिस्पिंग के लिए कुछ समर्थन है, लेकिन वे SLIME के ​​करीब नहीं आते हैं।
14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.