2010-01-19 12 views
9

संभव डुप्लिकेट:
Why does C++ compilation take so long?अंतर

हाय,

मैं सी ++ और जावा संकलन प्रक्रिया है, लेकिन सी ++ और जावा के बीच मतभेद के लिए गूगल में खोजा गया भाषा की विशेषताएं और उनके अंतर वापस आ गए हैं।

मैं जावा में कुशल हूं, लेकिन सी ++ में नहीं। लेकिन मैंने सी ++ में कुछ बग तय की। मेरे अनुभव से, मैंने देखा कि सी ++ में मामूली परिवर्तनों के लिए जावा की तुलना में हमेशा अधिक समय लगता है।

सादर बाला

+1

यहां आधा जवाब पढ़ें: http://stackoverflow.com/questions/318398/why-does-c-compilation-take-so-long –

+1

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

+1

वही प्रश्न http://stackoverflow.com/questions/318398/why-does-c-compilation-take-so-long –

उत्तर

10

मेरे मन में कुछ उच्च स्तरीय मतभेद हैं। उनमें से कुछ सामान्यीकरण हैं और "अक्सर ..." या "कुछ कंपाइलर्स ..." के साथ उपसर्ग किया जाना चाहिए, लेकिन पठनीयता के लिए मैं इसे छोड़ दूंगा।

  • C/C++ संकलन बाइनरी फ़ाइलें से किसी भी जानकारी को पढ़ने नहीं है, लेकिन केवल हेडर फाइल में पूर्ण पार्स करने की आवश्यकता है से विधि/प्रकार परिभाषाएं पढ़ता है (अपवाद: precompiled हेडर)
  • C/C++ संकलन एक पूर्व प्रोसेसर कदम है कि एक विस्तृत पाठ बदलने की सरणी (जो हैडर पूर्व संकलन कठिन करने के लिए बनाता है)
  • सी ++ वाक्य रचना एक बहुत अधिक जावा वाक्य रचना
  • सी ++ प्रकार प्रणाली है बहुत अधिक जटिल है क्या कर सकते हैं जावा टाइप सिस्टम
  • सी ++ संकलन सामान्य से बहुत अधिक जटिल ly देशी असेंबलर कोड उत्पन्न करता है, जो अपेक्षाकृत सरल बाइट कोड
  • सी ++ कंपेलरों को अनुकूलन करने की आवश्यकता है क्योंकि कोई अन्य चीज नहीं है जो उन्हें करने के लिए बहुत जटिल है। जावा कंपाइलर जावा बाइट कोड में जावा स्रोत कोड का एक सरल 1: 1 अनुवाद करता है, उस चरण में कोई अनुकूलन नहीं किया जाता है (जो कि JVM के लिए छोड़ दिया जाता है)।
  • सी ++ में एक टेम्पलेट भाषा है जो ट्यूरिंग पूर्ण है! (इसलिए सख्ती से सी ++ कोड को चलाने की आवश्यकता है निष्पादन योग्य कोड उत्पन्न करने के लिए और सी ++ कंपाइलर को आपको यह बताने के लिए रोकथाम की समस्या को हल करने की आवश्यकता होगी कि क्या मनमानी सी ++ कोड संकलित है)।
8

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

0

सभी भाषा की सुविधाओं का उपयोग कर एक सी ++ प्रोग्राम संकलित करने के लिए स्वाभाविक रूप से अधिक कठिन है। कई प्रकार के साथ कुछ टेम्पलेट आमंत्रण उत्पन्न करने के लिए कोड की मात्रा को आसानी से दोगुना या तीन गुना कर सकते हैं।

0

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

एक अन्य कारक यह है कि # अंतर्निहित तंत्र का अर्थ है कि जब भी आप एक .h फ़ाइल बदलते हैं, तो सभी .o फाइलें जो निर्भर करती हैं इसे पुनर्निर्मित करने की जरूरत है। जावा में, एक .class फ़ाइल एक से अधिक .java फ़ाइल (उदाहरण के लिए: निरंतर इनलाइनिंग की वजह से) पर निर्भर हो सकती है, लेकिन इन "हॉट स्पॉट्स" में बहुत कम है, जहां एक स्रोत फ़ाइल को बदलने के लिए कई अन्य स्रोत फ़ाइलों को होना आवश्यक है पुनर्निर्माण किया।

इसके अलावा, यदि आप ग्रहण जैसे आईडीई का उपयोग कर रहे हैं तो यह हर समय पृष्ठभूमि में अपना जावा कोड बना रहा है, इसलिए जब तक आप इसे बनाने के लिए कहें तो इसे पहले से ही अधिकतर (अगर पूरी तरह से नहीं किया जाता है)।

3

मुझे यकीन नहीं है कि आप जावा और सी ++ की संकलन गति को तुलनीय होने की अपेक्षा क्यों करते हैं क्योंकि वे अलग-अलग डिज़ाइन गाओल्स और कार्यान्वयन के साथ अलग-अलग भाषाएं हैं।

कि कुछ विशिष्ट मतभेद को ध्यान में रखने के लिए कहा हैं:

  • जावा बाइट कोड को संकलित किया गया है और नीचे मशीन कोड सही नहीं। इस सार वर्चुअल मशीन के लिए संकलन सरल है।
  • सी ++ संकलन में केवल compilation but also linking शामिल नहीं है। तो यह आमतौर पर एक बहु कदम प्रक्रिया है।
  • जावा कुछ देर से बाध्यकारी करता है जो एक फ़ंक्शन के लिए कॉल का सहयोग होता है और चलाने के लिए वास्तविक कोड रनटाइम पर किया जाता है। इसलिए एक क्षेत्र में एक छोटे से बदलाव को पूरे कार्यक्रम की संकलन ट्रिगर करने की आवश्यकता नहीं है। सी ++ में इस एसोसिएशन को संकलन समय पर किया जाना चाहिए जिसे इसे प्रारंभिक बाध्यकारी कहा जाता है।
0

जावा किसी भी स्रोत कोड को बाइटकोड में संकलित करता है, जिसे जेवीएम द्वारा व्याख्या किया जाता है। इस सुविधा के कारण इसे कई प्लेटफ़ॉर्म में उपयोग किया जा सकता है।