আমি ম্যাক্রো ধারণাটি ভালভাবে বুঝতে পারি না। ম্যাক্রো কী? বুঝতে পারছি না কীভাবে এটি ফাংশন থেকে আলাদা? ফাংশন এবং ম্যাক্রো উভয়ই কোডের একটি ব্লক ধারণ করে। তাহলে ম্যাক্রো এবং ফাংশন কীভাবে আলাদা হয়?
আমি ম্যাক্রো ধারণাটি ভালভাবে বুঝতে পারি না। ম্যাক্রো কী? বুঝতে পারছি না কীভাবে এটি ফাংশন থেকে আলাদা? ফাংশন এবং ম্যাক্রো উভয়ই কোডের একটি ব্লক ধারণ করে। তাহলে ম্যাক্রো এবং ফাংশন কীভাবে আলাদা হয়?
উত্তর:
আমি এই উত্তরে পোলারাইজিং ভোটিং প্যাটার্নটি পর্যবেক্ষণ করে নিম্নলিখিত স্পষ্টতা যোগ করতে চাই like
প্রযুক্তিগত নির্ভুলতা এবং বিস্তৃত সাধারণীকরণকে মাথায় রেখে উত্তরটি লেখা হয়নি। সম্পূর্ণ বা নির্ভুল হওয়ার চেষ্টা না করে সহজ ভাষায়, ম্যাক্রোগুলির সাথে একটি প্রোগ্রামিং নবাগতের সাথে ফাংশনগুলির মধ্যে পার্থক্য বোঝানোর এক নম্র প্রচেষ্টা ছিল (বাস্তবে এটি নির্ভুল হওয়া অনেক দূরের)। উত্তরের খসড়া তৈরি করার সময় সি প্রোগ্রামিং ল্যাঙ্গুয়েজটি আমার মনে ছিল, তবে এটির স্পষ্টভাবে উল্লেখ না করার এবং কোনও (সম্ভাব্য) বিভ্রান্তির কারণ হিসাবে আমার ক্ষমাপ্রার্থী।
আমি সত্যিই বিবেচনা জার্গ ডব্লু মিটাগের ভাগ করা উত্তরটি । এটি পড়ার অন্তর্দৃষ্টিপূর্ণ ছিল (আমি কতটা কম জানি) এবং এটি পোস্ট হওয়ার পরে আমি এটিকে উত্সাহ দিয়েছিলাম। আমি সবেমাত্র সফ্টওয়্যার ইঞ্জিনিয়ারিং স্ট্যাক এক্সচেঞ্জে শুরু করেছি এবং এ পর্যন্ত অভিজ্ঞতা এবং আলোচনা সত্যই অন্তর্দৃষ্টিপূর্ণ হয়েছে।
আমি এই উত্তরটি এখানে রেখে যাব কারণ এটি অন্যান্য সফ্টওয়্যার বিকাশের নবাগতদের জন্য সহায়ক হতে পারে, প্রযুক্তিগত মূল্যবৃদ্ধিতে ঝাঁকুনি না হয়ে একটি ধারণা বোঝার চেষ্টা করে।
ম্যাক্রো এবং ফাংশন উভয়ই কোডের স্ব-সংযুক্ত ইউনিটকে উপস্থাপন করে। তারা উভয়ই এমন একটি সরঞ্জাম যা কোনও প্রোগ্রামের মডুলার ডিজাইনে সহায়তা করে। প্রোগ্রামারটির দৃষ্টিকোণ থেকে যারা সোর্স কোডটি লিখছেন, তারা বেশ একইরকম দেখা যায়। যাইহোক, প্রোগ্রাম বাস্তবায়ন জীবনচক্রের সময় তারা কীভাবে পরিচালিত হয় তার মধ্যে তারা পৃথক।
একটি ম্যাক্রো একবার সংজ্ঞায়িত হয় এবং প্রোগ্রামে অনেক জায়গায় ব্যবহৃত হয়। প্রাক-প্রসেসিং পর্যায়ে ম্যাক্রো ইনলাইন প্রসারিত হয়। সুতরাং, উত্স কোডটি সংকলিত হওয়ার পরে এটি প্রযুক্তিগতভাবে পৃথক সত্তা থেকে যায় না। ম্যাক্রো সংজ্ঞাতে থাকা বিবৃতিগুলি অন্যান্য বিবৃতিগুলির মতোই প্রোগ্রামের নির্দেশাবলীর অংশ হয়ে যায়।
ম্যাক্রো লেখার পিছনে উদ্দেশ্য হ'ল প্রোগ্রামারটির জন্য সোর্স কোডটি রাইটিং এবং পরিচালনা করা। ম্যাক্রোগুলি সাধারণত সহজ কাজগুলির জন্য পছন্দসই হয় যেখানে একটি পূর্ণাঙ্গ ক্রিয়াকলাপ লেখার জন্য একটি ওভারহেড / রানটাইম পেনাল্টি হয়। ফাংশনের চেয়ে ম্যাক্রো পছন্দসই এমন পরিস্থিতির উদাহরণগুলি:
ধ্রুবক মানগুলি (যেমন গাণিতিক বা বৈজ্ঞানিক মান), বা কিছু প্রোগ্রাম নির্দিষ্ট পরামিতি ব্যবহার করে।
লগ বার্তা মুদ্রণ করা বা জবাব হ্যান্ডলিং।
সাধারণ গণনা বা শর্ত পরীক্ষার সম্পাদন করা।
ম্যাক্রো ব্যবহার করার সময়, এক জায়গায় এমন পরিবর্তন / সংশোধন করা সহজ যা প্রোগ্রামে ম্যাক্রো ব্যবহৃত হয় তত্ক্ষণাত্ উপলব্ধ। পরিবর্তনগুলি কার্যকর করার জন্য প্রোগ্রামের একটি সাধারণ পুনরায় সংকলন প্রয়োজন।
অন্যদিকে ফাংশন কোডটি প্রোগ্রামের মধ্যে একটি পৃথক ইউনিট হিসাবে সংকলিত হয় এবং প্রোগ্রামের প্রয়োগের সময় স্মৃতিতে লোড হয়ে যায় কেবলমাত্র এটির প্রয়োজন হলে। ফাংশন কোডটি প্রোগ্রামের বাকী অংশ থেকে এটির স্বতন্ত্র পরিচয় ধরে রাখে। ফাংশনটিকে একাধিকবার কল করা হলে লোড কোডটি পুনরায় ব্যবহার করা হবে। চলমান প্রোগ্রামে যখন ফাংশন কলটির মুখোমুখি হয়, তখন রানটাইম সাবসিস্টেম দ্বারা নিয়ন্ত্রণটি এতে পৌঁছে দেওয়া হয় এবং চলমান প্রোগ্রামের প্রসঙ্গে (রিটার্ন নির্দেশিকার ঠিকানা) সংরক্ষণ করা হয়।
যাইহোক, একটি সামান্য পারফরম্যান্স পেনাল্টি রয়েছে যা কোনও ফাংশন (কনটেক্সট স্যুইচিং, মূল প্রোগ্রামের নির্দেশাবলীর রিটার্নের ঠিকানা সংরক্ষণ, প্যারামিটারগুলি পাস করা এবং রিটার্ন মানগুলি হ্যান্ডলিং ইত্যাদি) বলার সময় মুখোমুখি হওয়া দরকার। সুতরাং, ফাংশনটির ব্যবহার কেবল কোডের জটিল ব্লকগুলির জন্যই পছন্দসই (ম্যাক্রোর বিরুদ্ধে যা সহজ ক্ষেত্রে পরিচালনা করে)।
অভিজ্ঞতার সাথে, একজন প্রোগ্রামার সামগ্রিক প্রোগ্রামের আর্কিটেকচারে কোনও ম্যাক্রো বা ফাংশন হিসাবে কোডের একটি টুকরোটি উপযুক্ত হবে কিনা তা বিবেচনা করে সিদ্ধান্ত গ্রহণ করে।
দুর্ভাগ্যক্রমে, প্রোগ্রামিংয়ে "ম্যাক্রো" শব্দটির একাধিক বিভিন্ন ব্যবহার রয়েছে।
ভাষাগুলির লিস্প পরিবারে এবং সেগুলির দ্বারা অনুপ্রাণিত ভাষাগুলির পাশাপাশি স্কালা এবং হাস্কেলের মতো অনেক আধুনিক ক্রিয়ামূলক বা কার্যকরী অনুপ্রাণিত ভাষা, পাশাপাশি বু'র মতো কয়েকটি আবশ্যকীয় ভাষায় ম্যাক্রো একটি কোডের অংশ যা সংকলনের সময়ে চলে runs (বা কমপাইলার ছাড়াই বাস্তবায়নের জন্য রানটাইমের আগে কমপক্ষে) এবং সংক্ষিপ্তকরণের সময় বিমূর্ত সিনট্যাক্স ট্রি (বা নির্দিষ্ট ভাষার সমতুল্য যে কোনওটি যেমন লিস্পে এটি এস-এক্সপ্রেশন হবে) রূপান্তর করতে পারে। উদাহরণস্বরূপ, অনেকগুলি প্রকল্প বাস্তবায়নে,for
ম্যাক্রো যা দেহে একাধিক কলগুলিতে প্রসারিত হয়। স্ট্যাটিক্যালি টাইপ করা ভাষায় ম্যাক্রোগুলি প্রায়শই টাইপ-সেফ থাকে, অর্থাৎ তারা এমন কোড তৈরি করতে পারে না যা ভালভাবে টাইপ করা হয় না।
ভাষার সি পরিবারে ম্যাক্রোগুলি আরও বেশি পাঠ্য প্রতিস্থাপনের মতো। যার অর্থ হ'ল তারা এমন কোড তৈরি করতে পারে যা ভালভাবে টাইপ করা হয় না, এমনকি সিন্টেক্সিকভাবে আইনীও নয়।
ম্যাক্রো-অ্যাসেমব্লার্সগুলিতে, "ম্যাক্রোগুলি" "ভার্চুয়াল নির্দেশাবলী", অর্থাত সিপিইউ স্থানীয়ভাবে সমর্থন করে না তবে কার্যকর যে নির্দেশাবলী নির্দেশ করে এবং তাই এসেমব্লার আপনাকে সেই নির্দেশাবলী ব্যবহার করতে দেয় এবং সেগুলি একাধিক নির্দেশিকায় প্রসারিত করবে যা সিপিইউ বুঝতে পারে ।
অ্যাপ্লিকেশন স্ক্রিপ্টিংয়ে, একটি "ম্যাক্রো" ক্রমগুলির ক্রমকে বোঝায় যা ব্যবহারকারী "রেকর্ড" করতে পারে এবং "ফিরে খেলতে" পারে।
এগুলি সবই কিছু অর্থে এক্সিকিউটেবল কোডের ধরণের, যার অর্থ তারা কোনও অর্থে ফাংশন হিসাবে দেখা যেতে পারে। তবে, লিসপ ম্যাক্রোগুলির ক্ষেত্রে, উদাহরণস্বরূপ, তাদের ইনপুট এবং আউটপুট হ'ল প্রোগ্রামের খণ্ড। সি এর ক্ষেত্রে, তাদের ইনপুট এবং আউটপুটটি টোকেন। প্রথম তিনটিরও অত্যন্ত গুরুত্বপূর্ণ পার্থক্য রয়েছে যেগুলি সংকলন সময়ে কার্যকর করা হয় । প্রকৃতপক্ষে, সি প্রিপ্রসেসর ম্যাক্রোস, নামটি বোঝা যায়, কোডটি এমনকি সংকলকটি পৌঁছানোর আগেই সম্পাদিত হয় ।
সি ভাষা পরিবারে একটি ম্যাক্রো সংজ্ঞা , একটি প্রিপ্রসেসর কমান্ড, সংজ্ঞায়িত সংকলন না করে ম্যাক্রো কল এ প্রতিস্থাপিত কোডের একটি প্যারাম্যাট্রাইজড টেম্পলেট নির্দিষ্ট করে । এর অর্থ হ'ল সমস্ত ফ্রি ভেরিয়েবল ম্যাক্রো কলের প্রসঙ্গে আবদ্ধ হওয়া উচিত। পার্শ্ব প্রতিক্রিয়াযুক্ত প্যারামিটার যুক্তিগুলি প্যারামিটারের i++
বহুবচন ব্যবহারের দ্বারা পুনরাবৃত্তি হতে পারে। 1 + 2
কিছু প্যারামিটারের আর্গুমেন্টের পাঠ্য প্রতিস্থাপনx
সংকলনের আগে ঘটে এবং অপ্রত্যাশিত আচরণের কারণ হতে পারে x * 3
( 7
io 9
) o ম্যাক্রো সংজ্ঞাটির ম্যাক্রো বডিটিতে একটি ত্রুটি কেবল ম্যাক্রো কলটিতে সংকলন করার পরে প্রদর্শিত হবে।
দ্য ফাংশন সংজ্ঞা বিনামূল্যে ভেরিয়েবল ফাংশন বডির প্রেক্ষাপটে আবদ্ধ সঙ্গে নির্দিষ্ট করে কোড; না ফাংশন কল ।
তবে ম্যাক্রো আপাতদৃষ্টিতে নেতিবাচক কল, লাইন নম্বর এবং উত্স ফাইল, স্ট্রিং হিসাবে যুক্তি অ্যাক্সেস সরবরাহ করে ।
সামান্য আরও বিমূর্ত পদে, একটি ম্যাক্রো সিনট্যাক্স হিসাবে একটি ফাংশন তথ্য হিসাবে হয়। একটি ফাংশন (বিমূর্তে) ডেটাতে কিছু রূপান্তরকে আবদ্ধ করে। এটি তার তর্কগুলি মূল্যায়ন করা ডেটা হিসাবে গ্রহণ করে, তাদের উপর কিছু ক্রিয়া সম্পাদন করে এবং ফলাফল দেয় যা কেবলমাত্র ডেটা।
বিপরীতে একটি ম্যাক্রো কিছু মূল্যহীন সিনট্যাক্স নেয় এবং এটিতে কাজ করে। সি-জাতীয় ভাষার জন্য সিনট্যাক্সটি টোকেন স্তরে আসে। এলআইএসপি-জাতীয় ম্যাক্রোগুলির ভাষাগুলির জন্য তারা এএসটি হিসাবে উপস্থাপিত সিনট্যাক্স পান। ম্যাক্রোর অবশ্যই সিনট্যাক্সের একটি নতুন অংশ ফিরে আসতে হবে।
একটি ম্যাক্রো সাধারণত এমন কিছুকে বোঝায় যা স্থানে প্রসারিত হয় , সংকলন বা প্রাক-প্রক্রিয়াকরণের সময় ম্যাক্রোর পরিবর্তে লক্ষ্য ভাষায় পৃথক নির্দেশাবলীর সাহায্যে call রানটাইমের সময়, ম্যাক্রোটি কোথায় শুরু হয় এবং শেষ হয় সে সম্পর্কে সাধারণত কোনও ইঙ্গিত পাওয়া যায় না।
এটি একটি সাবরুটিন থেকে পৃথক , যা কোডের পুনরায় ব্যবহারযোগ্য টুকরা যা মেমরিতে পৃথকভাবে অবস্থিত, যা রানটাইম সময়ে নিয়ন্ত্রণটি পাস হয় । বেশিরভাগ প্রোগ্রামিং ভাষার "ফাংশন", "পদ্ধতি" এবং "পদ্ধতি" এই বিভাগে আসে।
জার্গ ডব্লু মিটাগের উত্তরটি যেমন আলোচনা করেছে ঠিক তেমনি ভাষাগুলির মধ্যেও বিশদ বিবরণ ভিন্ন হয়: কারও কারও মতো সি, ম্যাক্রো উত্স কোডে পাঠ্য প্রতিস্থাপন সম্পাদন করে; লিস্পের মতো কিছুতে এটি একটি বিমূর্ত সিনট্যাক্স গাছের মতো মধ্যস্থতাকারী ফর্মের কারসাজি সম্পাদন করে। কিছু ধূসর অঞ্চলও রয়েছে: কিছু ভাষায় "ইনলাইন ফাংশন" এর জন্য স্বরলিপি রয়েছে, যা একটি ফাংশনের মতো সংজ্ঞায়িত হলেও ম্যাক্রোর মতো সংকলিত প্রোগ্রামে প্রসারিত হয়।
বেশিরভাগ ভাষা প্রোগ্রামারদের বিচ্ছিন্নভাবে প্রতিটি সাব্রোটিন সম্পর্কে যুক্তি, ইনপুট এবং আউটপুটগুলির জন্য ধরণের চুক্তিগুলি সংজ্ঞায়িত করতে এবং কলিং কোড সম্পর্কিত অন্যান্য তথ্য গোপন করতে উত্সাহিত করে। সাব্রোটিন কল করার ক্ষেত্রে প্রায়শই পারফরম্যান্স প্রভাব থাকে যা ম্যাক্রোগুলি ব্যয় করে না এবং ম্যাক্রোস প্রোগ্রামটি যেভাবে সাব্রোটিন করতে পারে না সেভাবে পরিচালনা করতে সক্ষম হতে পারে। ম্যাক্রোসকে তাই সাবরুটাইনগুলির তুলনায় "নিম্ন স্তর" হিসাবে বিবেচনা করা যেতে পারে কারণ তারা কম বিমূর্ত ভিত্তিতে কাজ করে।
সংকলনের সময় ম্যাক্রো কার্যকর করা হয় এবং সঞ্চালনের সময় ফাংশন কার্যকর করা হয়।
উদাহরণ:
#include <stdio.h>
#define macro_sum(x,y) (x+y)
int func_sum(x,y) {
return x+y;
}
int main(void) {
printf("%d\n", macro_sum(2,3));
printf("%d\n", func_sum(2,3));
return 0;
}
তাই সংকলনের সময় কোডটি আসলে এতে পরিবর্তন করা হয়:
#include <stdio.h>
int func_sum(x,y) {
return x+y;
}
int main(void) {
printf("%d\n", (2+3));
printf("%d\n", func_sum(2,3));
return 0;
}