ম্যাক্রোগুলিকে বেশিরভাগ আধুনিক প্রোগ্রামিং ভাষায় অন্তর্ভুক্ত করা হয় না কেন?


31

আমি জানি যে তারা সি / সি ++ এ অত্যন্ত অনিরাপদভাবে কার্যকর করা হয়েছে। এগুলি নিরাপদে কার্যকর করা যায় না? ম্যাক্রোগুলির অসুবিধাগুলি কি তারা সরবরাহ করে এমন বিশাল শক্তিকে ছাড়িয়ে যাওয়ার পক্ষে যথেষ্ট খারাপ?


4
ঠিক কীভাবে ম্যাক্রোগুলি এমন শক্তি সরবরাহ করে যা মোটামুটি সহজেই অন্য উপায়ে অর্জিত হয় না?
চিন্ময় কাঞ্চি

2
সি # তে, এটি একটি সাধারণ সম্পত্তি এবং ব্যাকিং ফিল্ড তৈরি করে একটি ঘোষণায় র‌্যাপ করে একটি মূল ভাষা বর্ধন করে। এবং এটি লেক্সিকাল ম্যাক্রোগুলির চেয়ে বেশি লাগে: আপনি ভিজুয়াল বেসিকের WithEventsসংশোধককে কীভাবে বৈশিষ্ট্য তৈরি করতে পারেন ? আপনার কাছে সিমেটিক ম্যাক্রোর মতো কিছু দরকার হবে।
জেফ্রি হ্যান্টিন

3
ম্যাক্রোগুলির সমস্যা হ'ল, সমস্ত শক্তিশালী যান্ত্রিক পদ্ধতির মতো এটি প্রোগ্রামারকে অন্যেরা যে ধারণা তৈরি করে বা করবে তা ভাঙ্গতে দেয়। অনুমানগুলি যুক্তির মূল চাবিকাঠি এবং যুক্তি সম্পর্কে সম্ভাব্য যুক্তিযুক্ত দক্ষতা ছাড়াই অগ্রগতি করা নিষিদ্ধ হয়ে যায়।
ড্যান_ওয়াটারওয়ার্থ

2
@ চিন্ময়: ম্যাক্রোস কোড উত্পন্ন করে। সেই শক্তির সাথে জাভা ভাষার কোনও বৈশিষ্ট্য নেই।
কেভিন 4

1
@ চিন্ময় কাঞ্চি: ম্যাক্রোগুলি রান টাইমের পরিবর্তে সংকলন সময়ে কোড কার্যকর করতে (মূল্যায়ন) অনুমতি দেয়।
জর্জিও

উত্তর:


57

আমি মনে করি এর মূল কারণটি হ'ল ম্যাক্রোগুলি লেক্সিকাল । এর বেশ কয়েকটি পরিণতি রয়েছে:

  • সংকলকটির কোনও ম্যাক্রো শব্দার্থগতভাবে বন্ধ আছে কিনা তা যাচাই করার কোনও উপায় নেই, অর্থাত এটি কোনও ফাংশনের মতো "অর্থের একক" উপস্থাপন করে। (বিবেচনা করুন #define TWO 1+1- TWO*TWOসমান কি করে ? 3.)

  • ম্যাক্রোগুলি টাইপ করা হয় না যেমন ফাংশনগুলি। সংকলকটি প্যারামিটারগুলি এবং রিটার্ন টাইপটি বোঝায় তা পরীক্ষা করতে পারে না। এটি কেবল ম্যাক্রো ব্যবহার করে এমন প্রসারিত অভিব্যক্তি পরীক্ষা করতে পারে।

  • কোডটি সংকলন না করে, সংকলকটির ত্রুটিটি ম্যাক্রোতে নিজেই রয়েছে বা ম্যাক্রোটি যে জায়গায় ব্যবহৃত হয়েছে তা জানার কোনও উপায় নেই। সংকলকটি হয় ভুল জায়গার অর্ধেক সময় রিপোর্ট করবে, অথবা এটি উভয়ই জানাতে হবে যদিও তাদের মধ্যে একটি সম্ভবত ভাল। (বিবেচনা করুন #define min(x,y) (((x)<(y))?(x):(y)): যদি প্রকার ও কি কি কম্পাইলার কি করা উচিত xএবং yমিলছে না বা বাস্তবায়ন না operator<?)

  • স্বয়ংক্রিয় সরঞ্জামগুলি তাদের সাথে শব্দার্থবিজ্ঞানের উপকারী উপায়ে কাজ করতে পারে না। বিশেষত, আপনার কাছে ম্যাক্রোগুলির জন্য ইন্টেলিসেন্সের মতো জিনিস থাকতে পারে না যা ফাংশনের মতো কাজ করে তবে একটি এক্সপ্রেশনে প্রসারিত হয়। (আবার, minউদাহরণ।)

  • ম্যাক্রোর পার্শ্ব প্রতিক্রিয়াগুলি যেমন ফাংশনগুলির সাথে থাকে তত স্পষ্ট হয় না যা প্রোগ্রামারটির জন্য সম্ভাব্য বিভ্রান্তি সৃষ্টি করে। ( minউদাহরণটি আবার বিবেচনা করুন : একটি ফাংশন কলে, আপনি জানেন যে এর জন্য xপ্রকাশটি একবারেই মূল্যায়ন করা হয়, তবে এখানে আপনি ম্যাক্রোর দিকে তাকানো ছাড়া জানতে পারবেন না))

যেমনটি আমি বলেছিলাম, এগুলি ম্যাক্রোগুলি লেজিকাল এই সত্যের পরিণতি। আপনি যখন এগুলিকে আরও যথাযথ কিছুতে রূপান্তরিত করার চেষ্টা করেন আপনি ফাংশন এবং ধ্রুবক দিয়ে শেষ করেন।


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

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

25
আমি মনে করি যে ম্যাক্রো শব্দটি স্কিমের ব্যবহার লিস্পের সাথে সম্পর্কিত, সম্ভবত এটির অর্থ অন্যান্য বেশিরভাগ ব্যবহারের পূর্বাভাস। আইআইআরসি সি / সি ++ সিস্টেমকে মূলত প্রিপ্রসেসর বলা হত ।
বেভান

16
@ বেভান ঠিক আছে। ম্যাক্রোগুলি লেক্সিকাল বলার মতো, পাখি উড়তে পারে না কারণ যে পাখির সাথে আপনি সর্বাধিক পরিচিত তিনি একটি পেঙ্গুইন। এটি বলেছিল, আপনি যে পয়েন্টগুলি উত্থাপন করেছেন তার বেশিরভাগ (তবে সমস্ত নয়) সিনট্যাকটিক ম্যাক্রোগুলির ক্ষেত্রেও প্রয়োগ হয়, যদিও সম্ভবত কিছুটা কম মাত্রায়ও।
লরেন্স গনসালভেস

13

তবে হ্যাঁ, সি / সি ++ এর চেয়ে ম্যাক্রোগুলি আরও ভালভাবে ডিজাইন এবং প্রয়োগ করা যেতে পারে।

ম্যাক্রোগুলির সমস্যা হ'ল তারা কার্যকরভাবে একটি ভাষা সিনট্যাক্স এক্সটেনশন মেকানিজম যা আপনার কোডটিকে অন্য কোনও কিছুতে আবার লিখে দেয়।

  • সি / সি ++ ক্ষেত্রে কোনও মৌলিক বিড়ম্বনা পরীক্ষা করা হয় না। আপনি যদি সাবধান হন তবে বিষয়গুলি ঠিক আছে। আপনি যদি কোনও ভুল করেন, বা আপনি ম্যাক্রোকে অতিরিক্ত ব্যবহার করেন তবে আপনি বড় সমস্যার মধ্যে পড়তে পারেন।

    এটি যুক্ত করুন যে আপনি (সি / সি ++ স্টাইল) ম্যাক্রোগুলির সাহায্যে করতে পারেন এমন অনেকগুলি সহজ জিনিস অন্যান্য ভাষায় অন্য উপায়ে করা যেতে পারে।

  • বিভিন্ন লিস্প উপভাষার মতো অন্যান্য ভাষায় ম্যাক্রো মূল ভাষার বাক্য গঠনের সাথে আরও ভালভাবে সংহত হয় তবে আপনি এখনও ম্যাক্রো "ফাঁস" এর ঘোষণায় সমস্যা পেতে পারেন। এটি স্বাস্থ্যকর ম্যাক্রো দ্বারা সম্বোধন করা হয় ।


সংক্ষিপ্ত Conতিহাসিক প্রসঙ্গ

ম্যাক্রোস (ম্যাক্রো-নির্দেশাবলীর জন্য সংক্ষিপ্ত) প্রথম সমাবেশের ভাষা প্রসঙ্গে উপস্থিত হয়েছিল। উইকিপিডিয়া অনুসারে , 1950 এর দশকে কিছু আইবিএম এসেমব্লারগুলিতে ম্যাক্রোগুলি পাওয়া যেত।

আসল এলআইএসপিতে ম্যাক্রোগুলি ছিল না তবে তারা 1960 এর দশকের মাঝামাঝি সময়ে ম্যাকলিস্পে প্রথম পরিচয় হয়েছিল: https://stackoverflow.com/questions/3065606/wen-did-the-idea-of-macros-user-defined-code -রূপান্তর-উপস্থিতhttp://www.csee.umbc.edu/courses/331/resources/papers/Evolution-of-Lisp.pdf । তার আগে, "ফেফার্স" ম্যাক্রোর মতো কার্যকারিতা সরবরাহ করেছিল।

সি এর প্রাচীনতম সংস্করণগুলিতে ম্যাক্রোগুলি নেই ( http://cm.bell-labs.com/cm/cs/who/dmr/chist.html )। এগুলি একটি প্রিপ্রসেসরের মাধ্যমে 1972-73 সার্কায় যুক্ত করা হয়েছিল। তার আগে, সি কেবল সমর্থন করেছিল #includeএবং #define

এম 4 ম্যাক্রো-প্রিপ্রেসেসরটি 1977 সালে সার্কায় উত্পন্ন হয়েছিল।

আরও সাম্প্রতিক আরও ভাষাগুলি স্পষ্টতই ম্যাক্রোগুলি প্রয়োগ করে যেখানে অপারেশনটির মডেল পাঠ্যগত পরিবর্তে সিনট্যাকটিক।

সুতরাং কেউ যখন "ম্যাক্রো" শব্দের একটি নির্দিষ্ট সংজ্ঞাটির আধ্যাত্মিকতার কথা বলছেন , তবে এটি লক্ষ্য করা গুরুত্বপূর্ণ যে সময়ের সাথে সাথে এই অর্থটি বিকশিত হয়েছে।


9
সি ++ টিডব্লিউও ম্যাক্রো সিস্টেমে ধন্য (?): প্রিপ্রোসেসর এবং টেম্পলেট প্রসারিত expansion
জেফ্রি হ্যান্টিন

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

@ ডাঙ্ক, লিস্পের মতো ম্যাক্রোর সংজ্ঞাটি হতাশ সি প্রিপ্রোসেসরের মতো "আধুনিক" বোবা বোঝার পূর্বাভাস দিয়েছে।
এসকে-লজিক

@ এসকে: "প্রযুক্তিগতভাবে" সঠিক হওয়া এবং কথোপকথনকে অচল করে দেওয়া কি আরও ভাল বা বোঝা আরও ভাল?
ডঙ্ক

1
@ ডাঙ্ক, পরিভাষা অজ্ঞ জনগণের মালিকানা নয়। তাদের অজ্ঞতা কখনই বিবেচনায় নেওয়া উচিত নয়, তা না হলে এটি কম্পিউটার বিজ্ঞানের পুরো ডোমেনটিকে স্তব্ধ করে দেবে। যদি কেউ "সি ম্যাক্রো" কে কেবল সি প্রিপ্রোসেসরের রেফারেন্স হিসাবে বুঝতে পারে তবে এটি অজ্ঞতা ছাড়া কিছুই নয়। আমি সন্দেহ করি এমন লোকদের একটি উল্লেখযোগ্য অনুপাত আছে যারা কখনও লিপ্প বা এমনকি, অফিসে ভিবিএ "ম্যাক্রোস", পারফোননেজ সোম ফ্রানাইস, এমনকি কখনও শুনেনি।
এসকে-লজিক

12

স্কট নোট হিসাবে ম্যাক্রোস আপনাকে যুক্তি লুকানোর অনুমতি দিতে পারে। অবশ্যই, তাই ফাংশন, ক্লাস, গ্রন্থাগার এবং অন্যান্য অনেক সাধারণ ডিভাইসগুলি করুন।

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

তবে এটি আপত্তিজনক হতে পারে। কোড পড়া, বুঝতে এবং ডিবাগ করা, নতুন প্রোগ্রামারদের একটি কোডবেসের সাথে পরিচিত হওয়ার জন্য প্রয়োজনীয় সময় বাড়ানো এবং ব্যয়বহুল ভুল এবং বিলম্বের কারণ হতে পারে code

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


3
এবং তারপরে জাভা
ভবিষ্যদ্বাণী

2
@ জেফ্রি: এবং আসুন ভুলে যাবেন না, প্রচুর পরিমাণে তৃতীয় পক্ষের কোড জেনারেটর রয়েছে। দ্বিতীয় চিন্তায়, আসুন সেগুলি ভুলে যাই।
Shog9

4
জাভা কীভাবে সরলের পরিবর্তে সরল ছিল তার আরেকটি উদাহরণ।
জেফ্রি হ্যান্টিন

3
@ জেফ্রি হ্যান্টিন: ফোরচ নিয়ে কী দোষ?
কেসব্যাশ

1
@ ডাঙ্ক এই উপমাটি একটি প্রসারিত হতে পারে ... তবে আমি মনে করি ভাষার এক্সটেনসিবিলিটি হ'ল প্লুটোনিয়ামের মতো। ব্যয়বহুলভাবে প্রয়োগ করা, কাঙ্ক্ষিত আকারগুলিতে মেশিন করা খুব কঠিন এবং অপব্যবহার করা গেলে উল্লেখযোগ্যভাবে বিপজ্জনক, তবে ভালভাবে প্রয়োগ করা গেলে আশ্চর্যরকম শক্তিশালী।
জেফ্রি হ্যান্টিন

6

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

ম্যাক্রোগুলি কতটা সহজ হতে পারে তার একটি উদাহরণ এই ক্লোজার উদাহরণ যা কোনও ব্যতিক্রমের ক্ষেত্রে ব্যবহারের জন্য একটি ডিফল্ট মান নির্দিষ্ট করে:

(defmacro on-error [default-value code]
  `(try ~code (catch Exception ~'e ~default-value)))

(on-error 0 (+ nil nil))               ;; would normally throw NullPointerException
=> 0                                   ;l; but we get the default value

এমনকি লিসপসে যদিও, সাধারণ পরামর্শটি "আপনার দরকার না থাকলে ম্যাক্রো ব্যবহার করবেন না"।

আপনি যদি একটি হোমিকোনিক ভাষা ব্যবহার না করে থাকেন তবে ম্যাক্রোগুলি আরও কৌতুকপূর্ণ হয়ে ওঠে এবং অন্যান্য বিভিন্ন বিকল্পের কিছু সমস্যা রয়েছে:

  • পাঠ্য-ভিত্তিক ম্যাক্রোগুলি - সি সি প্রিপ্রোসেসর - বাস্তবায়নের পক্ষে সহজ তবে সঠিকভাবে ব্যবহার করা খুব জটিল কারণ আপনাকে পাঠ্য আকারে সঠিক উত্স বাক্য গঠনের প্রয়োজন যেমন কোনও সিন্ট্যাক্টিকাল quirks সহ
  • ম্যাক্রো ভিত্তিক ডিএসএলএস - যেমন সি ++ টেম্পলেট সিস্টেম। কমপ্লেক্স, নিজেই কিছু জটিল বাক্য গঠন করতে পারে, সংকলক এবং সরঞ্জাম লেখকদের সঠিকভাবে পরিচালনা করার জন্য এটি অত্যন্ত জটিল হতে পারে কারণ এটি ভাষার বাক্য গঠন এবং শব্দার্থবিদ্যায় উল্লেখযোগ্য নতুন জটিলতার পরিচয় দেয়।
  • এএসটি / বাইটকোড ম্যানিপুলেশন এপিআইগুলি - যেমন জাভা প্রতিবিম্ব / বাইটকোড জেনারেশন - তাত্ত্বিকভাবে খুব নমনীয় তবে খুব ভার্জোজ পাওয়া যেতে পারে: বেশ সহজ জিনিস করতে এর জন্য প্রচুর কোডের প্রয়োজন হতে পারে। যদি তিন লাইনের ফাংশনের সমতুল্য উত্পন্ন করতে দশ লাইনের কোড লাগে তবে আপনি আপনার মেটা-প্রোগ্রামিং প্রচেষ্টা দিয়ে খুব বেশি লাভ করতে পারেন নি ...

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


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

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

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

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

4

আপনার প্রশ্নের উত্তর দিতে, ম্যাক্রোগুলি প্রধানত কী জন্য ব্যবহৃত হয় তা সম্পর্কে চিন্তা করুন (সতর্কতা: মস্তিষ্ক-সংকলিত কোড)।

  • ম্যাক্রোস প্রতীকী ধ্রুবকগুলি সংজ্ঞায়িত করত #define X 100

এটি সহজেই এর সাথে প্রতিস্থাপন করা যেতে পারে: const int X = 100;

  • ম্যাক্রোজগুলি ইনলাইন টাইপ-অজোনস্টিক ফাংশনগুলি (প্রয়োজনীয়ভাবে) সংজ্ঞায়িত করতে ব্যবহৃত হত #define max(X,Y) (X>Y?X:Y)

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

  • ম্যাক্রোজগুলি প্রায়শই ব্যবহৃত উপাদানগুলিতে শর্টকাট নির্দিষ্ট করতে ব্যবহৃত হত। #define p printf

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

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

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


1
আপনার যদি সর্বোচ্চ # নির্ধারণ করতে হয় তবে অনুগ্রহ করে প্যারামিটারগুলির চারপাশে বন্ধনী রাখুন, তাই অপারেটরের অগ্রাধিকার থেকে কোনও অপ্রত্যাশিত প্রভাব নেই ... যেমন # ডিফাইন ম্যাক্স (এক্স, ওয়াই) ((এক্স)> (ওয়াই)? (এক্স) :( ওয়াই))
foo বিন্যাস

আপনি বুঝতে পারছেন যে এটি নিছক একটি উদাহরণ ছিল ... উদ্দেশ্যটি হ'ল চিত্রিত করা।
চিন্ময় কাঞ্চি

বিষয়টি নিয়মিতভাবে পরিচালনা করার জন্য +1। আমি যুক্ত করতে চাই যে শর্তসাপেক্ষ সংকলন সহজেই একটি দুঃস্বপ্ন হয়ে উঠতে পারে - আমার মনে আছে "ইউনিফর্ম" (??) নামক একটি প্রোগ্রাম ছিল যার উদ্দেশ্য পোস্টপ্রসেসিংয়ের পরে যা ছিল তা দৃশ্যমান করে তোলা।
এঙ্গো

7
In fact, I can't think of a single use-case for macros that can't easily be duplicated in another way: সিটিতে কমপক্ষে, আপনি ম্যাক্রোগুলি ব্যবহার না করে টোকেন কনটেনটেশন ব্যবহার করে সনাক্তকারী (পরিবর্তনশীল নাম) তৈরি করতে পারবেন না।
চার্লস সালভিয়া

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

2

আমি ম্যাক্রোগুলির সাথে দেখা সবচেয়ে বড় সমস্যাটি হ'ল যখন ভারী ব্যবহার করা হয় তখন তারা কোড পড়তে এবং বজায় রাখা খুব জটিল করে তুলতে পারে যেহেতু তারা আপনাকে ম্যাক্রোতে যুক্তি লুকিয়ে রাখার অনুমতি দেয় যা খুঁজে পাওয়া সহজ বা নাও হতে পারে (এবং তুচ্ছ হতে পারে বা নাও হতে পারে) )।


ম্যাক্রো নথিভুক্ত করা উচিত নয়?
কেসব্যাশ

@ ক্যাসবাশ: অবশ্যই, ম্যাক্রোটি অন্য উত্স কোডের মতোই নথিভুক্ত করা উচিত ... তবে বাস্তবে আমি এটি খুব কমই দেখেছি seen
স্কট ডরম্যান

3
ডকুমেন্টেশন কখনও ডিবাগ করবেন? খারাপভাবে লিখিত কোড ব্যবহার করার সময় এটি যথেষ্ট নয় not
JeffO

ওওপি-তে কিছু সমস্যা রয়েছে যদিও ...
এওইউ 256

2

সি / সি ++ এ থাকা ম্যাক্রোগুলি খুব সীমাবদ্ধ, ত্রুটিযুক্ত প্রবণ এবং সত্যই এটি কার্যকর নয় তা লক্ষ করে শুরু করুন।

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

তবে সি-তে সীমিত কার্যকারিতার অপব্যবহারের কারণে তারা একটি খারাপ সুনাম কুড়িয়েছে। সুতরাং কেউ আর ম্যাক্রোগুলি প্রয়োগ করে না, পরিবর্তে আপনি টেমপ্লেটগুলির মতো জিনিসগুলি পান যা কিছু সাধারণ স্টাফ ম্যাক্রোগুলি করত এবং জাভা-র টীকাগুলির মতো জিনিসগুলি করত যা কিছু জটিল স্টাফ ম্যাক্রোর ব্যবহৃত করত।

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