সি ++ টেমপ্লেটগুলি কি এক ধরণের গৌরবময় ম্যাক্রো?


27

সি ++ টেম্পলেট এবং সি # / জাভা জেনেরিকগুলির মধ্যে এইগুলির মতো বিভিন্ন তুলনা থেকে-

/programming/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929

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

তারপরে আমি এটিকে সমর্থন করে আরও কিছু তথ্য পেয়েছি-

  • আমি ভেবেছিলাম, সি ++ টেমপ্লেটগুলি প্রিপ্রোসেসিংয়ের মাধ্যমে প্রয়োগ করা হলে ডায়নামিক লিঙ্কিং (.dll ব্যবহার করে) এর সাথে সমস্যা হবে। এবং একটি দ্রুত গুগলিং এটি সমর্থন করে।

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

সি ম্যাক্রোগুলির বিপরীতে এর কিছু উচ্চতর ক্ষমতা রয়েছে। তবে কি সি ++ টেম্পলেট কোনও ধরণের প্রাকপ্রসেসিংয়ের সাথে প্রয়োগ করা হচ্ছে না? এটি বিভিন্ন সি ++ সংকলকগুলিতে কীভাবে প্রয়োগ করা হয়?


19
নাঃ। সি ++ টেমপ্লেটগুলি সংকলিত হয়।
এডওয়ার্ড স্ট্রেঞ্জ

2
"প্রিপ্রোসেসিং" এর আপনার সংজ্ঞাটি কী? এবং "সংকলন" এর? "প্রিপ্রোসেসিং" এর পর্যাপ্ত বিস্তৃত সংজ্ঞায় একটি সংকলক যা কিছু করে তা অন্তর্ভুক্ত করতে পারে; সর্বোপরি, একটি সংকলক সত্যই কার্যকর হওয়ার আগে উত্সটি প্রসেস করে, না?
জেমস ম্যাকনেলিস

@ জেমস ম্যাকনেলিস আইএমএইচও যদি আপনি কেবল সংকলনের জন্য করা অন্যান্য সমস্ত কাজ থেকে প্রিপ্রোসেসিংকে আলাদা করতে পারেন তবে আমার প্রশ্নটি বোঝার পক্ষে এটি যথেষ্ট। প্রিপ্রোসেসর- en.wikedia.org/wiki/Preprocessor#Lexical_preprocessors
গুলশান

6
আপনি যদি প্রিপ্রোসেসিংয়ের সেই ফর্মটি উল্লেখ করছেন, তবে না, সি ++ টেম্পলেটগুলি একেবারে প্রশংসিত ম্যাক্রোর কিছু নয়।
জেমস ম্যাকনেলিস

1
টেমপ্লেট ল্যাঙ্গুয়েজটি প্রকৃতপক্ষে সম্পূর্ণরূপে টুর হচ্ছে যাতে এগুলি বর্ধিত ম্যাক্রোগুলির চেয়ে অনেক বেশি।
ডেভিডক 01

উত্তর:


9

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


2
"তবে সেই ভাষা থেকে অন্তর্নিহিত সি ++ পরিবেশে অ্যাক্সেস না থাকায় এটি মারাত্মকভাবে সীমাবদ্ধ" " -- এর মানে কী? আমি এই বিবৃতিটি বিশ্লেষণের চেষ্টা করেছি, তবে ব্যর্থ হয়েছি।
কোয়ান্ট_দেব


3
@ এসকে-যুক্তি: আলাদাভাবে হিসাবে, সি ++ 11 হ'ল সি ++, যদি না আপনি (প্যাডেন্টালি) একই ভাষার বিভিন্ন সংস্করণকে বিভিন্ন ভাষার হিসাবে বিবেচনা করেন।
জন পূর্ব

3
@ জোন পূর্ব, সি ++ 11 এর উত্তর দেওয়ার সময় পর্যন্ত (সরকারীভাবে) উপস্থিত ছিল না। আজকাল একটি উদাহরণ আরও জটিল হত, যেমন কোনও ডেটা স্ট্রাকচার ডিকোপোজ করা, লাইব্রেরির ফাংশন ব্যবহার ইত্যাদি
এসকে-লজিক

1
@ এসকে-যুক্তি: আপনি কি লিস্পের মতো ম্যাক্রোগুলির সাহায্যে সি ++ এর বাস্তবায়ন জানেন? আমি টেমপ্লেটের সীমাবদ্ধতায় অসুস্থ হয়ে পড়ছি। হ্যাক্সে শক্তিশালী ম্যাক্রো সিস্টেম সহ সি ++ - স্টাইলের সিনট্যাক্স ভাষার উদাহরণ: haxe.org/manual/macros । (আমাকে সাহায্য করে না কারণ আমি সি ++ এর উদ্দেশ্যে ব্যবহার করি - 8 বিট মাইক্রোকন্ট্রোলার প্রোগ্রামিং; অন্য যে কোনও কিছুর জন্য আরও ভাল ভাষা রয়েছে)।
pfalcon

41

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

সুতরাং: সি ++ টেমপ্লেটগুলি একই অর্থে ম্যাক্রোগুলির প্রাক প্রসেসিং নয়, তারা এক ধরণের সি ম্যাক্রো নয় এবং টেমপ্লেটগুলি কী করে তা নকল করতে সি ম্যাক্রো ব্যবহার করা অসম্ভব।

টেমপ্লেটগুলি লিঙ্কযুক্ত লাইব্রেরিতে নয়, শিরোনাম ফাইলগুলিতে বাস করে, সত্য তবে আপনি যদি একটি .dll সরবরাহ করেন তবে সম্ভবত এটি ব্যবহারের জন্য একটি শিরোলেখ ফাইল সরবরাহ করছেন।


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

@ মার্টিন: আমি নিশ্চিত নই যে এই প্রযুক্তিটি (সমর্থিত থাকাকালীন) আসলে স্পষ্টভাবে স্ট্যান্ডার্ড দ্বারা সমর্থিত কিনা। অন্যথায় সমস্ত সংকলক exportইতিমধ্যে কার্যকর করা হয়েছে। আমি জানি এটি ফাংশনগুলির জন্য একধরণের কাজ, তবে আমি সন্দেহ করি এটি ক্লাসগুলির জন্য কাজ করে: আপনি তাদের আকারটি কীভাবে জানবেন?
ম্যাথিউ এম।

@ ম্যাথিয়েউ এম: রফতান মূলশব্দটির সাথে এর কোনও যোগসূত্র নেই। এটি "স্পষ্টত" টেম্পলেট ইনস্ট্যান্টেশন নিয়ে কাজ করে এবং স্ট্যান্ডার্ডে ভালভাবে সংজ্ঞায়িত হয়।
মার্টিন ইয়র্ক

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

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

5

এগুলি কীভাবে বাস্তবায়ন করা যায় তাতে কিছু আসে যায় না? প্রারম্ভিক সি ++ সংকলকগুলি কেবল প্রি-প্রসেসর ছিল যা কোডটি এসি সংকলককে খাওয়াত, এর অর্থ এই নয় যে সি ++ কেবল একটি গৌরবযুক্ত ম্যাক্রো।

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

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


আমি সি ++ মহিমান্বিত ম্যাক্রো হওয়ার কথা বলিনি। আমি সি ++ এর অনেক প্রশংসা করি। শুধু কৌতূহলী হচ্ছে।
গুলশান

2
@ গুলশান: না, আপনি সে সম্পর্কে কিছু বলেননি। তা সত্ত্বেও, প্রথমদিকে সি ++ সংকলকরা কীভাবে কাজ করেছিল (সিফ্রন্টটি কেবলমাত্র ম্যাক্রো প্রিপ্রোসেসরের পরিবর্তে একটি সংকলক ছিল) এবং সি ++ টেমপ্লেটগুলি সম্পর্কে আপনার বক্তব্য প্রারম্ভিক সি ++ নিজেই প্রযোজ্য।
ডেভিড থর্নলে

সিফ্রন্ট সি ++ থেকে সি সংকলিত প্রিপ্রসেসর এবং সংকলকের মধ্যে লাইনটি স্পষ্টভাবে সংজ্ঞায়িত করা হয়েছে: একটি সংকলক তার ইনপুটটি বোঝার চেষ্টা করে — পার্সিং, এএসটি বিল্ডিং এবং সি এর মাধ্যমে — যখন একটি প্রিপ্রসেসর — যেমন, কেবল পাঠ্য বা টোকেন প্রতিস্থাপন ব্যবহার করে না।
জন পূর্ব

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

5

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

আর একটি পার্থক্য হ'ল টেমপ্লেটগুলি সম্মান নেমস্পেসগুলি।


2

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

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