एक संकलक लिखने के लिए C ++ क्यों?


14

मैं सोच रहा था कि एक संकलक लिखने के लिए C ++ एक अच्छा विकल्प क्यों है। बेशक सी इस उद्देश्य के लिए भी अच्छा है, क्योंकि कई संकलक या तो सी या सी ++ में लिखे गए हैं, लेकिन मुझे इस समय सी ++ में अधिक रुचि है। कोई अच्छा कारण? मैं इंटरनेट में उस की तलाश कर रहा था, लेकिन मुझे कोई अच्छा कारण नहीं मिल रहा है।


3
"कई संकलक [...] सी ++ में लिखे गए हैं" - कोई संदर्भ? कौन सा? आपको क्या लगता है कि C ++ अधिक बार अन्य लोकप्रिय भाषाओं की तुलना में संकलक निर्माण के लिए उपयोग किया जाता है?
डॉक ब्राउन

6
@DocBrown खैर, बजना और MSVC ज्यादातर सी में लिखे गए हैं ++, जीसीसी ++ उस में अब सी का एक सा है, जावा JVM सी में लिखे गए हैं ++ stackoverflow.com/questions/410320/what-is-java-written-in और भी सुपर उपयोगकर्ता। com / प्रश्न / 136136 /…
12:52

@DocBrown DMD D के लिए संदर्भ संकलक C ++ में लिखा गया है
शाफ़्ट फ्रीक

3
कौन कहता है कि यह एक अच्छा विकल्प है ??
फिल

1
@Phil क्या आपको लगता है कि उन्होंने विकल्प के विचार के बिना यह विकल्प बनाया? यह "अच्छा" विकल्प नहीं है, यह "कुशल" विकल्प है।
Klaim

जवाबों:


24

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


11
जहां तक ​​मुझे पता है कि एक संकलक के अंदर बहुत सारे तर्क कार्यात्मक प्रकृति के हैं (जटिल डेटा संरचनाओं को अन्य डेटा संरचनाओं में बदलना) तो मुझे यकीन नहीं है कि ऑब्जेक्ट-ओरिएंटेड सुविधाएं (जो प्रोग्रामिंग-इन-द-लार्ज के लिए अधिक लक्षित हैं) , वास्तुशिल्प पहलुओं) एक प्रक्रियात्मक प्रोग्रामिंग शैली के निर्माण संकलक के लिए एक वास्तविक लाभ लाते हैं। बस मेरे 2 सेंट।
जियोर्जियो

5
@ जियोर्जियो होने से संकलक लेखन के अन्य पहलुओं में बहुत मदद करता है। उदाहरण के लिए, एक राज्य का एक बहुत कुछ होता है जब अनुकूलन के साथ एक सौदा करना पड़ता है और उस तरह का सामान ओओपी के लिए अच्छी तरह से उधार देता है। इसके अलावा, OOP और फ़ंक्शनल प्रोग्रामिंग काफी प्रशंसनीय हो सकते हैं, इसलिए सिर्फ इसलिए कि एल्गोरिदम ज्यादातर कार्यात्मक हो सकते हैं, इसका मतलब यह नहीं है कि ऑब्जेक्ट मदद नहीं करेंगे।
ओलेक्सी

3
@ जियोर्जियो और ओलेक्सी: मैं आप दोनों की पुष्टि कर सकता हूं। मैंने असली दुनिया की भाषा के लिए हास्केल के साथ एक कंपाइलर लिखा था। यह वास्तव में अच्छा था। लेकिन कभी-कभी मैंने कुछ OO को याद किया। अगर मुझे एक और संकलक लिखना होता तो मैं हास्केल को जरूर चुनता, लेकिन यह वास्तव में एक विशेष मामला है। मैं अन्य प्रकार की परियोजनाओं के लिए बिना हिचकिचाहट के चयन नहीं करूंगा।
स्कारफ्रिज

27
कोड जनरेशन करने के लिए आपको "लो-लेवल साइड" वाली भाषा की आवश्यकता क्यों है? मैं नहीं देख सकता कि ये दोनों किसी भी तरह से कैसे जुड़े हैं।
प्रेत ०

5
कोड जेनरेशन को करने के लिए आपको "निम्न-स्तर की ओर" की आवश्यकता नहीं है, किसी भी आवश्यकता से अधिक यूनिकोड पहचानकर्ताओं को एक फ़ाइल में जापानी पाठ लिखने में सक्षम होना चाहिए।
dan04

17

मेरा अनुभव यहाँ आपके आधार से सहमत नहीं है। वास्तव में, उच्च-स्तरीय सामान्य-प्रयोजन की भाषाओं के लिए, स्रोत भाषा (जिस भाषा को संकलित किया जा रहा है) उसी भाषा में संकलक को लिखना एक बहुत ही आम बात है । उदाहरण के लिए:

  • सन के जावा कंपाइलर को जावा में लिखा जाता है
  • स्काला में स्केल कंपाइलर लिखा जाता है
  • मोनो का सी # संकलक C # में लिखा गया है
  • स्क्वीटस स्मॉलटाक कंपाइलर स्मॉलटाकल में लिखा गया है
  • ... और बहुत सारे

एक अपवाद कंपाइलर फ्रंट-एंड्स है जो मौजूदा कंपाइलर फ्रेमवर्क के लिए लिखा गया है, जैसे कि जीसीसी, एलएलवीएम या पॉलीग्लॉट, जो तब फ्रेमवर्क की भाषा में लिखे जाते हैं, या कंपाइलर जो मौजूदा पार्सर जनरेटर जैसे कि याक पर निर्भर करते हैं। चूंकि GCC, LLVM और Yacc C और C ++ में लिखे गए सामान्य, स्थापित टूल हैं, इसलिए यह कंपाइलर लेखकों को इनका उपयोग करने के लिए एक प्रोत्साहन देता है, जिससे कंपाइल कार्यान्वयन भाषा वितरण में C और C ++ को एक बड़ा हिस्सा मिल सकता है।


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

1
@Krelp मैं मानता हूं कि यह एक उद्देश्य तकनीकी कारण के बारे में नहीं है, लेकिन यह वास्तव में "पसंद" नहीं है, या तो - यह सिर्फ एक भाषा के लिए पारित होने के कुछ संस्कार माना जाता है - "क्या यह इतना परिपक्व है कि खुद की कार्यान्वयन भाषा के रूप में सेवा करने में सक्षम हो संकलक "।
ओक

1
सन के जावा कंपाइलर C ++ में लिखा गया है: stackoverflow.com/questions/410320/what-is-java-written-in
Klaim

12
@ आप यहां दो उत्पादों को भ्रमित कर रहे हैं। एक सन के जावा कंपाइलर ( javacकमांड-लाइन) है, जो जावा को जावा बाइटकोड को संकलित करता है। यह जावा में लिखा है - मैंने इसे स्वयं कई बार संशोधित किया है और आप इसके जावा स्रोतों को ऑनलाइन ब्राउज़ कर सकते हैं । अन्य हॉटस्पॉट JVM में एम्बेडेड जस्ट -इन-टाइम कंपाइलर है, जो जावा बाइटकोड को देशी मशीन कोड के लिए संकलित करता है। अधिकांश JVM की तरह यह C ++ में लिखा गया है, लेकिन यह जावा संकलक नहीं है - वास्तव में, यह जावा भाषा के बारे में कुछ नहीं जानता है।
ओक

@ ओके, बिलकुल सही! दूसरे शब्दों में, JVM! = Javac
पॉल ड्रेपर

6

क्या संकलन करने के लिए? एक संकलक एक स्रोत कोड को एक भाषा (स्रोत भाषा) से दूसरी (गंतव्य भाषा) में बदल देता है, जो गंतव्य भाषा की निम्न-स्तरता के बारे में कुछ भी इंगित नहीं करता है।

  • CoffeeScript जावास्क्रिप्ट के लिए संकलित करता है, जो कॉफ़ी मेकर में लिखा जा रहा है।
  • स्क्रिप्ट # जावास्क्रिप्ट में C संकलित करती है, संकलक में लिखा जा रहा है, अगर मुझे अच्छी तरह से याद है, तो C #।
  • आदि।

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

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

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


5
सेल्फ-होस्टिंग geeky नहीं है, यह एक संकलक को पोर्ट करने के लिए एक महत्वपूर्ण संपत्ति है।

5
कारण यह है, कि यह कंपाइलर को स्वयं एक परीक्षण कार्यक्रम बनाने में सक्षम बनाता है। यह सबसे अधिक संभावना है कि काफी समय तक उस संकलक का सबसे बड़ा कार्यक्रम भी होगा।

6

मैं यहां मूल आधार पर सवाल उठाता हूं। जबकि सी और सी ++ कंपाइलर लिखने के लिए पूरी तरह से अच्छी तरह से काम करते हैं, काफी कुछ अन्य भाषाओं के साथ-साथ कार्य के लिए भी पूरी तरह से काम करते हैं।

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

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


2
एएसटी = सार सिंटैक्स ट्री, आरई = नियमित अभिव्यक्तियाँ
अराजक 3quilibrium

5

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

C ++ का यहाँ स्पष्ट लाभ है। C ++ में ऑप्टिमाइज़ेशन सस्ता नहीं आता है। हालाँकि, इस भाषा की निम्न-स्तरीय प्रकृति के कारण, C ++ कोड को मैन्युअल रूप से किसी अन्य भाषा (विधानसभा को छोड़कर जो पोर्टेबल नहीं है) को छोड़कर अधिक अनुकूलित करना संभव है।


11
एक अन्य महत्वपूर्ण आवश्यकता कोड के सही होने के लिए है - मेरे पास एक धीमी संकलक है जो मैं एक तेज गति से भरोसा कर सकता हूं जो गलत कोड उत्पन्न करता है।

2
हालांकि यह निश्चित रूप से सी ++ को बहुत अधिक अनुकूलित करने के लिए संभव है, वहाँ बहुत ... बल्कि ... वहाँ से इष्टतम सी ++ कोड से कम है।
डोनल फेलो

2
@DonalFellows इसे दूसरे तरीके से चालू करते हैं: किसी भी भाषा में इष्टतम कोड से कम लिखना संभव है, लेकिन ऐसे अनुकूलन हैं जो सी ++ (असेंबलर के अलावा अन्य) की तुलना में अन्य भाषाओं में सक्षम करना असंभव हैं। मैं अभाव के कारण सी को शामिल नहीं करता हूं। उच्च स्तरीय संरचनाओं को मजबूत बनाने की अनुमति देता है)।
12:30

@ user1249 - कोई कारण नहीं है कि C ++ कोड की गति इसे किसी भी अयस्क छोटी गाड़ी बना देगी। मैं नहीं बल्कि एक धीमी, सही संकलक की तुलना में तेजी से सही संकलक होता है।
gnasher729

3

मुझे संदेह है कि उनके उपयोग के लिए मुख्य प्रेरक यह है कि सी में लेक्स / याक / बाइसन आउटपुट (मुख्य रूप से) है क्योंकि यह इतने लंबे समय के लिए मानक है, इसकी गति है।

ऐसा नहीं है कि उन विशेष रूप से अच्छे कारण हैं ...


वास्तव में यह मुझे संतुष्ट नहीं करता है, लेकिन कोशिश के लिए धन्यवाद।
कोबरा

इस सवाल का जवाब नहीं है "संकलक निर्माण के लिए C ++ ओवर सी का चयन क्यों करें"।
डॉक ब्राउन

3
यह एक अच्छा कारण नहीं है। लेक्स और याक के अनुरूप उपकरण कई प्लेटफार्मों के लिए मौजूद हैं। उदाहरण के लिए PLY और ANTLR।
user16764

इसके अलावा, सबसे लोकप्रिय वास्तविक दुनिया संकलक (मैं उदाहरण के लिए क्लू और जीसीसी बहुत सुंदर हूं), हाथ से लिखे गए पार्सर का उपयोग करते हैं।

@delnan: हाँ, लेकिन वे शायद जमीन से चीजों को प्राप्त करने के लिए एक उत्पन्न का उपयोग करना शुरू कर देते हैं। पार्सर की हाथ पीढ़ी एक अनुकूलन कदम है जो आप वास्तव में तब तक नहीं करना चाहते जब तक आप यह साबित नहीं कर सकते कि अन्य चीजें काम कर रही हैं।
मार्टिन यॉर्क

1

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

C ++ में आपके पास एक ही तंत्र हो सकता है लेकिन यह वास्तव में विकास का समय कुशल है क्योंकि आपके सभी मेमोरी मैनेजमेंट को कंस्ट्रक्टर्स और डिस्ट्रक्टर्स के भीतर समझाया जा सकता है, जिसे आपको स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है। इसलिए संकलक आपके लिए संसाधन आवंटित और मुक्त कर रहा है। यदि आप अपनी खुद की कक्षाएं बनाते हैं, तो आपकी गतिशील वस्तुओं का आकार भी समझाया जा सकता है, और ओवरलोडिंग ऑपरेटर [] द्वारा सीमा तक पहुंच के लिए अनुक्रमित किया जा सकता है। ये सार आपके कोड को क्लीनर बनाने में मदद करते हैं, समझने में आसान और डिबग करते हैं और निश्चित रूप से तेजी से विकास करते हैं।

यदि आप C में एक कंपाइलर बनाते हैं तो आपको निश्चित रूप से अधिक समय लगेगा। C ++ आपको अपना प्रोजेक्ट कम समय में पूरा कर देगा। C और C ++ का प्रदर्शन समान है लेकिन C ++ के बहुत सारे फायदे हैं जो C के पास नहीं हैं।


0

CompCert परियोजना एक शोध सी संकलक जो सी में या C ++ लिखा नहीं है, लेकिन OCaml और Coq में अधिक है।

गौर करें कि C ++ का C ( Cfront में ) अनुवाद किया जाता था । अब आप उपयोग कर सकते हैं जीसीसी के लिए सामने के अंत Gimple , तो फिर कुछ डेटाबेस के लिए Gimple डंप, अपने कोडांतरक अनुवादक के लिए एक Gimple लिखें। लेकिन कानूनी कारणों ( जीसीसी रनटाइम लाइब्रेरी अपवाद ) को खुले स्रोत होने के लिए इस तरह के संकलक की आवश्यकता होती है। विवरण के लिए अपने वकील से पूछें, मैं वकील नहीं हूं। GCC के पुराने वेरिएंट C + के कुछ वेरिएंट के लिए फ्रंट-एंड के साथ C (+ कई डोमेन विशिष्ट भाषाओं) में लिखे गए हैं। OpenWatcom C में लिखा गया C ++ कंपाइलर हो सकता है (मैं आपको जाँचने के लिए छोड़ता हूँ)।

Compcert का स्रोत अकादमिक और अनुसंधान उद्देश्यों के लिए स्वतंत्र रूप से उपलब्ध है। यदि आप इसे औद्योगिक रूप से (और कानूनी रूप से) उपयोग करना चाहते हैं, तो आपको Absint से कुछ लाइसेंस प्राप्त करने की आवश्यकता है।

यह भी देखें इस और है कि दो संबंधित सवालों के जवाब।

यदि मुझे 2020 में सी (या सी ++) कंपाइलर को स्क्रैच (लिनक्स पर चलने, शायद कुछ क्रॉस-कंपाइलर ) लिखने का काम सौंपा गया था, तो शायद मैं इसे सी ++ में नहीं लिखूंगा। मैं इसे Ocaml , Go , या Rust का उपयोग करके लिखने पर विचार करूंगा । और मैं इसे अनुमति दे सकता है तो Frama-C पर । यदि C या C ++ में कोड करने की आवश्यकता होती है, तो मैं पहले इसके लिए एक कचरा संग्राहक पुस्तकालय कोड करूँगा , शायद कुछ दृढ़ता परत- पूरे कार्यक्रम अनुकूलन के लिए उपयोगी है - और फिर मैं एक मेटाप्रोग्रामिंग दृष्टिकोण (अधिकांश C या C ++ कोड का निर्माण) पर विचार करूंगा मेरे एड-हॉक टूल्स के साथ कंपाइलर, शायद बिस्मोन या रेफरीज़ अगर अनुमति है)।

आप कुछ (अधिक या कम खुला स्रोत) सी कंपाइलर कॉमन लिस्प में या पाइथन (उदाहरण के लिए शिवायसी या नैक ) में कोडित कर सकते हैंज़ेटासी में भी देखें

ध्यान दें कि जीसीसी के हाल के संस्करणों को तकनीकी रूप से शुद्ध सी ++ में कोडित नहीं किया गया है, वे जीसीसी में शामिल दर्जनों डोमेन विशिष्ट भाषाएं हैं (उनमें से कई ट्यूरिंग-पूर्ण हैं )। मेरी पुरानी GCC MELT परियोजना भी देखें ।

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

MILEPOST GCC प्रोजेक्ट में भी देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.