कुछ C कंपाइलर क्यों हैं?


72

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

तो सभी कंपाइलर कहां हैं?

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

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

क्यों? क्या C लागू करना इतना कठिन है? यह C ++ नहीं है। क्या उपयोगकर्ताओं को बस इस बारे में बहुत तिरछा विचार है कि यह किस जटिलता समूह में आता है (अर्थात यह वास्तव में योजना की तुलना में C ++ के करीब है)?


61
MSVC अभी भी मायने रखता है, कम से कम एक C89 संकलक के रूप में। शायद इंटेल से भी अधिक लोकप्रिय है।
रफ़लविंड

22
विकिपीडिया कुछ C कंपाइलरों को सूचीबद्ध करता है। जब आप खुद को एम्बेडेड दायरे में पाते हैं तो वे बहुत सामान्य हो जाते हैं।

113
आपको अपने सी कोड को संकलित करने के लिए कितने संकलनकर्ताओं की आवश्यकता है?
ब्रायन चेन

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

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

जवाबों:


153

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

कुछ लोग नॉन-ऑप्टिमाइज़िंग सी कंपाइलर्स जैसे कि छोटेसीवी या एनवीसीके का उपयोग कर रहे हैं , क्योंकि वे कोड का उत्पादन करते हैं जो कि अनुकूलन करने वाले कंपाइलरों की तुलना में कई गुना धीमा होता है।

एक अनुकूलन संकलक कोडिंग मुश्किल है। ध्यान दें कि GCC और Clang दोनों कुछ "स्रोत भाषा-तटस्थ" कोड प्रतिनिधित्व का अनुकूलन कर रहे हैं (GCC के लिए Gimple, Clang के लिए LLVM)। एक अच्छे C कंपाइलर की जटिलता पार्सिंग चरण में नहीं है!

विशेष रूप से, C ++ कंपाइलर बनाने से ज्यादा कठिन नहीं है C कंपाइलर बनाना: C ++ को पार्स करना और इसे कुछ आंतरिक कोड प्रतिनिधित्व में बदलना जटिल है (क्योंकि C ++ विनिर्देश जटिल है), लेकिन अच्छी तरह से समझा जाता है, लेकिन ऑप्टिमाइज़ेशन पार्ट्स और भी हैं जटिल (GCC के अंदर: मध्य-अंत अनुकूलन, स्रोत-भाषा और लक्ष्य-प्रोसेसर तटस्थ, संकलक के अधिकांश का निर्माण करते हैं, शेष कई भाषाओं के लिए फ्रंट-एंड के बीच संतुलित होते हैं और कई प्रोसेसर के लिए बैक-एंड होते हैं )। इसलिए अधिकांश अनुकूलन सी कंपाइलर कुछ अन्य भाषाओं को भी संकलित करने में सक्षम हैं, जैसे सी ++, फोरट्रान, डी ... ... जीसीसी के सी ++ विशिष्ट भाग संकलक के लगभग 20% हैं ...

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

और अनुकूलन एक लंबी पूंछ की घटना है: कुछ सरल अनुकूलन लागू करना आसान है, लेकिन वे एक संकलक को प्रतिस्पर्धी नहीं बनाएंगे! आपको एक वास्तविक दुनिया संकलक को प्रतिस्पर्धी बनाने के लिए, बहुत सारे विभिन्न अनुकूलन लागू करने की आवश्यकता है, और उन्हें चतुराई से व्यवस्थित और संयोजित करने की आवश्यकता है। दूसरे शब्दों में, एक वास्तविक दुनिया का अनुकूलन करने वाला कंपाइलर सॉफ्टवेयर का एक जटिल टुकड़ा होना चाहिए। BTW, GCC और Clang / LLVM दोनों में कई आंतरिक विशिष्ट C / C ++ कोड जनरेटर हैं। और दोनों एक विशाल डेवलपर समुदाय (कुछ सौ व्यक्तियों, जो ज्यादातर पूर्णकालिक काम कर रहे हैं, या कम से कम आधे समय में काम कर रहे हैं) के साथ दोनों विशाल जानवर हैं (प्रत्येक वर्ष कई प्रतिशत की विकास दर के साथ कोड के लाखों स्रोत हैं)।

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

इसके अलावा, सी कंपाइलर को स्क्रैच से कोड करने पर वित्त पोषित करना मुश्किल है, और इस तरह के प्रयास को कई वर्षों तक चलने की आवश्यकता है। अंत में, आज अधिकांश C या C ++ कंपाइलर मुफ्त सॉफ्टवेयर हैं (स्टार्टअप्स द्वारा बेचे जाने वाले नए स्वामित्व वाले कंपाइलरों के लिए अब कोई बाजार नहीं है) या कम से कम एकाधिकार वाली वस्तुएं हैं (जैसे Microsoft Visual C ++ ), और फ्री सॉफ्टवेयर होना कंपाइलरों के लिए आवश्यक है। क्योंकि उन्हें कई अलग-अलग संगठनों से योगदान की आवश्यकता है)।

मैं नि: शुल्क सॉफ्टवेयर के रूप में खरोंच से एक सी संकलक पर काम करने के लिए धन प्राप्त करने के लिए खुश हूं, लेकिन मुझे विश्वास नहीं है कि आज संभव है!


14
(there is no more a market for proprietary compilersबता दें कि विजुअल स्टूडियो टीम ...
मेसन व्हीलर

18
Microsoft का एकाधिकार है। मेरा मतलब था कि नई सी कंपाइलर्स विकसित करने वाली छोटी कंपनियां उनमें से बहुतों को नहीं बेचेगी। क्या आप MSVC के हालिया मालिकाना प्रतियोगी का नाम बता सकते हैं?
बेसिल स्टेयरनेविच

12
एचपीसी दुनिया में कई मालिकाना संकलक हैं। PGCC, NAG, और ICC का सबसे अधिक उपयोग किया जाता है।
डेविड एमएच

37
@ मेसनव्हीलर: वीएस को आजकल मुफ्त में (बीयर में) दिया जाता है। गैर-मुक्त संस्करण टूलिंग जोड़ते हैं, लेकिन VS2013 में सी कंपाइलर सभी संस्करणों में समान है। वहाँ सिर्फ एक बाजार नहीं है, उनके लिए भी नहीं।
16

3
लेकिन जीसीसी और एलएलवीएम दोनों बहुत कम प्रतिनिधित्व पर काम कर रहे हैं, और वे इसी तरह सी ++ और सी (एंड एडीए और फोरट्रान, जीसीसी के लिए) कोड का अनुकूलन करते हैं। मैं इसके विपरीत कहूंगा कि C ++ को C की तुलना में अधिक अनुकूलन की आवश्यकता है (विशेष रूप से इसके STL का उपयोग करते हुए कोड को संकलित करते हुए)!
बेसिल स्टारीनेवविच

70

मैं आपकी अंतर्निहित धारणा से लड़ना चाहता हूं कि केवल सी कार्यान्वयन की एक छोटी संख्या है।

मैं C को भी नहीं जानता, मैं C का उपयोग नहीं करता, मैं C समुदाय का सदस्य नहीं हूं, और फिर भी, यहां तक ​​कि मैंने आपके द्वारा बताए गए कुछ कंपाइलरों से कहीं अधिक जाना।

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

परंपरागत रूप से, प्रत्येक ओएस विक्रेता और प्रत्येक चिप विक्रेता के पास अपने स्वयं के संकलक थे। Microsoft, एक OS विक्रेता के रूप में, Microsoft Visual C. IBM, एक OS विक्रेता और एक चिप विक्रेता दोनों के रूप में, XLC है (जो AIX के लिए डिफ़ॉल्ट सिस्टम कंपाइलर है, और कंपाइलर जिसके साथ AIX और i / OS दोनों संकलित हैं) । इंटेल का अपना कंपाइलर है। सन स्टूडियो में सन / ओरेकल का अपना कंपाइलर है।

फिर, PathScale और The Portland Group जैसे उच्च-प्रदर्शन वाले संकलक विक्रेता हैं, जिनके संकलक के लिए संकलक (और OpenMP लाइब्रेरी) का उपयोग किया जाता है।

डिजिटल मंगल अभी भी व्यापार में है। मेरा मानना ​​है कि वाल्टर ब्राइट को ग्रह पर एकमात्र व्यक्ति होने का अनूठा गौरव प्राप्त है जो स्वयं द्वारा उत्पादन-गुणवत्ता C ++ कंपाइलर (ज्यादातर) बनाने में कामयाब रहा।

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

एक मानद उल्लेख TruffleC के लिए निकलता है , जेवीएम (!) पर चल रहे एक सी दुभाषिया (!) ट्रूफ़ल एएसटी दुभाषिया ढांचे का उपयोग करके लिखा गया है जो कि जीसीसी और क्लैंग की तुलना में केवल 7% धीमा है (जो भी किसी भी विशेष बेंचमार्क पर सबसे तेज़ है)। कंप्यूटर लैंग्वेज बेंचमार्क गेम, और माइक्रोबैनमार्क पर दोनों की तुलना में तेज। TruffleC का उपयोग करते हुए, Truffle टीम रूबी C एक्सटेंशन को वास्तविक C रूबी कार्यान्वयन से तेज़ी से निष्पादित करने के लिए JRuby + Truffle के अपने संस्करण को प्राप्त करने में सक्षम थी!

तो, ये आपके द्वारा सूचीबद्ध किए गए 6 कार्यान्वयन हैं जिन्हें मैं अपने सिर के ऊपर से नाम दे सकता हूं, सी के बारे में कुछ भी जानने के बिना।


1
Microsoft Visual C के बाहर, आपके द्वारा उल्लेखित अधिकांश C कंपाइलर का उपयोग शायद ही कभी किया जाता है।
बेसिल स्टारीनेवविच

6
MSVC बड़ा C ++ कंपाइलर है, लेकिन C के लिए इसका उपयोग करना कठिन है और स्थायी रूप से C89 में अटक जाता है; माइक्रोकंट्रोलर कंपाइलर्स आमतौर पर लक्ष्य-विशिष्ट होते हैं, C89 में फंस जाते हैं, और विचित्र; TruffleC अभी तक उपलब्ध नहीं है (लेकिन दिलचस्प है, धन्यवाद)। Pathscale और Digital Mars अधिक प्रतिरूप की तरह प्रतीत होते हैं, जिनकी मुझे तलाश थी।
लेउशेंको

8
@ मेरा मतलब यह नहीं है कि C89 टूट गया है, लेकिन C89 भाषा का अद्यतित रूप नहीं है; और इसका मतलब है कि कम संकलक जो अप-टू-डेट मौजूद हैं।
लेउशेंको

6
@Leushenko MSVC स्थायी रूप से C89 में अटक नहीं है । कुछ चर्चाएं हुई हैं और अधिक C99 सुविधाओं को जोड़ा जाना चाहिए। शुरुआत के लिए, अधिकांश C99 लाइब्रेरी को MSVC 2015 के रूप में समर्थित किया गया है और कुछ भाषा सुविधाएँ भी (मुख्य रूप से C ++ 11 के लिए आवश्यक चीजें हैं)।
मोरवेन

5
@Morwenn: Microsoft की नीति से प्रतीत होता है कि C99 उन समस्याओं को हल करता है जो C ++ ने पहले ही हल नहीं की थीं, और यदि आप सिस्टम प्रोग्रामिंग कर रहे हैं, तो आपको C ++ के C- जैसे सबसेट का उपयोग करना चाहिए (कुछ भी जिसे रनटाइम की आवश्यकता नहीं है या नहीं। जहाँ आप संकलक चीजों को रखने के लिए नियंत्रित नहीं कर सकते हैं - यदि आपको यह सुनिश्चित करने की आवश्यकता है कि कोड या डेटा उन राज्यों से बाहर नहीं रखा गया है जहाँ पेजिंग अक्षम है)। C99 की एकमात्र विशेषताएँ बाद में C ++ स्पेक्स में आवश्यक चीजें होंगी, और जिन्हें लागू करने के लिए कोई ब्रेनर नहीं हैं।
माइक डिमिक

8

आपको कितने संकलक की आवश्यकता है?

यदि उनके पास अलग-अलग फीचर सेट हैं, तो आप पोर्टेबिलिटी की समस्या पैदा करते हैं। यदि वे आपके द्वारा चुने गए "डिफ़ॉल्ट" (जीसीसी, क्लैंग या वीएस) का चयन करते हैं। यदि आप पिछले 5% प्रदर्शन के बारे में परवाह करते हैं तो आपके पास एक बेंचमार्क-ऑफ है।

यदि आप प्रोग्रामिंग भाषा का काम मनोरंजक ढंग से या अनुसंधान उद्देश्यों के लिए कर रहे हैं, तो यह अधिक आधुनिक भाषा में होने की संभावना है। इसलिए योजना और एमएल के लिए खिलौना संकलक का प्रसार। हालांकि OCaml को गैर-खिलौना गैर-शैक्षणिक उपयोगों के लिए कुछ कर्षण मिल रहा है।

ध्यान दें कि यह भाषा द्वारा बहुत भिन्न होता है। जावा में अनिवार्य रूप से सूर्य / ओरेकल टूलचैन और जीएनयू एक है। पायथन में विभिन्न संकलक हैं जिनमें से कोई भी मानक दुभाषिया की तुलना में वास्तव में सम्मानित नहीं है। रस्ट और गो में एक-एक कार्यान्वयन है। C # में Microsoft और मोनो है।


1
यह स्पष्ट है कि एक एमएल कंपाइलर विकसित करने के लिए और अधिक दिलचस्प कारण हैं ... मैंने अभी सोचा था कि सी समुदाय शायद तीन परिमाण के तीन आदेशों से बड़ा होगा जो उस प्रभाव को संतुलित करेगा। लेकिन आप सही हो सकते हैं, 1000 * 0अभी भी है 0
लेउशेंको

एक नया संकलक बनाना अक्सर समुदाय के विखंडन के साथ जुड़ा हुआ है (या तो कारण या कारण)। उदाहरण के लिए, egcs बनाम gcc अनुरक्षक विभाजन। इसके अलावा, सी स्रोत संगतता 100% से नीचे हो जाती है।
pjc50

@ pjc50: जिस तरह से मानक को intविभिन्न प्रकार की चीजों के आधार पर कई असंगत बोलियों में सी को प्रभावी ढंग से उपविभाजित सी लिखा जाता है , और एक ही स्रोत कोड को बहुत अलग तरीके से व्याख्या करने के लिए अलग-अलग संकलक की आवश्यकता होगी।
सुपरकैट

5
मेरा मानना ​​है कि, गो को दो कार्यान्वयन ( 6g/ 8g/ ... टूलचिन और gccgo) हैं। वहाँ भी एक बहुत ही दिलचस्प मालिकाना व्यावसायिक कार्यान्वयन कहा जाता था जिसे erGo कहा जाता था, जो कि) a) गो का एक देशी विंडोज कार्यान्वयन था जब न तो gccgo और न ही मूल गो संकलक ने विंडोज पर बहुत अच्छा काम किया, b) गो, लॉन्ग पर दांव लगाने वाली कंपनी इससे पहले कि यह 1.0 हो गया, और ग) गो में लिखा गया गो का पहला कार्यान्वयन (gccgo और 6g / 8g दोनों C में लिखे गए हैं)। हालांकि, परियोजना और कंपनी दोनों गायब हो गए, हालांकि, इससे पहले कि वे बंद बीटा से बाहर निकल गए।
जोर्ग डब्ल्यू मित्तग

6

संकलित भाषाओं में C / C ++ अद्वितीय है क्योंकि इसमें एक सामान्य विनिर्देश के 3 प्रमुख कार्यान्वयन हैं।

किसी भी चीज को खारिज करने के नियम से जाना, जिसका ज्यादा इस्तेमाल नहीं किया गया है, हर दूसरी संकलित भाषा में 0 से 1 है।

और मुझे लगता है कि जावास्क्रिप्ट ही एकमात्र कारण है जिसे आपको 'संकलित' निर्दिष्ट करने की आवश्यकता है।


2
लेबल "C" को विभिन्न भाषाओं में लागू किया जाता है; कुछ कोड uint16_t a=48000u; unsigned uint32_t b=(a*a)/2;को b8192 के मान के रूप में परिभाषित करते हैं। कुछ इसे 1152000000 के रूप में परिभाषित करते हैं। आजकल ज्यादातर इसे अपरिभाषित व्यवहार के रूप में मानते हैं, और 3299483648 को संग्रहीत करने की संभावना रखते हैं, लेकिन उस संबंध में कोई वादा नहीं करते हैं।
सुपरकैट

1
@ सुपरकैट: आह, ओवरफ्लो और पूर्णांक पदोन्नति नियमों के साथ एक अच्छा अजीब। यह 2या 2uस्पष्ट रूप से उपयोग करने पर टिका है ।
ज़ेन लिंक्स

1
@ZanLynx: मुझे नहीं लगता कि ऐसे कोई मामले हैं जहां 2 बनाम 2u वैध रूप से मायने रखते हैं; केवल एक ही मामला मुझे पता है कि यह कहाँ हो सकता है जिसमें 2 और 2u दोनों के साथ अनिर्धारित व्यवहार शामिल है।
सुपरकैट

3
@ सुपरकैट: आपको अपरिभाषित व्यवहार कैसे मिलेगा /2u? अनसाइनड ओवरफ्लो को परिभाषित किया गया है (कार्यान्वयन-परिभाषित एन के लिए मोडुलो 2 ^ एन के रूप में), लेकिन विभाजन भी ओवरफ्लो नहीं कर सकता है।
एमएसल्टर्स

2
अपरिभाषित व्यवहार उन मूल्यों के गुणन से आएगा जिन्हें हस्ताक्षरित करने के लिए बढ़ावा दिया जाएगा int, लेकिन जिसका उत्पाद उस प्रकार में फिट नहीं होगा। इस बात पर जोर देने से कि अनिर्दिष्ट int के परिणामस्वरूप परिणामी मूल्य की व्याख्या बदल जाएगी, लेकिन पूर्ववर्ती गणना से अनिर्धारित व्यवहार को नकारना नहीं होगा।
सुपरकैट

5

तो आपकी लक्षित भाषा क्या है?

SML कंपाइलर अक्सर C या LLVM (या जैसा आपके लिंक, JVM या जावास्क्रिप्ट में देखा जाता है) को निशाना बना रहे हैं।

यदि आप C का संकलन कर रहे हैं, तो ऐसा नहीं है क्योंकि आप JVM में जा रहे हैं। आप सी। से भी बदतर कुछ करने जा रहे हैं । और फिर आप उस मामूली नरक को अपने सभी लक्षित प्लेटफार्मों के लिए समय का एक गुच्छा डुप्लिकेट करते हैं।

और यकीन है, C C ++ नहीं है, लेकिन मैं कहूंगा कि यह योजना की तुलना में C ++ के करीब है। यह अपरिभाषित व्यवहार की बुराई का अपना सबसेट है (मैं आपके प्रकारों में निर्मित आकार देख रहा हूं)। और यदि आप उस minutiae को पेंच करते हैं (या इसे "सही ढंग से" लेकिन अप्रत्याशित रूप से करते हैं) तो आपके पास महत्वपूर्ण प्रणालियों पर मौजूदा कोड के दशकों हैं जो आपको बताएंगे कि आप कितने भयानक हैं। यदि आप एक SML संकलक को पेंच करते हैं, तो यह काम नहीं करेगा - और कोई नोटिस कर सकता है । किसी दिन।


एसएमएल / एनजे और पॉलीएमएल दोनों मशीन कोड के लिए संकलित कर रहे हैं ...
बेसिल स्टायरनेविच

2
अंतरंग आकार "अपरिभाषित व्यवहार" कैसा है? और यूबी वैसे भी संकलक विक्रेताओं पर बोझ क्यों होगा? संकलक लेखकों के लिए एकमात्र वास्तविक बोझ यह है कि अंतर चौड़ाई कार्यान्वयन को परिभाषित किया गया है, अनिर्दिष्ट नहीं है, इसलिए आपको जो करना है उसे दस्तावेज़ करना होगा।
MSalters

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

@MSalters ज्यादातर लोगों intको 32 या 64 बिट्स होने की उम्मीद है लेकिन यह 16 बिट्स जितना छोटा हो सकता है। यह की श्रेणी से बाहर एक नंबर का उत्पादन करने के लिए सभी पर मुश्किल नहीं है [−32767, +32767]और intअतिप्रवाह यूबी है। वहाँ भी char/ shortप्रचारित हो रहा है int या unsigned int इस पर निर्भर करता है कि क्या intमूल प्रकार के प्रत्येक मूल्य का प्रतिनिधित्व कर सकते हैं, जो आगे रूपांतरण को ट्रिगर कर सकता intहै unsigned intअगर ऑपरेंड्स अलग-अलग प्रकार के थे और अलग-अलग रूपांतरित हो गए, साथ ही संभावित रूप से एक और रूपांतरण जब आप एक चर का परिणाम देते हैं। ।
डोभाल

@MSalters मानक प्रकारों और पर्याप्त निहित रूपांतरणों के आकार में पर्याप्त परिवर्तन है जो मैं शर्त लगाता हूं कि किसी भी गैर-तुच्छ सी कार्यक्रम के बारे में कानूनी पूर्णांक आकारों का एक विकल्प है जो इसे गलत काम करने का कारण बना देगा या अप्रभावित कर देगा। व्यवहार।
डोभाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.