असेंबली कोड जनरेशन, उपलब्ध लाइब्रेरी, लैंग्वेज फीचर्स आदि के संदर्भ में C और C ++ कोड को कंपाइल करते समय 3 कंपाइलर CC, gcc, g ++ में क्या अंतर हैं?
असेंबली कोड जनरेशन, उपलब्ध लाइब्रेरी, लैंग्वेज फीचर्स आदि के संदर्भ में C और C ++ कोड को कंपाइल करते समय 3 कंपाइलर CC, gcc, g ++ में क्या अंतर हैं?
जवाबों:
इसका उत्तर प्लेटफ़ॉर्म-विशिष्ट है; उदाहरण के लिए, लिनक्स पर जो होता है वह सोलारिस पर होता है।
आसान हिस्सा (क्योंकि यह प्लेटफ़ॉर्म-विशिष्ट नहीं है) 'gcc' और 'g ++' का पृथक्करण है:
कठिन हिस्सा, क्योंकि यह प्लेटफ़ॉर्म-विशिष्ट है, 'CC' (और 'cc') का अर्थ है।
हालाँकि, सोलारिस पर भी, यह हो सकता है कि cc पुराना BSD- आधारित C कंपाइलर है /usr/ucb
। व्यवहार में, कि आमतौर पर स्थापित नहीं है और बस एक ठूंठ है जो विफल रहता है, उन लोगों पर कहर बरपाता है जो स्वयं-कॉन्फ़िगर सॉफ़्टवेयर को संकलित करने और स्थापित करने का प्रयास करते हैं।
HP-UX पर, डिफ़ॉल्ट 'cc' अभी भी एक K & R-C C कंपाइलर है जो आवश्यक होने पर कर्नेल को हटाने की अनुमति देने के लिए स्थापित किया गया है, और आधुनिक सॉफ़्टवेयर कार्य के लिए अनुपयोगी है क्योंकि यह मानक C का समर्थन नहीं करता है। आपको वैकल्पिक संकलक नामों का उपयोग करना होगा ('एसीसी' IIRC)। इसी तरह, AIX पर, सिस्टम C कंपाइलर 'xlc' या 'xlc32' जैसे नामों से जाता है।
शास्त्रीय रूप से, डिफ़ॉल्ट सिस्टम कंपाइलर को 'cc' कहा जाता था और सेल्फ-कॉन्फिगरिंग सॉफ्टवेयर उस नाम पर वापस आ जाता है, जब उसे पता नहीं होता है कि उसे और क्या उपयोग करना है।
POSIX ने प्रोग्राम को c89 (मूल रूप से) और बाद में c99 के अस्तित्व में लाने की आवश्यकता के द्वारा इसके चारों ओर अपना रास्ता बनाने का प्रयास किया; ये ISO / IEC 9899: 1989 और 9899: 1999 C मानकों के अनुरूप हैं। यह संदिग्ध है कि POSIX सफल रहा।
सवाल सुविधाओं और पुस्तकालयों के संदर्भ में अंतर के बारे में पूछता है। पहले की तरह, उत्तर भाग में विशिष्ट मंच है, और भाग में सामान्य है।
बड़ा डिवाइड C कंपाइलर और C ++ कंपाइलर के बीच होता है। C ++ कंपाइलर C ++ प्रोग्राम को स्वीकार करेगा और मनमाने C प्रोग्राम को कंपाइल नहीं करेगा। (हालांकि सी को एक सबसेट में लिखना संभव है जिसे सी ++ द्वारा भी समझा जाता है, कई सी प्रोग्राम मान्य सी ++ प्रोग्राम नहीं हैं)। इसी तरह, सी कंपाइलर सी प्रोग्राम स्वीकार करेंगे और अधिकांश सी ++ प्रोग्राम को अस्वीकार कर देंगे (क्योंकि अधिकांश सी ++ प्रोग्राम कंस्ट्रक्शन का उपयोग सी में उपलब्ध नहीं हैं)।
उपयोग के लिए उपलब्ध पुस्तकालयों का सेट भाषा पर निर्भर करता है। सी ++ प्रोग्राम आमतौर पर किसी दिए गए प्लेटफ़ॉर्म पर सी लाइब्रेरीज़ का उपयोग कर सकते हैं; C प्रोग्राम आमतौर पर C ++ लाइब्रेरीज़ का उपयोग नहीं कर सकते हैं। इसलिए, C ++ में पुस्तकालयों का एक बड़ा सेट उपलब्ध है।
ध्यान दें कि यदि आप सोलारिस पर हैं, तो CC द्वारा निर्मित ऑब्जेक्ट कोड g ++ द्वारा निर्मित ऑब्जेक्ट कोड के साथ संगत नहीं है - वे दो अलग-अलग संकलक हैं, जैसे अपवाद हैंडलिंग और नाम मैन्नेलिंग (और नाम प्रबंधन) जानबूझकर चीजों के लिए अलग-अलग सम्मेलनों के साथ हैं। यह सुनिश्चित करने के लिए अलग है कि असंगत वस्तु फाइलें एक साथ जुड़ी नहीं हैं!)। इसका मतलब है कि यदि आप CC के साथ संकलित लाइब्रेरी का उपयोग करना चाहते हैं, तो आपको अपने पूरे प्रोग्राम को CC के साथ संकलित करना होगा। इसका यह भी अर्थ है कि यदि आप CC के साथ संकलित एक लाइब्रेरी का उपयोग करना चाहते हैं और g ++ के साथ अन्य संकलित हैं, तो आप भाग्य से बाहर हैं। आपको पुस्तकालयों में से किसी एक को कम से कम recompile करना होगा।
असेम्बलर की गुणवत्ता के संदर्भ में, GCC (GNU कम्पाइलर कलेक्शन) बहुत अच्छा काम करता है। लेकिन कभी-कभी देशी कंपाइलर थोड़ा बेहतर काम करते हैं। इंटेल कंपाइलरों में अधिक व्यापक अनुकूलन हैं जिन्हें अभी तक जीसीसी में दोहराया नहीं गया है, मेरा मानना है। लेकिन इस तरह के किसी भी असंतोष खतरनाक हैं, जबकि हम नहीं जानते कि आप किस मंच से चिंतित हैं।
भाषा सुविधाओं के संदर्भ में, कंपाइलर आमतौर पर वर्तमान मानकों (C ++ 98, C ++ 2003, C99) के काफी करीब हैं, लेकिन आमतौर पर मानक भाषा और संकलक द्वारा समर्थित भाषा के बीच छोटे अंतर होते हैं। पुराने C89 मानक समर्थन अनिवार्य रूप से सभी C कंपाइलरों के लिए समान (और पूर्ण) हैं। भाषा के गहरे कोनों में अंतर हैं। आपको 'अपरिभाषित व्यवहार', 'प्रणाली परिभाषित व्यवहार' और 'अनिर्दिष्ट व्यवहार' को समझने की आवश्यकता है; यदि आप अपरिभाषित व्यवहार करते हैं, तो आपको अलग-अलग समय पर अलग-अलग परिणाम मिलेंगे। संकलक के व्यवहार को मोड़ने के लिए कई विकल्प (विशेष रूप से जीसीसी के साथ) हैं। जीसीसी में कई प्रकार के एक्सटेंशन हैं जो जीवन को सरल बनाते हैं यदि आप जानते हैं कि आप केवल उस कंपाइलर परिवार को लक्षित कर रहे हैं।
CC
एक पर्यावरण चर है जो सिस्टम के C कंपाइलर का जिक्र करता है। यह (पुस्तकालयों के लिए सुलभ, आदि) की ओर इशारा करता है। अक्सर यह इंगित करेगा /usr/bin/cc
, वास्तविक सी अनिवार्य (चालक)। लिनक्स प्लेटफार्मों पर, CC
लगभग हमेशा इंगित करता है /usr/bin/gcc
।
gcc
GNU संकलक संग्रह के लिए ड्राइवर बाइनरी है। यह C, C ++ और संभवतः अन्य भाषाओं को संकलित कर सकता है; यह फ़ाइल एक्सटेंशन द्वारा भाषा को निर्धारित करता है।
g++
एक ड्राइवर बाइनरी है gcc
, लेकिन C ++ को संकलित करने के लिए कुछ विशेष विकल्पों के साथ। विशेष रूप से (मेरे अनुभव में), g++
डिफ़ॉल्ट रूप से libstdc ++ को लिंक करेगा, जबकि gcc
ऐसा नहीं होगा।
./configure
+ इस्तेमाल किए गए सी कंपाइलर को प्रभावित करने के make
लिए एक पर्यावरण चर नाम CC
ले सकता है, लेकिन अन्यथा उस नाम से आम तौर पर एक पर्यावरण चर नहीं है।
मैं लिनक्स में cc क्या सिर्फ एक जानकारी जोड़ना चाहता हूँ। यह gcc से जुड़ा हुआ है। इसकी जांच करना।
इसी तरह, सी ++ के साथ भी यही बात है।
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++