2010-06-14 31 views
5

सी (सी 99 मानक) में आप क्या नहीं कर सकते हैं जिसे आप उद्देश्य-सी में कर सकते हैं? (कोड उदाहरण के साथ यदि आप कृपया)सी में आप क्या नहीं कर सकते हैं जिसे आप उद्देश्य-सी में कर सकते हैं?

+0

क्या आपका मतलब है "उद्देश्य-सी के लिए क्या वाक्यविन्यास अद्वितीय है"? –

+8

वे दोनों ट्यूरिंग पूर्ण हैं ... – James

+1

ऑब्जेक्ट उन्मुख प्रोग्रामिंग आसानी से? (सी में जबकि यह कठिन होगा ...) – ShinTakezou

उत्तर

9

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

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

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

@interface NumberAdder : NSObject { 
    int storedValue; 
} 

- (id)initWithStoredValue:(int)value; 
- (int)resultOfAddingStoredValue:(int)numberToAdd; 
@end 

@implementation NumberAdder 
- (int)resultOfAddingStoredValue:(int)numberToAdd { 
    return numberToAdd + storedValue; 
} 

- (id)initWithStoredValue:(int)value { 
    if (!(self = [super init])) return nil; 
    storedValue = value; 
    return self; 
} 
@end 

int main() { 
    id adder = [[NumberAdder alloc] initWithStoredValue:4]; 
    int result = [adder resultOfAddingStoredValue:3]; 
    printf("It is %d\n", result); 
    return 0; 
} 

यहाँ और एक ही बात ऑब्जेक्टिव-सी क्रम के साथ सी में लिखा है (परीक्षण नहीं किया है, लेकिन मोटे तौर पर सही होना चाहिए): उदाहरण के लिए, यहाँ एक सरल ऑब्जेक्टिव-सी में लिखा कार्यक्रम है

int returnPlusStoredValueImp(id self, SEL _cmd, int arg) { 
    int *storedValue = nil; 
    object_getInstanceVariable(self, "storedValue", &storedValue) 
    return arg + *storedValue; 
} 

id numberAdderInit(id self, SEL _cmd, int valueToStore) { 
    objc_super superInfo = {self, objc_lookupClass("NSObject")}; 
    self = objc_msgSendSuper(super_info, sel_getName("init")); 
    if (!self) return nil; 
    object_setInstanceVariable(self, "storedValue", &valueToStore); 
    return self; 
} 

void createNumberAdderClass() __attribute(constructor)__ { 
    Class NumberAdder = objc_allocateClassPair(objc_lookupClass("NSObject"), "NumberAdder", 0); 
    if (!NumberAdder) return; 
    class_addIvar(NumberAdder, "storedValue", sizeof(int), 4, "i"); // I'm actually not sure if the fourth argument is correct, so it's probably wrong, but just take that as a sign of how much this way of coding sucks 
    objc_registerClassPair(NumberAdder); 
    SEL nameOfPlusStoredValue = sel_registerName("resultOfAddingStoredValue:"); 
    SEL nameOfInit = sel_registerName("initWithStoredValue:"); 
    class_addMethod(NumberAdder, nameOfPlusStoredValue, returnPlusStoredValueImp, "[email protected]:i"); 
    class_addMethod(NumberAdder, nameOfInit, numberAdderInit, "@@:i"); 
} 

int main() { 
    id adder = objc_msgSend(objc_lookupClass("NumberAdder"), sel_getName"alloc"); 
    adder = objc_msgSend(adder, sel_getName("initWithStoredValue:"), 4); 
    int result = (int)objc_msgSend(adder, sel_getName("resultOfAddingStoredValue:"), 3); 
    printf("It is %d\n", result); 
    return 0; 
} 
+1

+1। अच्छा उत्तर। – bbum

+0

वस्तुतः +2, क्योंकि कंप्यूटर भाषाओं के आस-पास के पूरे बिंदु यह (या आसपास) है, अन्यथा हम सभी अभी भी असेंबली का उपयोग करेंगे, क्योंकि उच्च "भाषाई संरचनाओं" की आवश्यकता नहीं होगी। – ShinTakezou

1

ऐसी कोई बात नहीं है। आम तौर पर, आप किसी प्रोग्रामिंग भाषा में कुछ भी प्रोग्राम कर सकते हैं।

+5

जब तक "कुछ भी" बहुत सारी चीज़ें छोड़ देता है। – danben

+1

शानदार, क्या आप अपना समाधान हलिंग समस्या के लिए पोस्ट कर सकते हैं। http://en.wikipedia.org/wiki/Halting_problem – JeremyP

+0

वास्तव में Sjoerd? अनुमान है कि हमें केवल एक प्रोग्रामिंग भाषा की आवश्यकता है!/कटाक्ष – Jage

8

बिलकुल कुछ भी नहीं। ऑब्जेक्टिव-सी के OO सुविधाओं सी

में लिखा एक छोटी सी क्रम पुस्तकालय के रूप में लागू किया जाता है कुछ टिप्पणीकर्ताओं का कहना सकता है कि ऑब्जेक्टिव-सी ब्लॉक हैं और सी नहीं, कि वास्तव में एक जीसीसी/LLVM को विस्तार सी है है कि उद्देश्य-सी का उपयोग करता है, यह ओबीजेसी सुविधा नहीं है।

+2

एक सुविधा जो अक्सर उपयोग से परहेज करती है, क्योंकि इसे कभी-कभी निष्पादन योग्य ढेर की आवश्यकता होती है (जीसीसी एक ट्रैम्पोलिन उत्पन्न करता है ढेर फ्रेम को बहाल करने के लिए ढेर पर, ताकि घोंसला घोंसला काम करता है, एक ट्रैम्पोलिन एक छोटा सा कार्य होता है जो कुछ जादू करता है: पी) एक निष्पादन योग्य ढेर उपलब्ध नहीं हो सकता है ... उदाहरण के लिए एनएक्स चालू है (जीसीसी शायद पागलपन का उपयोग करता है या कुछ ऐसा है जो अभी भी काम करेगा ... शायद) – Spudd86

+2

ग्राहम के अच्छी तरह से बनाए गए बिंदुओं को जोड़ने के लिए, छोटी रनटाइम लाइब्रेरी को उन सी कार्यों के सेट के रूप में भी उजागर किया जाता है जिन्हें आप उपयोग करने की अनुमति देते हैं। दूसरे शब्दों में, आप उद्देश्य-सी का उपयोग किये बिना उद्देश्य-सी पुस्तकालयों का भी उपयोग कर सकते हैं। यहां देखें: http://developer.apple.com/mac/library/documentation/cocoa/reference/objcruntimeref/Reference/reference.html – harms

+3

ब्लॉक - जैसा कि मैक ओएस एक्स में कार्यान्वित किया गया है - बिल्कुल * नहीं * निष्पादन योग्य की आवश्यकता है ढेर। यह उनके डिजाइन में एक आवश्यकता थी। – bbum

3

जैसा कि ग्राहम ने कहा - उद्देश्य-सी में ऐसा कुछ भी नहीं किया जा सकता है जो सी में नहीं किया जा सकता है। बेशक, सी में आप कुछ भी नहीं कर सकते हैं, या तो, असेंबली में किया जाना चाहिए। यह सिर्फ टाइपिंग का मामला है।

(मुझे उम्मीद थी कि विधानसभा उल्लेख नहीं है कि इंगित करने के लिए पर्याप्त होगा, नहीं, मैं दूर नहीं सुझाव दे रहा हूँ शुद्ध सी में है कि लेखन OO पैटर्न दूर करने के लिए एक उत्पादक बात ... है) वहाँ हित के लिए कुछ अतिरिक्त अंक दिए गए हैं:

  • ऑब्जेक्टिव-सी एक पूर्वप्रक्रमक कि सी कोड है कि एक मानक सी संकलक द्वारा संकलित किया जा सकता है में ऑब्जेक्टिव-सी कोड बदल गया के रूप में बाहर शुरू कर दिया। यही है, उद्देश्य-सी मूल रूप से सीधे संकलित नहीं किया गया था, लेकिन सीधे सी में अनुवाद किया गया, फिर संकलित।

  • ऑब्जेक्टिव-सी वस्तुओं सी संरचनाओं के रूप में के बारे में सोचा जा सकता है जहां संरचना में पहली प्रविष्टि - isa - Class - - कि संरचना/उदाहरण का वर्णन करता है हमेशा मेटाडाटा के लिए सूचक है।

  • ब्लॉक सी के लिए एक विस्तार है, जिसे अब डब्ल्यूजी -14 (सी मानकों समिति) में सी भाषा के अतिरिक्त के रूप में प्रस्तावित किया गया है। ऐप्पल द्वारा कार्यान्वित किए गए ब्लॉक, बिल्कुल को एक्जिक्यूटेबल स्टैक की आवश्यकता होती है। यह उनके डिजाइन में एक कठिन आवश्यकता थी।

  • एलएलवीएम में एक पुनरावर्तक है जो वास्तव में उद्देश्य-सी से सी को फिर से लिख सकता है और स्पष्ट रूप से इसका उपयोग Xbox 360 गेम में उद्देश्य-सी कोडिंग को सक्षम करने के लिए किया गया है (http://permalink.gmane.org/gmane.comp.compilers.llvm.devel/31996 देखें)।

+0

केवल टाइपिंग की बात नहीं है। एचएल वाक्यविन्यास और विभिन्न प्रतिमान "अलग-अलग सोचने" में मदद करते हैं, और किसी समस्या की धारणा को बदलते हैं (और इसलिए समाधान ढूंढने के तरीके को बदलें)। वे उपकरण हैं और उनके बिना आप एक ही उच्च तक नहीं पहुंच सकते हैं। आप यह नहीं सोच सकते कि कैथेड्रल बनाने के लिए यह जानना पर्याप्त है कि ईंटों पर ईंटों को कैसे रखा जाए और उसी उपकरण का उपयोग करें जिसका उपयोग आपने अपने 1 मीटर लंबा पहला ईंट-हाउस बनाने के लिए किया था। अगर आप फिर से टाइप करना शुरू करेंगे, तो आप पाएंगे जल्द ही आप उन उपकरणों को फिर से बना रहे/लिख रहे हैं जो आपके पास पहले से थे ... लेकिन एक बार ऐसा करने के बाद, आप पुष्टि कर रहे हैं कि आपको उन्हें आगे बढ़ने की आवश्यकता है। साइकिल – ShinTakezou

+0

@ShinTakezou मुझे विश्वास है कि आप और मैं हिंसक समझौते में हैं। मेरा मतलब यह नहीं था कि सीधे सी में ओओ कोड लिखना एक उचित समाधान था। हार्ड लाइन लेने और इसे प्रदर्शित करने के लिए – bbum

संबंधित मुद्दे

 संबंधित मुद्दे