"অবজেক্টিভ-সি সি ++ এর চেয়ে বেশি কঠোরভাবে সি এর সুপারটেট" বলতে কী বোঝায়?


87

আমি সেখানে যা পড়েছি তা থেকে: কেন আপেল সম্প্রদায়ের বাইরে অবজেক্টিভ-সি খুব জনপ্রিয় নয়?

অবজেক্টিভ-সি হ'ল সি'র সুপারস্টার (বাস্তবে সি ++ এর চেয়ে অনেক বেশি কঠোরভাবে) সুতরাং পশ্চাদপদ সামঞ্জস্যের বিষয়টি উত্থাপিত হয় না। সি তে আপনি যা কিছু করতে পারেন তা আপনি উদ্দেশ্য-সি-তে করতে পারেন।

সুপারসেট হওয়া গর্ভবতী হওয়ার মতো বাইনারি হয়। ওবজ-সি হ'ল সুপারস্টার, এবং সি ++ হয় না।

তারা সুপারশেট বলতে কী বোঝায়? কোন উপায়ে উদ্দেশ্য-সি আরও ঘনিষ্ঠ হবে // সি এর সাথে পিছনে সামঞ্জস্যপূর্ণ? উদ্দেশ্য-সি কোন উপায়ে সি দর্শনের আরও বেশি ঘনিষ্ঠভাবে অনুসরণ করে?

কোনও সি প্রোগ্রাম কোনও উদ্দেশ্য-সি সংকলক (100% সামঞ্জস্য) দ্বারা সংশোধন ছাড়াই সংকলন করা যায়?

কোনটি আরও ভাল তার যুদ্ধের চেয়ে প্রোগ্রামিং ভাষার নকশা এবং সামঞ্জস্যতা সম্পর্কে এটি আরও প্রশ্ন।

উত্তর:


134

আমি একটি সাধারণ চিত্রটি প্রস্তুত করেছি; এটি খুব সুন্দর নয়, তবে আশা করা যায় যে বিষয়টি পয়েন্টটি পেয়েছে:

  • লাল: সি, সি ++, এবং উদ্দেশ্য-সিতে বৈধ সমস্ত প্রোগ্রামের সেট (অপেক্ষাকৃত ছোট)
  • সবুজ: সি এবং অবজেক্টিভ-সিতে বৈধ সমস্ত প্রোগ্রামের সেট, তবে সি ++ (এমনকি আরও ছোট) অবৈধ
  • ধূসর: অবজেক্টিভ সি এবং সি ++ তে বৈধ সমস্ত প্রোগ্রামের সেট, তবে সিটিতে অবৈধ (খালি, যতদূর আমি জানি)
  • নীল: কেবলমাত্র উদ্দেশ্য সি তে বৈধ সমস্ত প্রোগ্রামের সেট (তুলনামূলকভাবে বড়)
  • হলুদ: সমস্ত প্রোগ্রামের সেটটি কেবল সি ++ (বৃহত্তম)

বৈধ সি প্রোগ্রামগুলির সেট (লাল এবং সবুজ বর্ণের) বৈধ অবজেক্টিভ সি প্রোগ্রামগুলির সেটগুলির একটি কঠোর উপসেট (নীল)

এখানে চিত্র বর্ণনা লিখুন


14
উদ্দেশ্য সি ++ সম্পর্কে কী?
ব্যবহারকারী 1115057


19
আপনি কোন পরিমাপের মাধ্যমে দাবি করেন যে এখানে নীল থেকে হলুদ "বড়"? অন্তর্দৃষ্টি আমাকে বলে যে উভয় সেট অগণিত অসীম হবে।
wim

4
@ উইম: এবং উভয়ই আর ^ 2 এর অগণিত সাবসেট হিসাবে উপস্থাপিত হয়;) আপনি একই ধরণের কৌশল হিসাবে দেখবেন যেহেতু আপনি Q এর ভিতরে একই আকারের (এবং এন এর কিউর সাবসেট হচ্ছেন) থাকা সত্ত্বেও see
ম্যাকিয়েজ পাইচোটকা

4
আমি এটি সম্পর্কে আরও কিছু ভাবছিলাম, এবং বুঝতে পেরেছিলাম যে ওবিজেসি ++ সেটটি আসলে এগুলি ঘিরে থাকবে না। এটি সি ++ এর সুপারস্টেট, তবে ওবজির কঠোর সুপারসেট নয়। একই প্রোগ্রাম যা আইনী সি, তবে অবৈধ সি ++ (সবুজ অঞ্চল) অবৈধ ওবিজেসি ++।
রব নেপিয়ার

62
  1. তারা সুপারশেট বলতে কী বোঝায়?

    তারা কঠোর সুপারস্টার মানে। যে কোনও বৈধ সি প্রোগ্রাম একটি উদ্দেশ্য-সি সংকলক দিয়ে সংকলন করবে। কিছু বৈধ সি প্রোগ্রাম একটি সি ++ সংকলক দিয়ে সংকলন করবে না।

  2. কোন উপায়ে উদ্দেশ্য-সি আরও ঘনিষ্ঠ হবে // সি এর সাথে পিছনে সামঞ্জস্যপূর্ণ?

    এখানে একটি সাধারণ উদাহরণ:

    int *foo = malloc(12);
    

    সি এবং উদ্দেশ্য-সিতে সংকলন করে তবে সি ++ তে নয়। অবশ্যই অন্যান্য উদাহরণও রয়েছে।

  3. উদ্দেশ্য-সি কোন উপায়ে সি ++ এর চেয়ে আরও বেশি ঘনিষ্ঠভাবে সি দর্শন অনুসরণ করে?

    সমস্ত - অবজেক্টিভ-সি হ'ল সি এর কঠোর সুপারসেট is

  4. কোনও সি প্রোগ্রাম কোনও উদ্দেশ্য-সি সংকলক (100% সামঞ্জস্য) দ্বারা সংশোধন ছাড়াই সংকলন করা যায়?

    হ্যাঁ.


4
হ্যাঁ, ঠিক আছে। আপনি যদি নিম্ন-স্তরের রানটাইম ফাংশনগুলি ব্যবহার করতে ইচ্ছুক হন তবে অবশ্যই জিইউআইয়ের জন্য আপনাকে উদ্দেশ্যমূলক-সি প্রয়োজন হবে না।
কার্ল নরুম

4
মূলত দার্শনিক।
কার্ল নরুম

4
+1 দুর্দান্ত ব্যাখ্যা। আমি পরামর্শ দেব যে "সি দর্শন" এর প্রশ্নটি কিছুটা অস্পষ্ট, তবে বেশিরভাগ পর্যবেক্ষকই সম্ভবত সম্মত হবেন যে সি এর "লক্ষ্য" এবং ওবিজির "লক্ষ্য" পৃথক। সিটির অভিপ্রায়টি হার্ডওয়্যারটির খুব কাছাকাছি হওয়া, যখন কিছু কার্যকর বহনযোগ্যতা বিমূর্ততা সরবরাহ করা হয়, যখন ওবজির লক্ষ্য সি-তে একটি ছোট্ট ট্যালক পদ্ধতির উপস্থিতি, যেহেতু সাম্প্রতিক বছরগুলিতে কোকো ওবিজেসি-র সাথে অবিচ্ছেদ্য হয়ে উঠেছে, এই বিচ্যুতি আরও দৃ stronger় হয়। সি-অ্যারে এবং এনএসএর্রির "দর্শন" (ডিজাইনের পদ্ধতির) অবশ্যই খুব আলাদা।
রব নেপিয়ার

4
এটি পুরোপুরি প্রোগ্রামের উপর নির্ভর করে। সম্ভবত আপনি একটি উদ্দেশ্য-সি প্রোগ্রামে খুব বেশি সি-স্টাইলের জিনিসগুলি করবেন না। আপনি কেন তখন উদ্দেশ্য-সি ব্যবহার করবেন?
কার্ল নরুম

4
@ ব্যবহারকারী 1115057: কীভাবে বিষয়গুলি বিবেচনা করা হয় সে সম্পর্কে আপনার খুব বেশি চিন্তা করা উচিত নয়। সি ++ কোড লেখার ক্ষেত্রে দুটি সমস্যা রয়েছে যা সংকলন করে (বা কমপক্ষে দেখে মনে হচ্ছে) সি। একটি হ'ল আপনি সি ++ এর কোনও সুবিধা পাচ্ছেন না, তবে এটি আপনার কল। গুরুত্বপূর্ণটি হ'ল আপনি সি এর একটি ভাঙা উপভাষায় লিখছেন যা আসলে সি নয় You আপনার পরিবর্তে আপনার সি কোডটি একটি সি কম্পাইলারের সাথে সংকলন করা উচিত এবং এটি আপনার সি ++ কোডের বিপরীতে লিঙ্ক করা উচিত। যে আধুনিক উদ্বেগ উদ্দেশ্য সি সঙ্গে প্রযোজ্য নয়, উদ্দেশ্য সি এর উপসেট যে সি হিসাবে প্রনয়ন, যেহেতু হয় সি
স্টিভ জেসপ

31

গ্রাউন্ড আপ থেকে, সি ++ এর লেখকরা ভাষাটির মধ্য দিয়ে চলে আসার সাথে সাথে আসল এবং বোধগম্য উভয়কেই "আরও ভাল সি" হিসাবে নকশা করা হয়েছে, ফিক্সিং ডিজাইন বাদ পড়েছে। এই ডিজাইনের সিদ্ধান্তের ফলাফলটি Xহ'ল বৈধ সি প্রোগ্রাম হওয়ায় গ্যারান্টি দেয়নি যে Xসি ++ সংকলক দ্বারা প্রক্রিয়া করা হলে সংকলন করবে, একা চলুক let পরিবর্তনগুলি স্ট্রিং ল্যাটারালগুলি (তারা হয়ে ওঠে const char*), voidপয়েন্টারগুলির অ্যাসাইনমেন্ট, enumগুলি এবং ইন্টিগ্রাল টাইপের মধ্যে রূপান্তর , যৌগিক কার্যনির্বাহী অপারেটরগুলির শব্দার্থক এবং এই জাতীয় সংলাপগুলিকে স্পর্শ করে।

তদুপরি, একবার C99 বরাবর এসেছিল, এমন বৈশিষ্ট্যগুলি যেগুলি আপডেট সি স্ট্যান্ডার্ডে তৈরি করেছে তা আপডেট সি ++ স্ট্যান্ডার্ড থেকে বাদ দেওয়া হয়েছিল। আবার খুব গুরুত্বপূর্ণ ভাষার বৈশিষ্ট্যগুলি বাদ ছিল - সর্বাধিক উল্লেখযোগ্যভাবে, মনোনীত প্রারম্ভিক এবং ভেরিয়েবল-সাইজের অ্যারেগুলি।

বিপরীতে, অবজেক্টিভ সি সি এর সুপারসেট হিসাবে স্থাপন করা হয়েছে, যার জন্য সমস্ত বৈধ সি প্রোগ্রামগুলি একটি উদ্দেশ্য সি সংকলক সহ সংকলনযোগ্য হতে হবে।


4
আমি এই প্রশ্নের উত্তর দিয়েছি কারণ আমি জানি "সুপারস্টেট" কী, তবে আমি উদ্দেশ্য-সি সম্পর্কে কিছুই জানি না। আমি অন্য এসও প্রশ্নে একটি দাবী দেখেছি যে বৈধ সি কোড স্নিপেটটি int nil = 0; nil++;উদ্দেশ্য-সি হিসাবে সংকলন করে না। সেখানে সমস্যাটি কী, অবজেক্টিক-সি হ্যান্ডারগুলি উপলভ্য করে এমনটি স্পষ্ট বিষয় যা একবার অন্তর্ভুক্ত হয়ে গেলে আপনার কোডটি ঠিক সি সিলেক্ট করতে পারে? এবং তাই এই স্নিপেটের লেখক তাদের অন্তর্ভুক্ত করা উচিত নয়।
স্টিভ জেসপ

4
"নিল" আসলে একটি কীওয়ার্ডের পরিবর্তে একটি # ডেফাইন। আপনি সমস্যাগুলি দেখছেন কারণ /জেক / আপজেক্ট। অন্তর্ভুক্ত। এটি যদি আপনি ইয়েস নামে পরিচিত একটি ভেরিয়েবল বানানোর চেষ্টা করে থাকেন তবে আপনি যে সমস্যার মুখোমুখি হবেন এটি একই। (এক্সকোড এগুলিকে হাইলাইট করে যদিও এগুলি সত্যই কীওয়ার্ড ছিল কারণ এগুলি সম্পর্কে সেভাবে চিন্তা করা অনেক সহজ; তবে সেগুলি সাধারণ সি কোড হিসাবে প্রয়োগ করা হয়েছে))
রব নেপিয়ার

4
বিটিডাব্লু, আপনি ওজজিকে সি এর শীর্ষে কীভাবে জীবনধারণ করেন সে বিষয়ে আগ্রহী যদি আপনারা আগ্রহী হন তবে আপনার কীওয়ার্ড (আইডি, বিওওএল, ক্লাস, নীল ইত্যাদি) কেবল সাধারণ প্রকার, স্ট্রাক্ট , এবং সংজ্ঞা দেয়। এমনকি খাঁটি-সিতে হাতছাড়া বার্তাটি প্রয়োগ করতে পারেন। কখনই না, কখনই না। : ডি তবে আপনি পারবেন। github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
রব নেপিয়ার

4
@ ড্যানিয়েলি: রব নেপিয়ার লিঙ্কযুক্ত ফাইল সম্পর্কে মন্তব্য হিসাবে "কখনও কখনও কখনও তা করবেন না" বলেছিলেন। লিঙ্ক ফাইল না উদ্দেশ্য সি রানটাইম, এটা শুধু একটি দ্রুত হ্যাক যে দেখায় কিভাবে বার্তা কিছু সত্যিই কাজ করে।
ডায়েটারিচ এপ্পি

4
লিঙ্কযুক্ত ফাইলটি বোঝাচ্ছে না যে ওজজিসি বার্তাটি কীভাবে জটিল হয়। এটি দেখায় যে রানটাইমটি সি থেকে পাওয়া যায় এবং আপনি নীতিগতভাবে ওবিজেসি কোডকে খাঁটি সিতে রূপান্তর করতে পারেন তবে এটি আপনি এটি তৈরি করতে পারার মতো ধীর slow এটি আমার পদ্ধতিগুলির রিটার্ন টাইপ (এবং কিছু রিটার্নের ধরণের জন্য, সম্ভবত প্রসেসরের ধরণটি আমার জানা দরকার) জেনে নির্ভর করেছিল এবং আমি সাবধানতার সাথে এমন পদ্ধতিগুলি বেছে নিয়েছিলাম যা কোনও পরামিতি নেয় না take সম্পূর্ণ সমাধানটিতে অনেক সূক্ষ্ম কৌশল রয়েছে (অংশগুলি এসেম্বলারে থাকতে হবে কারণ তারা স্ট্যাক ফ্রেমের সাথে প্রতারণা করে)। আপনার এটি কখনও পুনর্নির্মাণের চেষ্টা করা উচিত নয়।
রব নেপিয়ার

12

"অবজেক্টিভ-সি হ'ল সুপারসেট" মানে প্রতিটি বৈধ সি প্রোগ্রামটি একটি বৈধ অবজেক্টিভ-সি প্রোগ্রাম (একই অর্থ সহ)।

এটি কখনও কখনও বলা হয়, যদিও এটি সি ++ বিশেষজ্ঞদের দ্বারা নয়, সি ++ সি এর সুপারস্টেট এটি সঠিক নয়, এ কারণেই আপনার উদ্ধৃতি দুটিটির সাথে তুলনা করার ক্ষেত্রে একটি বড় চুক্তি করে।


9

অবজেক্টিভ সি হ'ল সি'র পিছনে সামঞ্জস্যপূর্ণ এক্সটেনশনের একটি সেট এটি সম্ভব কারণ কারণ উদ্দেশ্য সি বৈশিষ্ট্য দুটি খুব সাধারণ উপায়ে সীমিত করা হয়েছে:

  • চরিত্রের ব্যবহার @। এই চরিত্রটি বর্তমানে সি ভাষায় ব্যবহৃত হয় না।
  • অনুরোধ পদ্ধতিগুলির জন্য একটি সাধারণ সিনট্যাকটিক এক্সটেনশন [obj method:argument],। সি তে বর্গাকার বন্ধনীগুলি অ্যারে সাবস্ক্রিপিংয়ের জন্য খুব নির্দিষ্ট উপায়ে ব্যবহার করা হয় এবং তাই এটি অবৈধ সি সিনট্যাক্স। অবৈধ সিনট্যাক্সের উপর নির্মিত এক্সটেনশানগুলি হোস্ট ভাষায় বৈধ যে কোনও কিছুর অর্থ পরিবর্তন করে না।

এটি দেখতে এত সহজ যে কোনও প্রোগ্রাম যা ওজেক্টিভ সি এক্সটেনশানগুলি ব্যবহার করে তা কঠোরভাবে মেনে চলার আইএসও সি প্রোগ্রাম হতে পারে না, যতই সহজ। তদুপরি, প্রতিটি আইএসও সি প্রোগ্রামকে সংজ্ঞা অনুসারে, একটি বৈধ অবজেক্টিভ সি প্রোগ্রাম হিসাবে ঘোষণা করা যেতে পারে। উদ্দেশ্য সি সহজে সি 99 এবং সি 11 এর মতো বিকাশগুলি অনুসরণ করতে পারে।

অন্যদিকে, সি ++ কেবল সি-তে বাড়ানো হয় না; এটি একটি আলাদা ভাষা যা সি সি ++ এবং সি এর কিছু বাক্য গঠনটির অর্থ পরিবর্তিত করে এবং তাই সময়ের সাথে তাদের সম্পর্ক পরিবর্তিত হয়। উদাহরণস্বরূপ, সি নতুন বৈশিষ্ট্যগুলি অর্জন করেছে যা সি ++ এ সম্পূর্ণ অনুপস্থিত এবং সম্ভবত C ++ এ যাবে না, যেমন C99 ভেরিয়েবল-দৈর্ঘ্যের অ্যারেগুলি। সি ++ সহজেই নতুন সি বৈশিষ্ট্যগুলি তুলতে পারে না।

আপনি যদি কোনও পোর্টেবল সি প্রোগ্রাম লেখেন তবে এটি একই সাথে একটি উদ্দেশ্য সি প্রোগ্রাম হওয়া উচিত। তবে অতিরিক্ত যত্নের প্রয়োজন হবে যাতে এটি একই অর্থ সহ সি ++ প্রোগ্রাম। (এই অনুশীলনটি শোনা যায় না, এবং এর জন্য প্রয়োজনীয় উপভাষাটি অনানুষ্ঠানিকভাবে "ক্লিন সি" নামে পরিচিত)।

সি প্রোগ্রামের একটি তুচ্ছ উদাহরণ যা সি ++ হিসাবে চিকিত্সা করার সময় ভেঙে যায় এমন কোনও সি প্রোগ্রাম যা একটি সি ++ কীওয়ার্ডকে সনাক্তকারী হিসাবে ব্যবহার করে, যেমন classবা virtual। উদ্দেশ্য সি কোনও সংরক্ষিত কীওয়ার্ড প্রবর্তন করে না। এটির মতো নতুন কীওয়ার্ড রয়েছে যা @চরিত্রের মাধ্যমে প্রবর্তিত হয় @interface

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.