ওওপি ভাষার সাথে পক্ষপাতিত্বের পরে সি প্রোগ্রামার হিসাবে কীভাবে ভাববেন? [বন্ধ]


38

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

একটি প্রোগ্রামিং সমস্যা সমাধান করার সময়, আমি প্রথমে এমন একটি জিনিসটির কল্পনা করা যা সমস্যার সমাধান করবে। নন-ওওপি ইম্পিটেটিভ প্রোগ্রামিং প্যারাডিজম ব্যবহার করার সময় আমি কী পদক্ষেপগুলির সাথে এটি প্রতিস্থাপন করব?


15
আমি এখনও এমন একটি ভাষা খুঁজে পাই যা আমার চিন্তাভাবনার সাথে ঘনিষ্ঠভাবে মেলে, তাই আমি যে ভাষা ব্যবহার করছি তার জন্য আমার চিন্তাভাবনাগুলি "সংকলন" করতে হবে have একটি ধারণা যেটি আমি কার্যকর পেয়েছি তা হ'ল "কোড ইউনিট" এর, এটি কোনও লেবেল, সাব্রোটিন, ফাংশন, অবজেক্ট, মডিউল বা ফ্রেমওয়ার্ক: সেগুলির প্রত্যেককেই আবশ্যক করে একটি ভাল-সংজ্ঞায়িত ইন্টারফেসটি প্রকাশ করা উচিত। আপনি যদি টপ-ডাউন অবজেক্ট-লেভেল অ্যাপ্রোচ ব্যবহার করেন তবে সিতে আপনি সমস্যার সমাধান করে এমন ফাংশনগুলির একটি সেট আঁকতে শুরু করতে পারেন যা সমস্যার সমাধান হয়েছে। প্রায়শই, সুনির্দিষ্টভাবে তৈরি সিআইপিগুলি ওওপির মতো দেখায় তবে qux = foo.bar(baz)হয়ে যায় qux = Foo_bar(foo, baz)
আমন

আমন প্রতিধ্বনি করতে , নিম্নলিখিতগুলিতে ফোকাস করুন: গ্রাফের মতো ডেটা স্ট্রাকচার, পয়েন্টার, অ্যালগরিদম, কোডের কার্য সম্পাদন (নিয়ন্ত্রণ প্রবাহ), ফাংশন পয়েন্টার।
rwong

1
লিবিটিফ (গিথুবের উত্স কোড) কীভাবে বৃহত সি প্রোগ্রামগুলি সংগঠিত করতে পারে তার একটি উদাহরণ।
rwong

1
একজন সি # প্রোগ্রামার হিসাবে আমি প্রতিনিধিদের মিস করি (এক বাউন্ড প্যারামিটারযুক্ত ফাংশন পয়েন্টার) আমি অবজেক্টগুলি মিস করব না তার চেয়ে অনেক বেশি।
কোডসইনচওস

আমি ব্যক্তিগতভাবে প্র-প্রসেসরের উল্লেখযোগ্য ব্যতিক্রম ব্যতীত বেশিরভাগ সি-কে সহজ এবং সোজাসাপ্টা পেয়েছি। যদি আমাকে সিটি পুনরায় শিখতে হয়, তবে এটি এমন একটি অঞ্চল যা আমি আমার প্রচেষ্টায় মনোনিবেশ করতাম।
বিজিকলপ

উত্তর:


53
  • এসি প্রোগ্রাম হ'ল ফাংশনগুলির সংকলন।
  • একটি ফাংশন বিবৃতি সংগ্রহ।
  • আপনি একটি সঙ্গে ডেটা encapsulate করতে পারেন struct

এটাই.

আপনি কিভাবে একটি ক্লাস লিখতেন? আপনি একটি সি সি ফাইল কীভাবে লিখেন তা বেশ সুন্দর। মঞ্জুর, আপনি পদ্ধতি পলিমারফিজম এবং উত্তরাধিকারের মতো জিনিসগুলি পান না, তবে যে কোনও উপায়ে বিভিন্ন ফাংশনের নাম এবং সংমিশ্রণযুক্ত ব্যক্তিদের অনুকরণ করতে পারেন ।

পথ প্রশস্ত করার জন্য, ফাংশনাল প্রোগ্রামিং অধ্যয়ন করুন আপনি ক্লাস ছাড়াই যা করতে পারেন তা সত্যিই বেশ আশ্চর্যজনক এবং কিছু জিনিস ক্লাসের ওভারহেড ছাড়া আসলে আরও ভাল কাজ করে।

এএনএসআই-তে আরও পড়ার
অবজেক্ট-ওরিয়েন্টেশন সি


9
আপনিও যে কোনো typedefযে structকরুন এবং কিছু বর্গ মত । এবং typedef-ed প্রকারগুলি অন্যগুলিতে অন্তর্ভুক্ত করা যায় structযা সেগুলি নিজেরাই typedefবীড হতে পারে । আপনি সি এর সাথে যা পান না তা হ'ল অপারেটর ওভারলোডিং এবং ক্লাসের অতিমাত্রায় সহজ উত্তরাধিকার এবং এর মধ্যে থাকা সদস্যদের যেগুলি আপনি সি ++ এ পাবেন। এবং আপনি সি ++ এর সাথে প্রচুর অদ্ভুত এবং অপ্রাকৃত সিনট্যাক্স পান না। আমি ওওপি-র ধারণাটি সত্যিই পছন্দ করি তবে আমি মনে করি সি ++ ওওপির একটি কুৎসিত উপলব্ধি। আমি C- এর মতো কারণ এটি হয় ভাষা যে শ্রেষ্ঠ ফাংশন ছেড়ে দেওয়া হয় থেকে একটি ছোট ভাষা ও আউট সিনট্যাক্স পাতার।
রবার্ট ব্রিস্টো-জনসন

22
যার প্রথম ভাষা সি / ছিল এমন কেউ হিসাবে, আমি এটি বলার উদ্যোগ নিয়েছিলাম । a lot of things actually work better without the overhead of classes
হানিফমুবারক

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

সুরের: a lot of things actually work better with addition of class-based OOP। উত্স: টাইপস্ক্রিপ্ট, ডার্ট, কফিস্ক্রিপ্ট এবং অন্যান্য সমস্ত উপায়ে শিল্প একটি কার্যকরী / প্রোটোটাইপ ওওপি ভাষা থেকে দূরে সরে যাওয়ার চেষ্টা করছে।
ডেন

প্রসারণ করতে, ওওপি দিয়ে প্রচুর পরিমাণে বিকাশ করা হয়েছে : সমস্ত কিছু। মানুষ বস্তুগুলির বিবেচনায় স্বাভাবিকভাবেই চিন্তা করে এবং প্রোগ্রামগুলি অন্য মানুষের পড়তে ও বুঝতে পারে বলে লেখা হয়।
ডেন

18

পড়ুন SICP এবং শিখতে স্কিম, এবং ব্যবহারিক ধারণা বিমূর্ত ধরনের তথ্য । তারপরে সি-তে কোডিং করা সহজ (যেহেতু এসআইসিপি, কিছুটা সি, এবং পিএইচপি, রুবি ইত্যাদি দিয়ে ... আপনার চিন্তাভাবনা যথেষ্ট প্রশস্ত হবে এবং আপনি বুঝতে পারবেন যে অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং এ সেরা স্টাইল নাও হতে পারে would সমস্ত ক্ষেত্রে, তবে শুধুমাত্র কিছু ধরণের প্রোগ্রামের জন্য)। সি ডায়নামিক মেমরি বরাদ্দ সম্পর্কে সতর্কতা অবলম্বন করুন , এটি সম্ভবত সবচেয়ে কঠিন অংশ। C99 বা C11 প্রোগ্রামিং ভাষা মান এবং তার সি মান গ্রন্থাগার আসলে বেশ দরিদ্র (এটা বিভিন্ন TCP বা ডিরেক্টরি সম্পর্কে জানে না!), এবং আপনি প্রায়ই কিছু বহিরাগত লাইব্রেরি প্রয়োজন হবে বা ইন্টারফেসগুলি (যেমনPOSIX , libcurl HTTP- র ক্লায়েন্ট লাইব্রেরির জন্য, libonion HTTP সার্ভার লাইব্রেরির জন্য, GMPlib bignums জন্য, মত কিছু গ্রন্থাগার libunistring , ইত্যাদি হল UTF-8-এর জন্য ...)।

আপনার "অবজেক্টস" প্রায়শই কিছু কিছু সম্পর্কিত- structসেগুলিতে থাকে এবং আপনি তাদের উপর ক্রিয়াকলাপগুলির সেটকে সংজ্ঞায়িত করেন। সংক্ষিপ্ত বা খুব সাধারণ ফাংশনগুলির জন্য, কোনও শিরোনাম ফাইলের structমতো static inline- কোথাও-ডি- foo.hতে থাকার মতো প্রাসঙ্গিক হিসাবে সেগুলি সংজ্ঞায়িত করার বিষয়টি বিবেচনা করুন #include

লক্ষ্য করুন যে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং কেবলমাত্র প্রোগ্রামিং প্যারাডাইম নয় । কিছু অনুষ্ঠান, অন্যান্য পারাদিগ্ম্স উপযুক্ত (হয় কার্যকরী প্রোগ্রামিং a la Ocaml বা Haskell, বা এমনকি স্কিম বা Commmon পাতার মর্মর, যুক্তি প্রোগ্রামিং a la Prolog, ইত্যাদি ইত্যাদি ... পড়ুন এছাড়াও J.Pitrat এর ব্লগ ঘোষণামূলক কৃত্রিম বুদ্ধিমত্তা সম্পর্কে)। স্কটের বই: প্রোগ্রামিং ল্যাঙ্গুয়েজ প্র্যাকটিমেটিক্স দেখুন

আসলে, সি বা ওক্যামেলের একটি প্রোগ্রামার সাধারণত কোনও অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং স্টাইলে কোড করতে চায় না। নিজেকে কার্যকর করার জন্য বস্তুর কথা ভাবতে বাধ্য করার কোনও কারণ নেই।

আপনি তাদের এবং কিছুতে ব্যবহৃত structক্রিয়াকলাপগুলি সংজ্ঞায়িত করবেন (প্রায়শই পয়েন্টার মাধ্যমে)। আপনার কিছু ট্যাগ ইউনিয়ন (প্রায়শই structএকটি ট্যাগ সদস্য সহ একটি, প্রায়শই কিছু কিছু enum, এবং কিছু unionভিতরে থাকা) প্রয়োজন হতে পারে এবং আপনার -s এর কিছু শেষে আপনার নমনীয় অ্যারে সদস্য পেতে দরকারী হতে পারে struct

কিছু বিদ্যমান সোর্স কোড ভিতরে দেখ মুক্ত সফটওয়্যার মধ্যে সি (দেখুন GitHub & SourceForge কিছু খুঁজে)। সম্ভবত, একটি লিনাক্স ডিস্ট্রিবিউশন ইনস্টল করা এবং ব্যবহার করা কার্যকর হবে: এটি প্রায় বিনামূল্যে সফটওয়্যার দ্বারা তৈরি করা হয়, এতে দুর্দান্ত ফ্রি সফটওয়্যার সি সংকলক ( জিসিসি , কলং / এলএলভিএম ) এবং বিকাশ সরঞ্জাম রয়েছে। আপনি যদি লিনাক্সের জন্য বিকাশ করতে চান তবে আরও উন্নত লিনাক্স প্রোগ্রামিং দেখুন ।

ভুলবেন না সমস্ত সাবধানবাণী এবং ডিবাগ তথ্য, যেমন সঙ্গে কম্পাইল করার gcc -Wall -Wextra -g-notably উন্নয়ন ও ডিবাগ phases- সময় এবং কিছু টুলস যেমন ব্যবহার শিখতে Valgrind খোঁজা মেমরি তথ্য ফাঁসের , gdbডিবাগার, ইত্যাদি যত্ন নিন বুঝতে ভাল কি হয় অনির্দিষ্ট আচরণ এবং দৃ strongly়ভাবে এড়াতে (মনে রাখবেন যে কোনও প্রোগ্রামের কিছু ইউবি থাকতে পারে এবং কখনও কখনও "কাজ" বলে মনে হয়)।

যখন আপনার সত্যিকার অর্থে অবজেক্ট ওরিয়েন্টেড কনস্ট্রাক্টসের প্রয়োজন হয় (বিশেষভাবে উত্তরাধিকারে ) আপনি সম্পর্কিত কাঠামো এবং ফাংশনগুলিতে পয়েন্টার ব্যবহার করতে পারেন। আপনার নিজস্ব vtable যন্ত্রপাতি থাকতে পারে , প্রতিটি "অবজেক্ট" একটি structফাংশন পয়েন্টার ধারণকারী একটি পয়েন্টার দিয়ে শুরু করতে হবে । আপনি পয়েন্টার টাইপটিকে অন্য পয়েন্টার টাইপের কাস্ট করার দক্ষতার সুযোগ নেন (এবং আপনি যে উত্তরাধিকার অনুকরণ করতে struct super_stশুরু করেন তেমন একই ফিল্ড struct sub_stটাইপযুক্ত একটি থেকে আপনি কাস্ট করতে পারেন )। লক্ষ্য করুন যে সি যথেষ্ট পরিশীলিত অবজেক্ট সিস্টেমগুলি প্রয়োগ করতে যথেষ্ট - বিশেষত কিছু কনভেনশন অনুসরণ করে - যেমন GObject (জিটিকে / জিনোম থেকে) প্রদর্শিত হয়েছে।

আপনি সত্যি সত্যি প্রয়োজন যখন বন্ধ , আপনি করব প্রায়ই তাদের অনুকরণ callbacks সঙ্গে কনভেনশন করে একটি কলব্যাক ব্যবহার প্রতি ফাংশন উভয় একটি ফাংশন পয়েন্টার এবং কিছু ক্লায়েন্ট তথ্য পাস করা হয়েছে (ফাংশন পয়েন্টার যখন এটি যে কল খায়)। আপনি (নিজস্বভাবে) নিজের ক্লোজার-এর মতো struct(কিছু ফাংশন পয়েন্টার এবং বদ্ধ মানগুলি সহ) থাকতেও পারেন ।

যেহেতু সি একটি খুব নিম্ন স্তরের ভাষা, তাই আপনার নিজস্ব কনভেনশনগুলি (অন্যান্য সি প্রোগ্রামের অনুশীলন দ্বারা অনুপ্রাণিত), বিশেষত মেমরি পরিচালনার বিষয়ে এবং সম্ভবত কিছু নামকরণের সম্মেলনগুলি সংজ্ঞায়িত এবং ডকুমেন্ট করা গুরুত্বপূর্ণনির্দেশ সেট আর্কিটেকচার সম্পর্কে কিছু ধারণা থাকা দরকারী । ভুলে যাবেন না যে কোনও সি সংকলক আপনার কোডে প্রচুর পরিমাণে অপ্টিমাইজেশন করতে পারে (যদি আপনি এটি জিজ্ঞাসা করেন), তাই হাতে হাতে মাইক্রো-অপ্টিমাইজেশান করার বিষয়ে খুব বেশি চিন্তা করবেন না, এটি আপনার সংকলকটিতে ছেড়ে দিন ( gcc -Wall -O2প্রকাশিত অনুকূলিত সংকলনের জন্য) সফটওয়্যার). যদি আপনি বেঞ্চমার্কিং এবং কাঁচা পারফরম্যান্সের বিষয়ে চিন্তা করেন তবে আপনার অপ্টিমাইজেশন সক্ষম করা উচিত (একবার আপনার প্রোগ্রামটি ডিবাগ হয়ে গেলে)।

কখনও কখনও metaprogramming দরকারী যে ভুলবেন না । বেশিরভাগ ক্ষেত্রে সি তে লিখিত বড় সফটওয়্যারগুলিতে অন্য কোথাও ব্যবহৃত কিছু সি কোড উত্পন্ন করার জন্য কিছু স্ক্রিপ্ট বা অ্যাডহক প্রোগ্রাম থাকে (এবং আপনি কিছু নোংরা সি প্রিপ্রোসেসর কৌশলগুলিও খেলতে পারেন, যেমন এক্স-ম্যাক্রোস )। এখানে কিছু কার্যকর সি প্রোগ্রামার জেনারেটর রয়েছে (যেমন পার্সার উত্পন্ন করার জন্য ইয়্যাক বা জিনু বাইসন , নিখুঁত হ্যাশ ফাংশন উত্পন্ন করার জন্য জিপারফ ইত্যাদি)) কিছু সিস্টেমে (উল্লেখযোগ্যভাবে লিনাক্স এবং পসিক্স) আপনি generated-001.cফাইলটিতে রানটাইমের সময় কিছু সি কোড তৈরি করতে পারতেন, রানটাইমের সময় কিছু কমান্ড (যেমন gcc -O -Wall -shared -fPIC generated-001.c -o generated-001.so) চালিয়ে একটি ভাগ করা বস্তুর সাথে সংকলন করতে পারতেন, ডায়োপেন ব্যবহার করে ভাগ করে নেওয়া বস্তুটি গতিশীলভাবে লোড করুন load& dlsym ব্যবহার করে একটি নাম থেকে একটি ফাংশন পয়েন্টার পান । আমি মেল্টে এই জাতীয় কৌশলগুলি করছি (একটি লিস্প-জাতীয় ডোমেন নির্দিষ্ট ভাষা যা আপনার পক্ষে কার্যকর হতে পারে, যেহেতু এটি জিসিসি সংকলকটির অনুকূলিতকরণ সক্ষম করে )।

আবর্জনা সংগ্রহের ধারণাগুলি এবং কৌশলগুলি সম্পর্কে সচেতন হন ( রেফারেন্স গণনা প্রায়শই সি তে মেমরি পরিচালনা করার কৌশল, এবং এটি আইএমএইচও হ'ল আবর্জনা সংগ্রহের একটি দুর্বল রূপ যা বিজ্ঞপ্তি রেফারেন্সগুলির সাথে ভাল আচরণ করে না ; এটি সম্পর্কে সহায়তার জন্য আপনার দুর্বল পয়েন্টার থাকতে পারে, তবে এটি মুশকিল হতে পারে)। কিছু উপলক্ষে আপনি বোহমের রক্ষণশীল আবর্জনা সংগ্রহকারী ব্যবহারের কথা বিবেচনা করতে পারেন ।


7
সত্যই, এই প্রশ্ন থেকে উদাসীনভাবে, এস আই সি পি পড়া নিঃসন্দেহে একটি ভাল পরামর্শ, তবে ওপি'র পক্ষে এটি সম্ভবত পরবর্তী প্রশ্ন "এস আই সি পি-র সাথে পক্ষপাতদুষ্ট হওয়ার পরে সি প্রোগ্রামার হিসাবে কীভাবে ভাববেন" নিয়ে যায়।
ডক ব্রাউন

1
না, কারণ এসআইসিপি এবং পিএইচপি (বা রুবি বা পাইথন) এর স্কিমটি এতটাই আলাদা যে ওপি আরও অনেক বেশি বিস্তৃত চিন্তাভাবনা অর্জন করতে পারে; এবং এসআইসিপি অনুশীলনে বিমূর্ত ডেটা টাইপ কী তা বেশ ভালভাবে ব্যাখ্যা করেছে এবং বিশেষ করে সিতে কোডিংয়ের জন্য এটি বুঝতে খুব দরকারী
বাসাইল স্টারিনকিভিচ

1
এসআইসিপি একটি অদ্ভুত পরামর্শ। স্কিম সি থেকে খুব আলাদা
ব্রায়ান গর্ডন

তবে এসআইসিপি প্রচুর ভাল অভ্যাস শিখিয়েছে, এবং সি তে কোডিং দেওয়ার সময় স্কিম জানার সাহায্য করে (
ক্লোজারগুলি

5

প্রোগ্রামটি যেভাবে নির্মিত তা মূলত সমস্যাটি সমাধানের জন্য কোন ক্রিয়া (ফাংশন) সম্পাদন করতে হবে তা নির্ধারণ করা হয়েছে (এজন্য এটিকে প্রক্রিয়াজাতীয় ভাষা বলা হয়)। প্রতিটি ক্রিয়া একটি ফাংশনের সাথে সম্পর্কিত হবে। তারপরে আপনার প্রতিটি ক্রিয়াকলাপ কী ধরণের তথ্য পাবেন এবং তাদের কী তথ্য ফিরে আসতে হবে তা আপনাকে নির্ধারণ করতে হবে।

প্রোগ্রামটি সাধারণত ফাইলগুলিতে পৃথক হয় (মডিউল) প্রতিটি ফাইলের সাধারণত সম্পর্কিত থাকে এমন একটি গ্রুপের ফাংশন। প্রতিটি ফাইলের শুরুতে আপনি ঘোষনা করেন (কোনও ফাংশনের বাইরে) ভেরিয়েবল যা সেই ফাইলের সমস্ত ফাংশন দ্বারা ব্যবহৃত হবে। আপনি যদি "স্ট্যাটিক" কোয়ালিফায়ার ব্যবহার করেন তবে এই ভেরিয়েবলগুলি কেবলমাত্র সেই ফাইলের মধ্যেই দৃশ্যমান হবে (তবে অন্যান্য ফাইল থেকে নয়)। আপনি যদি ফাংশনের বাইরে সংজ্ঞায়িত ভেরিয়েবলগুলিতে "স্ট্যাটিক" যোগ্যতা ব্যবহার না করেন তবে এগুলি অন্য ফাইলগুলি থেকেও অ্যাক্সেসযোগ্য হবে এবং এই অন্যান্য ফাইলগুলি ভেরিয়েবলটিকে "বাহ্যিক" হিসাবে ঘোষণা করবে (তবে এটি সংজ্ঞায়িত করবে না) তাই সংকলক তাদের সন্ধান করবে অন্যান্য ফাইলগুলিতে।

সুতরাং সংক্ষেপে আপনি প্রথমে পদ্ধতিগুলি (ফাংশন) সম্পর্কে ভাবেন তারপরে আপনি নিশ্চিত হন যে সমস্ত ফাংশনটির প্রয়োজনীয় তথ্যে অ্যাক্সেস রয়েছে।


3

সি এপিআইগুলি প্রায়শই - সম্ভবত এমনকি - সাধারণত - যদি আপনি তাদের সঠিকভাবে দেখেন তবে একটি অবজেক্ট ওরিয়েন্টেড ইন্টারফেস থাকে।

সি ++ এ:

class foo {
    public:
        foo (int x);
        void bar (int param);
    private:
        int x;
};

// Example use:
foo f(42);
f.bar(23);

সি তে:

typedef struct {
    int x;
} foo;

void bar (foo*, int param);

// Example use:
foo f = { .x = 42 };
bar(&f, 23);

আপনি যেমন সচেতন থাকতে পারেন, সি ++ এবং অন্যান্য অন্যান্য আনুষ্ঠানিক ওও ভাষায়, হুডের অধীনে একটি অবজেক্ট পদ্ধতি প্রথম আর্গুমেন্ট গ্রহণ করে যা বস্তুর প্রতি পয়েন্টার হয়, অনেকটা bar()উপরের সি সংস্করণের মতো । এটি সি ++ পৃষ্ঠায় কোথায় আসে তার উদাহরণের জন্য, std::bindস্বাক্ষরগুলি কার্য করতে কীভাবে অবজেক্ট পদ্ধতিতে ফিট করা যায় তা বিবেচনা করুন :

new function<void(int)> (
    bind(&foo::bar, this, placeholders::_1)
//                  ^^^^ object pointer as first arg
);

অন্যরা যেমন উল্লেখ করেছে, আসল পার্থক্য হ'ল আনুষ্ঠানিক ওও ভাষাগুলি পলিমারফিজম, অ্যাক্সেস নিয়ন্ত্রণ এবং অন্যান্য বিভিন্ন নিফটি বৈশিষ্ট্য প্রয়োগ করতে পারে। তবে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের সারমর্ম, পৃথক, জটিল ডেটা স্ট্রাকচারের সৃষ্টি এবং হেরফের, ইতিমধ্যে সি তে একটি মৌলিক অনুশীলন is


2

লোকেরা সি শিখতে উত্সাহিত করার অন্যতম বড় কারণ হ'ল এটি উচ্চ-স্তরের প্রোগ্রামিং ভাষার অন্যতম নিম্নতম। ওওপি ভাষাগুলি ডেটা মডেলগুলি এবং টেম্প্লেটিং কোড এবং বার্তাটি পাস করার বিষয়ে চিন্তা করা সহজ করে তোলে তবে দিনের শেষে, একটি মাইক্রোপ্রসেসর কোড ধাপে ধাপে কোড চালায়, কোডের ব্লকের (সিতে ফাংশনগুলি) ঝাঁপিয়ে পড়ে এবং সরে যায় moving আশেপাশে ভেরিয়েবলের রেফারেন্স (সি পয়েন্টার) যাতে কোনও প্রোগ্রামের বিভিন্ন অংশ ডেটা ভাগ করতে পারে। ইংরেজিতে সি ভাষা সংসদীয় ভাষা হিসাবে ভাবেন - আপনার কম্পিউটারের মাইক্রোপ্রসেসরকে ধাপে ধাপে নির্দেশাবলী সরবরাহ করুন - এবং আপনি কোনও ভুল হতে পারবেন না। বোনাস হিসাবে, বেশিরভাগ অপারেটিং সিস্টেমের ইন্টারফেসগুলি ওওপি দৃষ্টান্তগুলির চেয়ে সি ফাংশন কলগুলির মতো কাজ করে,


2
আইএমএইচও সি একটি নিম্ন স্তরের ভাষা, তবে এসেম্বলার বা মেশিন কোডের চেয়ে অনেক বেশি, যেহেতু সি সংকলক অনেকগুলি নিম্ন-স্তরের অপ্টিমাইজেশন করতে পারে।
বেসাইল স্টারিনকিভিচ

সি সংকলকগুলি "অপ্টিমাইজেশন" নামে একটি বিমূর্ত মেশিনের মডেলটির দিকে এগিয়ে চলেছে যা সময় এবং কার্যকারণের আইনগুলিকে উপেক্ষা করতে পারে যখন ইনপুট দেওয়া হয় যা অনির্ধারিত আচরণের কারণ হতে পারে, এমনকি মেশিনে কোডটির প্রাকৃতিক আচরণ যেখানে এটি রয়েছে রান হয় অন্যথায় প্রয়োজনীয়তা পূরণ করবে। উদাহরণস্বরূপ, ফাংশনটি 16 বিট, বা যেখানে 33 বিট বা তার চেয়ে বড় তার uint16_t blah(uint16_t x) {return x*x;}মেশিনে অভিন্নভাবে কাজ করবে unsigned int। মেশিনগুলির জন্য কিছু সংকলক যেখানে unsigned int17 থেকে 32 বিট রয়েছে তবে সেই পদ্ধতিতে কলটি বিবেচনা করতে পারে ...
সুপারক্যাট

... সংকলককে অনুমান করার অনুমতি দেওয়ার জন্য যে ইভেন্টগুলির কোনও চেইন যার ফলে পদ্ধতিটিকে 46340 এর বেশি মূল্য দেওয়া হয় তা সম্ভবত ঘটতে পারে না। যদিও যে কোনও প্ল্যাটফর্মে 65533u * 65533u এর গুণন করলে এমন একটি মান পাওয়া যায় যা, যখন uint16_t9 টি দেওয়া হয়, স্ট্যান্ডার্ড uint16_t17- থেকে 32-বিট প্ল্যাটফর্মে টাইপের মানগুলি বর্ধন করার সময় এই জাতীয় আচরণগুলি আদেশ করে না ।
সুপারক্যাট

-1

আমিও ওও নেটিভ (সি ++ সাধারণত) যিনি মাঝে মাঝে সি এর জগতে টিকে থাকতে হয় আমার কাছে মূলত সবচেয়ে বড় বাধাটি হ'ল ত্রুটি পরিচালনা ও সংস্থান পরিচালনার সাথে মোকাবিলা করা।

সি ++ তে আমরা ত্রুটিটি ফেলেছি যেখানে এটি শীর্ষ স্তরে ফিরে আসে যেখানে আমরা এটি মোকাবেলা করতে পারি এবং আমাদের স্মৃতি এবং অন্যান্য সংস্থানগুলি স্বয়ংক্রিয়ভাবে মুক্ত করার জন্য আমাদের কাছে ধ্বংসকারী রয়েছে।

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

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

আপনি যদি মনে করেন এটি আপনার পক্ষে অনুভূতি বোধ করে তবে বিকল্পটি হ'ল প্রতিটি ফাংশনটিতে একটি ত্রুটি কোড ফেরত পাওয়া উচিত যা আপনাকে অবশ্যই ধর্মীয়ভাবে প্রতিটি ফাংশন কলের পরে পরীক্ষা করে পরীক্ষা করা এবং কল স্ট্যাক প্রচার করতে হবে। আপনাকে অবশ্যই নিশ্চিত করতে হবে যে সমস্ত সংস্থানগুলি কেবলমাত্র প্রতিটি ফাংশনের শেষে নয়, তবে প্রতিটি রিটার্ন পয়েন্টে (যা সম্ভবত কোনও ক্রিয়াকলাপের পরে হতে পারে যা কোনও ত্রুটি ফিরে আসতে পারে যা আপনি চালিয়ে যেতে পারবেন না এমন ইঙ্গিত দেয়)। এটি খুব ক্লান্তিকর হয়ে উঠতে পারে এবং ভাবতে ভাবতে আপনার দিকে পরিচালিত করে যে সম্ভবত আমার সম্ভবত সেই সম্ভাব্য মেমরি বরাদ্দ ব্যর্থতা (বা ফাইল পড়ুন বা পোর্ট সংযোগ করুন ...) মোকাবেলা করার দরকার নেই, আমি কেবল ধরে নেব যে এটি কার্যকর হবে বা আমি ' এখনই "আকর্ষণীয়" কোডটি লিখুন এবং ফিরে আসুন এবং ত্রুটি পরিচালনার সাথে ডিল করুন - যা কখনই ঘটে না।

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