"ऑब्जेक्टिव-सी, C ++ की तुलना में C का सुपरसेट क्या है?"


87

मैं वहाँ क्या पढ़ता हूँ: क्यों उद्देश्य-सी Apple समुदाय के बाहर बहुत लोकप्रिय नहीं है?

उद्देश्य-सी, सी का एक सुपरसेट है (सी ++ की तुलना में बहुत अधिक सख्ती से, वास्तव में) इसलिए पिछड़े संगतता का मुद्दा नहीं उठता है। C में आप कुछ भी कर सकते हैं आप Objective-C में कर सकते हैं।

सुपरसेट होना बाइनरी है, जैसे गर्भवती होना। ओबज-सी सी का सुपरसेट है, और सी ++ नहीं है।

सुपरसेट से उनका क्या मतलब है? किस तरह से वस्तुनिष्ठ-सी, सी के मुकाबले अधिक निकट // पिछड़ा होगा? किस तरह से वस्तुनिष्ठ-सी C दर्शन की तुलना में C ++ से अधिक बारीकी से अनुसरण करता है?

क्या किसी उद्देश्य-सी संकलक (100% संगतता) द्वारा संशोधन के बिना कोई सी कार्यक्रम संकलित किया जा सकता है?

यह प्रोग्रामिंग भाषा के डिजाइन और संगतता के बारे में एक प्रश्न है जिसमें एक युद्ध बेहतर है।

जवाबों:


134

मैंने एक साधारण चित्र तैयार किया; यह बहुत सुंदर नहीं है, लेकिन उम्मीद है कि इस बिंदु को पार किया जाएगा:

  • लाल: सी, सी ++ और ऑब्जेक्टिव-सी (अपेक्षाकृत छोटे) में मान्य सभी कार्यक्रमों का सेट
  • ग्रीन: सी और ऑब्जेक्टिव-सी में मान्य सभी कार्यक्रमों का सेट, लेकिन सी ++ में अमान्य (और भी छोटा)
  • ग्रे: ऑब्जेक्टिव C और C ++ में मान्य सभी प्रोग्रामों का सेट, लेकिन C में अमान्य (खाली, जहाँ तक मुझे पता है)
  • नीला: केवल उद्देश्य C (अपेक्षाकृत बड़े) में मान्य सभी कार्यक्रमों का सेट
  • पीला: केवल C ++ (सबसे बड़ा) में मान्य सभी कार्यक्रमों का सेट

वैध सी कार्यक्रमों का सेट (लाल और हरे रंग में) वैध उद्देश्य कार्यक्रमों (नीला) के सेट का एक सख्त उपसमूह है

यहाँ छवि विवरण दर्ज करें


14
उद्देश्य c ++ के बारे में क्या?
user1115057


19
किस उपाय से आप दावा करते हैं कि यहाँ पीले नीले रंग से "बड़े" हैं? अंतर्ज्ञान मुझे बताता है कि दोनों सेट अनगिनत अनंत होंगे।
विम

4
@wim: और दोनों को R ^ 2 के बेशुमार सबसेट के रूप में दर्शाया गया है;) यह एक ही ट्रिक है क्योंकि आप Q के अंदर N को देखेंगे क्योंकि उनके समान आकार होने के बावजूद (और N, Q का सख्त उपसमूह है)।
मैकीज पाइचोटका

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

62
  1. सुपरसेट से उनका क्या मतलब है?

    उनका मतलब है सख्त सुपरसेट। कोई भी मान्य C प्रोग्राम ऑब्जेक्टिव-सी कंपाइलर से संकलित होगा। कुछ मान्य C प्रोग्राम C ++ कंपाइलर के साथ संकलित नहीं होंगे।

  2. किस तरह से वस्तुनिष्ठ-सी, सी के मुकाबले अधिक निकट // पिछड़ा होगा?

    यहाँ एक सरल उदाहरण है:

    int *foo = malloc(12);
    

    C और ऑब्जेक्टिव-C में संकलन है, लेकिन C ++ में नहीं। बेशक, अन्य उदाहरण भी हैं।

  3. किस तरह से वस्तुनिष्ठ-सी C दर्शन की तुलना में C ++ से अधिक बारीकी से अनुसरण करता है?

    ऑल - ऑब्जेक्टिव-सी, सी का एक सख्त सुपरसेट है।

  4. क्या किसी उद्देश्य-सी संकलक (100% संगतता) द्वारा संशोधन के बिना कोई सी कार्यक्रम संकलित किया जा सकता है?

    हाँ।


2
हां, यह ठीक रहेगा। संभवतः आपको GUI के लिए Objective-C की आवश्यकता नहीं है, या तो, यदि आप निम्न-स्तरीय रनटाइम फ़ंक्शन का उपयोग करने के लिए तैयार हैं।
कार्ल नॉरम

3
अधिकतर दार्शनिक।
कार्ल नॉरम

2
+1 महान व्याख्या। मेरा सुझाव है कि "सी दर्शन" का प्रश्न थोड़ा अस्पष्ट है, लेकिन अधिकांश पर्यवेक्षक शायद इस बात से सहमत होंगे कि सी के "लक्ष्य" और ओबीजीसी के "लक्ष्य" अलग-अलग हैं। C का इरादा कुछ उपयोगी पोर्टेबिलिटी एब्स्ट्रक्शन प्रदान करते हुए हार्डवेयर के बहुत करीब होना है, जबकि ObjC का लक्ष्य C. के लिए एक SmallTalk दृष्टिकोण लाना है क्योंकि कोको हाल के वर्षों में ObjC का अभिन्न अंग बन गया है, यह विचलन और भी मजबूत है। सी-सरणी और एक NSArray के "दर्शन" (डिजाइन दृष्टिकोण) निश्चित रूप से बहुत अलग हैं।
रोब नेपियर

2
यह पूरी तरह से कार्यक्रम पर निर्भर करता है। संभवतः आप एक उद्देश्य-सी कार्यक्रम में बहुत सी सी-शैली की चीजें नहीं करेंगे। तब आप Objective-C का उपयोग क्यों करेंगे?
कार्ल नॉरम

1
@ user1115057: आपको इस बात की ज्यादा चिंता नहीं करनी चाहिए कि चीजों को कैसे माना जाता है। C ++ कोड लिखने के साथ दो समस्याएं हैं जो (या कम से कम जैसी दिखती हैं) C. एक यह है कि आपको C ++ का कोई लाभ नहीं मिल रहा है, लेकिन यह आपकी कॉल है। महत्वपूर्ण यह है कि आप सी की एक टूटी हुई बोली में लिख रहे हैं जो वास्तव में सी नहीं है। आपको इसके बजाय एक सी कंपाइलर के साथ अपने सी कोड को संकलित करना चाहिए और इसे अपने सी ++ कोड के खिलाफ लिंक करना चाहिए। यही कारण है कि बाद के लिए चिंता का विषय ऑब्जेक्टिव-सी के साथ लागू नहीं होता, ऑब्जेक्टिव-सी के सबसेट है कि सी के रूप में compiles, के बाद से है सी
स्टीव जेसप

31

ग्राउंड अप से, C ++ को "बेहतर C" के रूप में डिज़ाइन किया गया है, जो डिजाइन चूक को ठीक कर रहा है, दोनों वास्तविक और कथित, क्योंकि C ++ के लेखक भाषा के माध्यम से गए थे। इस डिजाइन निर्णय का परिणाम यह Xरहा है कि एक वैध सी प्रोग्राम होने की गारंटी नहीं Xथी जो C ++ कंपाइलर द्वारा संसाधित किए जाने पर, अकेले चलने देंगे। परिवर्तनों ने ऐसे बुनियादी निर्माणों को स्ट्रिंग शाब्दिक (वे बन गए const char*), voidसंकेत के असाइनमेंट , enumएस और अभिन्न प्रकार के बीच रूपांतरण , यौगिक असाइनमेंट ऑपरेटरों के शब्दार्थ और इतने पर छुआ ।

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

इसके विपरीत, ऑब्जेक्टिव C को C के एक सुपरसेट के रूप में तैनात किया गया है, जिसके लिए सभी वैध C प्रोग्राम्स को Objective C कंपाइलर के साथ कंपाइल करने की आवश्यकता होती है।


4
मैंने इस सवाल का जवाब दिया है क्योंकि मुझे पता है कि "सुपरसेट" क्या है, लेकिन मैं ऑब्जेक्टिव-सी के बारे में कुछ नहीं जानता। मैंने एक और SO प्रश्न में एक दावा देखा है, कि मान्य C कोड स्निपेट int nil = 0; nil++;Objective-C के रूप में संकलित नहीं करता है। वहां क्या समस्या है, क्या यह स्पष्ट बात है कि ऑब्जेक्टिव-सी हेडर उपलब्ध करता है, जो एक बार शामिल हो जाने पर, आपके कोड को ठीक उसी तरह तोड़ सकता है जैसे कि सी हेडर? और इसलिए उस स्निपेट के लेखक को उन्हें शामिल नहीं करना चाहिए था।
स्टीव जेसप

2
"nil" वास्तव में एक कीवर्ड के बजाय #define है। आप समस्याएं देख रहे हैं क्योंकि objc / objc.h शामिल है। यदि आप YES नामक एक चर बनाने की कोशिश करते हैं तो यह उन समस्याओं के समान है जिन्हें आपने देखा होगा। (Xcode इन पर प्रकाश डालता है जैसे कि वे वास्तव में कीवर्ड थे क्योंकि इसके बारे में इस तरह से सोचना बहुत आसान है; लेकिन वे सरल सी कोड के रूप में कार्यान्वित किए जाते हैं।)
रोब नेपियर

4
BTW, यह objc.ha के आसपास थूकने के लायक है यदि आप रुचि रखते हैं कि ObjC C. के शीर्ष पर कैसे रहता है। आपको लगता है कि कीवर्ड होंगे (आईडी, BOOL, कक्षा, शून्य, आदि) बस सरल प्रकार, संरचनाएं हैं। , और परिभाषित करता है। आप शुद्ध-सी में हाथ से पास होने वाले संदेश को भी लागू कर सकते हैं। कभी नहीं, कभी ऐसा करो। : डी लेकिन आप कर सकते हैं। github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
रोब नेपियर

2
@DanNeely: रॉब नेपियर ने कहा "कभी नहीं, कभी ऐसा मत करो" लिंक फ़ाइल के बारे में एक टिप्पणी के रूप में। लिंक की गई फ़ाइल है नहीं ऑब्जेक्टिव-सी क्रम, यह सिर्फ एक त्वरित हैक कि शो कैसे संदेश के कुछ वास्तव में काम करता है।
डिट्रीच एप्प

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

12

"ऑब्जेक्टिव-सी, सी का एक सुपरसेट है" जिसका अर्थ है कि प्रत्येक वैध सी प्रोग्राम एक वैध ऑब्जेक्टिव-सी प्रोग्राम है (उसी अर्थ के साथ)।

यह कभी-कभी कहा जाता है, हालांकि सी ++ विशेषज्ञों द्वारा नहीं, कि सी ++ सी का एक सुपरसेट है। यह सटीक नहीं है, यही कारण है कि आपका उद्धरण दोनों की तुलना करने का एक बड़ा सौदा बना रहा है।


9

ऑब्जेक्टिव C, C से पिछड़े-संगत एक्सटेंशन का एक सेट है। यह संभव है क्योंकि ऑब्जेक्टिव C फीचर्स को बहुत ही सरल तरीके से सीमांकित किया जाता है:

  • चरित्र का उपयोग @। यह पात्र वर्तमान में C भाषा में उपयोग नहीं किया गया है।
  • तरीकों को लागू करने के लिए एक सरल वाक्यविन्यास विस्तार [obj method:argument]। C में, वर्ग ब्रैकेट का उपयोग सरणी सबस्क्रिप्टिंग के लिए बहुत विशिष्ट तरीके से किया जाता है, और इसलिए यह अमान्य C सिंटैक्स है। अमान्य सिंटैक्स पर निर्मित एक्सटेंशन होस्ट भाषा में मान्य किसी भी चीज़ का अर्थ नहीं बदलते हैं।

यह देखना आसान है कि कोई भी प्रोग्राम जो ऑब्जेक्टिव सी एक्सटेंशन का उपयोग नहीं करता है, वह आईएसओ सी प्रोग्राम का सख्ती से पालन कर सकता है, चाहे वह कितना भी सरल क्यों न हो। इसके अलावा, प्रत्येक आईएसओ सी कार्यक्रम को वैध उद्देश्य सी कार्यक्रम होने के लिए, परिभाषा के अनुसार घोषित किया जा सकता है। उद्देश्य C, C99 और C11 जैसे विकास का आसानी से अनुसरण कर सकता है।

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

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

C ++ का इलाज करते समय टूटने वाला C प्रोग्राम का एक तुच्छ उदाहरण कोई भी C प्रोग्राम है जो C ++ कीवर्ड को पहचानकर्ता के रूप में उपयोग करता है, जैसे classया virtual। उद्देश्य सी किसी भी आरक्षित कीवर्ड का परिचय नहीं देता है। इसमें नए कीवर्ड हैं जो @चरित्र द्वारा पेश किए गए हैं, जैसे @interface

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