পড়ুন 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 ব্যবহার করে একটি নাম থেকে একটি ফাংশন পয়েন্টার পান । আমি মেল্টে এই জাতীয় কৌশলগুলি করছি (একটি লিস্প-জাতীয় ডোমেন নির্দিষ্ট ভাষা যা আপনার পক্ষে কার্যকর হতে পারে, যেহেতু এটি জিসিসি সংকলকটির অনুকূলিতকরণ সক্ষম করে )।
আবর্জনা সংগ্রহের ধারণাগুলি এবং কৌশলগুলি সম্পর্কে সচেতন হন ( রেফারেন্স গণনা প্রায়শই সি তে মেমরি পরিচালনা করার কৌশল, এবং এটি আইএমএইচও হ'ল আবর্জনা সংগ্রহের একটি দুর্বল রূপ যা বিজ্ঞপ্তি রেফারেন্সগুলির সাথে ভাল আচরণ করে না ; এটি সম্পর্কে সহায়তার জন্য আপনার দুর্বল পয়েন্টার থাকতে পারে, তবে এটি মুশকিল হতে পারে)। কিছু উপলক্ষে আপনি বোহমের রক্ষণশীল আবর্জনা সংগ্রহকারী ব্যবহারের কথা বিবেচনা করতে পারেন ।
qux = foo.bar(baz)
হয়ে যায়qux = Foo_bar(foo, baz)
।