সি ভাষার বৈশিষ্ট্যগুলির কিছু হ্যাক হিসাবে শুরু হয়েছিল যা সবেমাত্র কাজ করার জন্য ঘটেছে।
মূলটির জন্য একাধিক স্বাক্ষর, পাশাপাশি পরিবর্তনশীল-দৈর্ঘ্যের আর্গুমেন্ট তালিকাগুলি এই বৈশিষ্ট্যগুলির মধ্যে একটি।
প্রোগ্রামাররা লক্ষ্য করেছে যে তারা কোনও ফাংশনে অতিরিক্ত তর্কগুলি পাস করতে পারে এবং তাদের প্রদত্ত সংকলকটি দিয়ে খারাপ কিছু হয় না।
কলিং কনভেনশনগুলি যদি এমন হয় তবে এটি এমন হয়:
- কলিং ফাংশনটি তর্কগুলি পরিষ্কার করে।
- বামতম আর্গুমেন্টগুলি স্ট্যাকের শীর্ষে বা স্ট্যাক ফ্রেমের গোড়ায় খুব কাছাকাছি, যাতে উত্সাহী যুক্তিগুলি ঠিকানাটি অকার্যকর করে না।
কলিং কনভেনশনগুলির একটি সেট যা এই নিয়মগুলি মান্য করে তা হ'ল স্ট্যাক-ভিত্তিক প্যারামিটারটি হয় যার মাধ্যমে কলার আর্গুমেন্টগুলি পপ করে এবং সেগুলি ডানে বামে ঠেলা যায়:
;; pseudo-assembly-language
;; main(argc, argv, envp); call
push envp ;; rightmost argument
push argv ;;
push argc ;; leftmost argument ends up on top of stack
call main
pop ;; caller cleans up
pop
pop
সংকলকগুলিতে যেখানে এই ধরণের কলিং কনভেনশন হয়, সেখানে দুই ধরণের mainবা এমনকি অতিরিক্ত ধরণের সমর্থনের জন্য বিশেষ কিছু করার দরকার নেই । mainকোনও আর্গুমেন্টের ফাংশন হতে পারে, সেক্ষেত্রে এটি স্ট্যাকের উপরে চাপানো আইটেমগুলি সম্পর্কে অবজ্ঞাত। যদি দুটি আর্গুমেন্ট একটি ফাংশন আছে, তারপর, এটা খুঁজে বের করে argcএবং argvদুই আগ স্ট্যাক আইটেম হিসাবে। যদি এটি পরিবেশের পয়েন্টার (একটি সাধারণ এক্সটেনশন) এর সাথে প্ল্যাটফর্ম-নির্দিষ্ট তিন-যুক্তির বৈকল্পিক হয় তবে এটি খুব কার্যকর হবে: এটি স্ট্যাকের শীর্ষ থেকে তৃতীয় উপাদান হিসাবে তৃতীয় যুক্তিটি খুঁজে পাবে।
এবং তাই একটি স্থির কল সমস্ত ক্ষেত্রে কাজ করে, একটি একক, ফিক্সড স্টার্ট-আপ মডিউলটিকে প্রোগ্রামের সাথে যুক্ত করতে দেয়। এই মডিউলটি সি-তে রচনা করা যেতে পারে, এটি একটি অনুরূপ ফাংশন হিসাবে:
extern int main(int argc, char **argv, char **envp);
void __start(void)
{
exit(main(argc_from_somewhere, argv_from_somewhere, envp_from_somewhere));
}
অন্য কথায়, এই শুরু মডিউলটি সর্বদা তিনটি-যুক্তির প্রধানকে কল করে। যদি প্রধান কোনও আর্গুমেন্ট না নেয়, বা কেবলমাত্র int, char **, এটি কলিং কনভেনশনগুলির কারণে, ঠিকঠাক কাজ করার পাশাপাশি ঘটে যদি এটি কোনও যুক্তি না নেয়।
আপনি যদি আপনার প্রোগ্রামে এই জাতীয় কাজটি করে থাকেন, তবে এটি আইএসও সি দ্বারা বহনযোগ্য এবং অপরিবর্তিত আচরণ হিসাবে বিবেচিত হবে: এক পদ্ধতিতে কোনও ফাংশন ঘোষণা করা এবং কল করা এবং অন্যটিতে এটি সংজ্ঞায়িত করা। তবে একটি সংকলকের সূচনা কৌশলটি পোর্টেবল হতে হবে না; এটি পোর্টেবল প্রোগ্রামগুলির নিয়ম দ্বারা পরিচালিত হয় না।
তবে ধরুন যে আহ্বানকারী সম্মেলনগুলি এমন যে এটি এইভাবে কাজ করতে পারে না। সেক্ষেত্রে সংকলকটিকে mainবিশেষভাবে চিকিত্সা করতে হবে । যখন এটি লক্ষ্য করে যে এটি mainফাংশনটি সংকলন করছে , তখন এটি কোড উত্পন্ন করতে পারে যা একটি তিনটি আর্গুমেন্ট কলের সাথে সামঞ্জস্যপূর্ণ say
বলতে গেলে, আপনি এটি লিখুন:
int main(void)
{
}
কিন্তু যখন সংকলক এটি দেখে, এটি মূলত একটি কোড ট্রান্সফর্মেশন সম্পাদন করে যাতে এটি সংকলিত ফাংশনটি আরও দেখতে এইরকম হয়:
int main(int __argc_ignore, char **__argv_ignore, char **__envp_ignore)
{
}
নামগুলি বাদে __argc_ignoreআক্ষরিক অর্থেই অস্তিত্ব নেই। এ জাতীয় কোনও নাম আপনার সুযোগে প্রবর্তিত হয়নি এবং অব্যবহৃত যুক্তি সম্পর্কে কোনও সতর্কতা থাকবে না। কোড রূপান্তরকরণটি সংযোগকারীকে সঠিক লিঙ্কেজ সহ কোড নির্গমন ঘটায় যা জানে যে এটি তিনটি আর্গুমেন্ট পরিষ্কার করতে পারে।
আর একটি বাস্তবায়ন কৌশল হ'ল সংকলক বা সম্ভবত লিঙ্কারের __startফাংশনটি কাস্টম-জেনারেট করার জন্য (বা যা বলা হোক), বা কমপক্ষে কয়েকটি প্রাক-সংকলিত বিকল্প থেকে একটি নির্বাচন করুন select সমর্থিত ফর্মগুলির মধ্যে mainকোনটি ব্যবহৃত হচ্ছে সে সম্পর্কে তথ্য অবজেক্ট ফাইলে সংরক্ষণ করা যেতে পারে । লিঙ্কার এই তথ্যটি দেখতে পারে এবং স্টার্ট-আপ মডিউলের সঠিক সংস্করণটি নির্বাচন করতে পারে যার মধ্যে একটি কল রয়েছে mainযা প্রোগ্রামটির সংজ্ঞা সাথে সামঞ্জস্যপূর্ণ। সি বাস্তবায়নের ক্ষেত্রে কেবলমাত্র কয়েকটি সংখ্যক সমর্থিত ফর্ম থাকে mainতাই এই পদ্ধতিটি সম্ভব।
সি 99 ভাষার সংকলকগণকে সর্বদা mainবিশেষভাবে কিছুটা চিকিত্সা করতে হবে, কিছুটা হলেও হ্যাককে সমর্থন করতে হবে যে যদি কোনও returnবিবৃতি ছাড়াই ফাংশনটি সমাপ্ত হয় , আচরণটি যেমন return 0মৃত্যুদন্ড কার্যকর হয়েছিল। এটি আবার কোড ট্রান্সফর্মেশন দ্বারা চিকিত্সা করা যেতে পারে। সংকলক বিজ্ঞপ্তি যে একটি ফাংশন বলা mainসংকলিত হচ্ছে। তারপরে এটি পরীক্ষা করে যে শরীরের শেষটি সম্ভাব্যভাবে পৌঁছানো যায় কিনা। যদি তা হয় তবে এটি সন্নিবেশ করায়return 0;
mainএকক প্রোগ্রামে কেবলমাত্র একটি পদ্ধতি থাকতে পারেC(বা, সত্যই, এই জাতীয় কোনও নির্মাণের মতো কোনও ভাষায়)।