सी (सी 99 मानक) में आप क्या नहीं कर सकते हैं जिसे आप उद्देश्य-सी में कर सकते हैं? (कोड उदाहरण के साथ यदि आप कृपया)सी में आप क्या नहीं कर सकते हैं जिसे आप उद्देश्य-सी में कर सकते हैं?
उत्तर
मैं थोड़ा और अजीब होने वाला हूं और हर किसी के साथ असहमत हूं। हालांकि यह तकनीकी रूप से सच है कि एक भाषा में किसी भी चीज में संभव कुछ भी संभव है (जहां "संभव" का अर्थ "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। अच्छा उत्तर। – bbum
वस्तुतः +2, क्योंकि कंप्यूटर भाषाओं के आस-पास के पूरे बिंदु यह (या आसपास) है, अन्यथा हम सभी अभी भी असेंबली का उपयोग करेंगे, क्योंकि उच्च "भाषाई संरचनाओं" की आवश्यकता नहीं होगी। – ShinTakezou
ऐसी कोई बात नहीं है। आम तौर पर, आप किसी प्रोग्रामिंग भाषा में कुछ भी प्रोग्राम कर सकते हैं।
बिलकुल कुछ भी नहीं। ऑब्जेक्टिव-सी के OO सुविधाओं सी
में लिखा एक छोटी सी क्रम पुस्तकालय के रूप में लागू किया जाता है कुछ टिप्पणीकर्ताओं का कहना सकता है कि ऑब्जेक्टिव-सी ब्लॉक हैं और सी नहीं, कि वास्तव में एक जीसीसी/LLVM को विस्तार सी है है कि उद्देश्य-सी का उपयोग करता है, यह ओबीजेसी सुविधा नहीं है।
एक सुविधा जो अक्सर उपयोग से परहेज करती है, क्योंकि इसे कभी-कभी निष्पादन योग्य ढेर की आवश्यकता होती है (जीसीसी एक ट्रैम्पोलिन उत्पन्न करता है ढेर फ्रेम को बहाल करने के लिए ढेर पर, ताकि घोंसला घोंसला काम करता है, एक ट्रैम्पोलिन एक छोटा सा कार्य होता है जो कुछ जादू करता है: पी) एक निष्पादन योग्य ढेर उपलब्ध नहीं हो सकता है ... उदाहरण के लिए एनएक्स चालू है (जीसीसी शायद पागलपन का उपयोग करता है या कुछ ऐसा है जो अभी भी काम करेगा ... शायद) – Spudd86
ग्राहम के अच्छी तरह से बनाए गए बिंदुओं को जोड़ने के लिए, छोटी रनटाइम लाइब्रेरी को उन सी कार्यों के सेट के रूप में भी उजागर किया जाता है जिन्हें आप उपयोग करने की अनुमति देते हैं। दूसरे शब्दों में, आप उद्देश्य-सी का उपयोग किये बिना उद्देश्य-सी पुस्तकालयों का भी उपयोग कर सकते हैं। यहां देखें: http://developer.apple.com/mac/library/documentation/cocoa/reference/objcruntimeref/Reference/reference.html – harms
ब्लॉक - जैसा कि मैक ओएस एक्स में कार्यान्वित किया गया है - बिल्कुल * नहीं * निष्पादन योग्य की आवश्यकता है ढेर। यह उनके डिजाइन में एक आवश्यकता थी। – bbum
जैसा कि ग्राहम ने कहा - उद्देश्य-सी में ऐसा कुछ भी नहीं किया जा सकता है जो सी में नहीं किया जा सकता है। बेशक, सी में आप कुछ भी नहीं कर सकते हैं, या तो, असेंबली में किया जाना चाहिए। यह सिर्फ टाइपिंग का मामला है।
(मुझे उम्मीद थी कि विधानसभा उल्लेख नहीं है कि इंगित करने के लिए पर्याप्त होगा, नहीं, मैं दूर नहीं सुझाव दे रहा हूँ शुद्ध सी में है कि लेखन OO पैटर्न दूर करने के लिए एक उत्पादक बात ... है) वहाँ हित के लिए कुछ अतिरिक्त अंक दिए गए हैं:
ऑब्जेक्टिव-सी एक पूर्वप्रक्रमक कि सी कोड है कि एक मानक सी संकलक द्वारा संकलित किया जा सकता है में ऑब्जेक्टिव-सी कोड बदल गया के रूप में बाहर शुरू कर दिया। यही है, उद्देश्य-सी मूल रूप से सीधे संकलित नहीं किया गया था, लेकिन सीधे सी में अनुवाद किया गया, फिर संकलित।
ऑब्जेक्टिव-सी वस्तुओं सी संरचनाओं के रूप में के बारे में सोचा जा सकता है जहां संरचना में पहली प्रविष्टि -
isa
-Class
- - कि संरचना/उदाहरण का वर्णन करता है हमेशा मेटाडाटा के लिए सूचक है।ब्लॉक सी के लिए एक विस्तार है, जिसे अब डब्ल्यूजी -14 (सी मानकों समिति) में सी भाषा के अतिरिक्त के रूप में प्रस्तावित किया गया है। ऐप्पल द्वारा कार्यान्वित किए गए ब्लॉक, बिल्कुल को एक्जिक्यूटेबल स्टैक की आवश्यकता होती है। यह उनके डिजाइन में एक कठिन आवश्यकता थी।
एलएलवीएम में एक पुनरावर्तक है जो वास्तव में उद्देश्य-सी से सी को फिर से लिख सकता है और स्पष्ट रूप से इसका उपयोग Xbox 360 गेम में उद्देश्य-सी कोडिंग को सक्षम करने के लिए किया गया है (http://permalink.gmane.org/gmane.comp.compilers.llvm.devel/31996 देखें)।
केवल टाइपिंग की बात नहीं है। एचएल वाक्यविन्यास और विभिन्न प्रतिमान "अलग-अलग सोचने" में मदद करते हैं, और किसी समस्या की धारणा को बदलते हैं (और इसलिए समाधान ढूंढने के तरीके को बदलें)। वे उपकरण हैं और उनके बिना आप एक ही उच्च तक नहीं पहुंच सकते हैं। आप यह नहीं सोच सकते कि कैथेड्रल बनाने के लिए यह जानना पर्याप्त है कि ईंटों पर ईंटों को कैसे रखा जाए और उसी उपकरण का उपयोग करें जिसका उपयोग आपने अपने 1 मीटर लंबा पहला ईंट-हाउस बनाने के लिए किया था। अगर आप फिर से टाइप करना शुरू करेंगे, तो आप पाएंगे जल्द ही आप उन उपकरणों को फिर से बना रहे/लिख रहे हैं जो आपके पास पहले से थे ... लेकिन एक बार ऐसा करने के बाद, आप पुष्टि कर रहे हैं कि आपको उन्हें आगे बढ़ने की आवश्यकता है। साइकिल – ShinTakezou
@ShinTakezou मुझे विश्वास है कि आप और मैं हिंसक समझौते में हैं। मेरा मतलब यह नहीं था कि सीधे सी में ओओ कोड लिखना एक उचित समाधान था। हार्ड लाइन लेने और इसे प्रदर्शित करने के लिए – bbum
- 1. क्या आप वीबीस्क्रिप्ट में निरंतर सरणी घोषित कर सकते हैं?
- 2. क्या आप IronPython में .NET ऑब्जेक्ट टाइप कर सकते हैं?
- 3. क्या आप एफ # में एक ऑपरेटर (***) परिभाषित कर सकते हैं?
- 4. सी # में आप कैसे नींबू (nybble) बाइट्स कर सकते हैं?
- 5. सी # में आप कितने वर्ग प्राप्त कर सकते हैं?
- 6. प्रोटोटाइप विरासत के साथ आप किस पैटर्न का उपयोग कर सकते हैं जिसे आप कक्षा के साथ नहीं कर सकते?
- 7. क्या आप # परिभाषित स्ट्रिंग अक्षर में परिभाषित कर सकते हैं?
- 8. क्या आप Silverlight में HtmlDecode और HtmlEncode कर सकते हैं?
- 9. आप डॉल्विक वीएम (एंड्रॉइड के वीएम) पर क्या कर सकते हैं जो आप सन वीएम में कर सकते हैं?
- 10. क्या आप रूबी में अर्धविराम का उपयोग कर सकते हैं?
- 11. क्या आप एसक्यूएल में "शाब्दिक" टेबल परिभाषित कर सकते हैं?
- 12. जावास्क्रिप्ट में, क्या आप डोम का विस्तार कर सकते हैं?
- 13. क्या आप एपीके में संसाधन साझा कर सकते हैं?
- 14. क्या आप अंतर निर्दिष्ट कर सकते हैं ./,../,~/ ASP.NET में?
- 15. चींटी Task.init() विधि में आप क्या कर सकते हैं?
- 16. क्या आप कई टेम्पलेट्स में डेटा साझा कर सकते हैं?
- 17. क्या आप UserControl में जावास्क्रिप्ट ब्रेकपॉइंट सेट कर सकते हैं?
- 18. क्या आप जावास्क्रिप्ट से सी # फ़ंक्शन कॉल कर सकते हैं?
- 19. यदि आप संदर्भ द्वारा अपवाद पकड़ते हैं, तो क्या आप इसे संशोधित कर सकते हैं और पुनर्स्थापित कर सकते हैं?
- 20. यदि आप उस वर्ग से उत्तराधिकारी नहीं हो सकते हैं जिसे आप सजाने के लिए चाहते हैं तो आप सजावट पैटर्न को कैसे कार्यान्वित कर सकते हैं?
- 21. क्या आप web.config को संशोधित कर सकते हैं और एएसपी.NET एप्लिकेशन को पुनरारंभ नहीं कर सकते?
- 22. क्या कर सकते हैं कि sed क्या कर सकते हैं?
- 23. क्या कोई एडन है जिसे आप फ़ायरफ़ॉक्स में सीएसएस चयनकर्ताओं का परीक्षण कर सकते हैं?
- 24. आप विम में पायथन का उपयोग कैसे कर सकते हैं?
- 25. क्या आप एक साथ डीएलएस बंडल कर सकते हैं?
- 26. आप एंड्रॉइड में लोडिंग स्क्रीन कैसे उत्पन्न कर सकते हैं?
- 27. आप सूची नामों को संक्षिप्त कर सकते हैं? क्यूं कर?
- 28. पायथन में साइट-पैकेज क्या हैं और यदि आप रूट नहीं हैं तो आप उन्हें इंस्टॉल/उपयोग कर सकते हैं?
- 29. क्या आप एक्सटेंशन विधि स्टेटिक/साझा कर सकते हैं?
- 30. क्या आप एएसपी और एएसपी.नेट मिश्रण कर सकते हैं?
क्या आपका मतलब है "उद्देश्य-सी के लिए क्या वाक्यविन्यास अद्वितीय है"? –
वे दोनों ट्यूरिंग पूर्ण हैं ... – James
ऑब्जेक्ट उन्मुख प्रोग्रामिंग आसानी से? (सी में जबकि यह कठिन होगा ...) – ShinTakezou