পদ্ধতি কি সিনট্যাকটিক চিনির চেয়ে বেশি কিছু বোঝাচ্ছে? [বন্ধ]


19

পদ্ধতি কি একধরণের বহুতল চাপ বোঝাচ্ছে? আমার কাছে মনে হয় কেবল একই নাম এবং বিভিন্ন পরামিতিগুলির সাথে পদ্ধতিগুলির পার্থক্য seems সুতরাং stuff(Thing t)এবং stuff(Thing t, int n)যতদূর কম্পাইলার হিসাবে সম্পূর্ণরূপে বিভিন্ন পদ্ধতি এবং রানটাইম উদ্বিগ্ন।

এটি কলারের পক্ষে মায়া তৈরি করে যে এটি একই পদ্ধতি যা বিভিন্ন ধরণের অবজেক্টগুলিতে আলাদাভাবে কাজ করে - বহুবিজ্ঞান। তবে এটি কেবল একটি বিভ্রম, কারণ বাস্তবে stuff(Thing t)এবং stuff(Thing t, int n)সম্পূর্ণ ভিন্ন পদ্ধতি।

পদ্ধতি কি সিনট্যাকটিক চিনির চেয়ে বেশি কিছু বোঝাচ্ছে? আমি কিছু অনুপস্থিত করছি?


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

একটি শ্রেণি বিবেচনা করুন:

class Reader {
    public String read(Book b){
        // .. translate the book to text
    }
    public String read(File b){
        // .. translate the file to text
    }
}

এখন এই শ্রেণিটি ব্যবহার করে এমন অন্য শ্রেণি বিবেচনা করুন:

/* might not be the best example */
class FileProcessor {
    Reader reader = new Reader();
    public void process(File file){
        String text = reader.read(file);
        // .. do stuff with the text
    }
}

ঠিক আছে. এখন দেখা যাক আমরা যদি নিয়মিত পদ্ধতিতে ওভারলোডিং পদ্ধতিটি প্রতিস্থাপন করি তবে কী পরিবর্তন করতে হবে:

readপদ্ধতি Readerপরিবর্তন readBook(Book)এবং readFile(file)। কেবল তাদের নাম পরিবর্তন করার বিষয়।

কলিং কোডটি FileProcessorকিছুটা reader.read(file)পরিবর্তিত হয় : এতে পরিবর্তন হয় reader.readFile(file)

এবং এটাই.

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

আমি আপনার আপত্তি শুনতে চাই যদি আপনার কিছু থাকে, সম্ভবত আমি কিছু মিস করছি।


48
শেষ পর্যন্ত, যে কোনও প্রোগ্রামিং ভাষার বৈশিষ্ট্য হ'ল কাঁচা সমাবেশকারীর জন্য সিনট্যাকটিক চিনি।
ফিলিপ

31
@ ফিলিপ: দুঃখিত, তবে এটি সত্যিই বোকামির বক্তব্য। প্রোগ্রামিং ভাষাগুলি সিনট্যাক্স থেকে নয়, শব্দার্থতত্ত্ব থেকে তাদের দরকারীতা অর্জন করে their একটি টাইপ সিস্টেমের মতো বৈশিষ্ট্যগুলি আপনাকে প্রকৃত গ্যারান্টি দেয়, যদিও এগুলিতে আপনাকে আরও বেশি লেখার প্রয়োজন হতে পারে ।
back2dos

3
নিজেকে জিজ্ঞাসা করুন: অপারেটর কি কেবল সিনট্যাকটিক চিনির ওভারলোড করছে? এই প্রশ্নের যেই উত্তর আপনি সত্য রাখেন তা হ'ল আপনার জিজ্ঞাসা করা প্রশ্নেরও উত্তর;)
back2dos

5
@ back2dos: সম্পূর্ণরূপে আপনার সাথে একমত। "সমস্ত কিছু কেবল এসেম্বলারের জন্য কেবল সিনট্যাকটিক চিনি" বাক্যটি খুব বেশিবার পড়েছি এবং এটি স্পষ্টতই ভুল। সিনট্যাকটিক চিনি কিছু বিদ্যমান সিনট্যাক্সের জন্য একটি বিকল্প (সম্ভবত ভাল) সংশ্লেষ যা কোনও নতুন শব্দার্থবিজ্ঞান যুক্ত করে না।
জর্জিও

6
@ জর্জিও: ঠিক! ম্যাথিয়াস ফেলেলিসেনের অভিব্যক্তি সম্পর্কিত ল্যান্ডমার্ক পেপারে একটি সুনির্দিষ্ট সংজ্ঞা রয়েছে। মূলত: সিনট্যাকটিক চিনি খাঁটি স্থানীয়। ভাষা বৈশিষ্ট্যটির ব্যবহার অপসারণ করতে যদি আপনাকে প্রোগ্রামটির বৈশ্বিক কাঠামো পরিবর্তন করতে হয় তবে তা সিনট্যাকটিক চিনির নয়। অর্থাত প্রতীকী ভাষান্তর মধ্যে বহুরুপী OO যেমন পণ্য কোড rewriting সাধারণত বিশ্বব্যাপী প্রেরণ যুক্তিবিজ্ঞান, যা যোগ জড়িত না বিশুদ্ধরূপে স্থানীয়, তাই OO যেমন পণ্য হয় না "প্রতীকী ভাষান্তর মাত্র অন্বিত চিনি"।
জার্গ ডব্লু মিটাগ

উত্তর:


29

এর উত্তর দিতে আপনার প্রথমে "সিনট্যাকটিক চিনি" এর একটি সংজ্ঞা প্রয়োজন। আমি উইকিপিডিয়ার সাথে যাব :

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

[...]

বিশেষত, কোনও ভাষায় কোনও নির্মাণকে সিনট্যাকটিক চিনি বলা হয় যদি ভাষাটি কী করতে পারে তার কোনও প্রভাব ছাড়াই ভাষা থেকে তা সরানো যেতে পারে

সুতরাং, এই সংজ্ঞা অনুসারে, জাভা এর ভারার্গস বা স্কালার বোধগম্যতার মতো বৈশিষ্ট্যগুলি সিনট্যাক্টিক চিনিরূপ: এগুলি অন্তর্নিহিত ভাষার বৈশিষ্ট্যগুলিতে অনুবাদ করে (প্রথম ক্ষেত্রে একটি অ্যারে, দ্বিতীয়টিতে মানচিত্র / ফ্ল্যাটম্যাপ / ফিল্টারে কল করে) এবং সেগুলি সরিয়ে ফেলতে পারে ভাষার সাথে আপনি যে জিনিসগুলি করতে পারেন তা পরিবর্তন করবেন না।

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

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


22
ওভারলোডিং সরানো ভাষা কী করতে পারে তা বদলাবে না। আপনি এখনও আগের মতো ঠিক একই জিনিস করতে পারেন; আপনাকে কেবল কয়েকটি পদ্ধতির নাম পরিবর্তন করতে হবে। এটি ডিজুগারিং লুপগুলির চেয়ে আরও তুচ্ছ পরিবর্তন।
ডোভাল

9
যেমনটি আমি বলেছি, আপনি এই পদ্ধতিটি গ্রহণ করতে পারেন যে সমস্ত ভাষা (মেশিনের ভাষা সহ) কেবলমাত্র একটি টুরিং মেশিনের শীর্ষে সিন্টেক্সটিক চিনি।
কেডিগ্রিগরি

9
আমি এটা পদ্ধতি ওভারলোডিং দেখতে কেবল আপনি করতে দেয় sum(numbersArray)এবং sum(numbersList)পরিবর্তে sumArray(numbersArray)এবং sumList(numbersList)। আমি ডোভালের সাথে একমত, এটি নিছক সিনট্যাটিক চিনির মতো বলে মনে হচ্ছে।
আভিভ কোহন

3
বেশিরভাগ ভাষা। বাস্তবায়নের চেষ্টা instanceof, ক্লাস, উত্তরাধিকার, ইন্টারফেস, জেনেরিক্স, প্রতিফলন বা অ্যাক্সেস নির্দিষ্টকরী ব্যবহার if, whileএবং বুলিয়ান অপারেটরদের সঙ্গে সঠিক একই শব্দার্থবিদ্যা । কোন কোন ক্ষেত্রে। দ্রষ্টব্য যে আমি আপনাকে সেই সমস্ত নির্মাণগুলির নির্দিষ্ট ব্যবহার হিসাবে একই জিনিসগুলি গণনা করতে চ্যালেঞ্জ দিচ্ছি না। আমি ইতিমধ্যে জানি আপনি বুলিয়ান লজিক এবং ব্রাঞ্চিং / লুপিং ব্যবহার করে যে কোনও কিছু গণনা করতে পারেন। আমি আপনাকে সেই ভাষা বৈশিষ্ট্যগুলির শব্দার্থবিজ্ঞানের নিখুঁত অনুলিপিগুলি প্রয়োগ করতে বলছি, তারা যে কোনও স্থিতিশীল গ্যারান্টি সরবরাহ করে (সংকলনের সময় চেকগুলি অবশ্যই কম্পাইল সময়ে করা উচিত))
দোভাল

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

13

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

for(Object alpha: alphas) {
}

হয়ে:

for(Iterator<Object> iter = alpha.iterator(); iter.hasNext()) {
   alpha = iter.next();
}

অথবা পরিবর্তনশীল যুক্তি সহ একটি ফাংশন নিন:

void foo(int... args);

foo(3, 4, 5);

যা হয়ে:

void Foo(int[] args);

foo(new int[]{3, 4, 5});

সুতরাং অন্যান্য বৈশিষ্ট্যের ক্ষেত্রে বৈশিষ্ট্যটি প্রয়োগ করতে সিনট্যাক্সের একটি তুচ্ছ বিকল্প রয়েছে subst

আসুন পদ্ধতি ওভারলোডিং তাকান।

void foo(int a);
void foo(double b);

foo(4.5);

এটি আবার লিখতে পারেন:

void foo_int(int a);
void foo_double(double b);

foo_double(4.5);

তবে এটি তার সমতুল্য নয়। জাভা মডেলের মধ্যে এটি কিছু আলাদা। foo(int a)তৈরি করা কোনও foo_intফাংশন বাস্তবায়ন করে না । অস্পষ্ট ফাংশনগুলি মজার নাম দিয়ে জাভা পদ্ধতি ওভারলোডিং বাস্তবায়ন করে না। সিনট্যাকটিক চিনি হিসাবে গণনা করার জন্য, জাভা আপনাকে ভেবে দেখাতে হবে যে আপনি সত্যই লিখেছেন foo_intএবং foo_doubleএটি কাজ করে তবে তা হয় না।


2
আমি মনে করি না যে কেউ কখনও বলেনি সিনট্যাক্স চিনির রূপান্তরকে তুচ্ছ হতে হবে। এমনকি যদি তা হয় তবে আমি But, the transformation isn't trivial. At the least, you have to determine the types of the parameters.দাবিটিটি খুব স্কেচী বলে মনে করি কারণ প্রকারগুলি নির্ধারণের প্রয়োজন হয় না ; তারা সংকলন সময়ে পরিচিত হয়।
ডোভাল

3
"সিনট্যাকটিক চিনির হিসাবে গণনা করতে জাভাটিকে ভান করতে হবে যে আপনি সত্যই foo_int এবং foo_double ফাংশন লিখেছেন তবে তা হয় না।" - যতক্ষণ না আমরা ওভারলোডিং পদ্ধতিগুলি এবং বহুবিজ্ঞানের কথা না বলি foo(int)/ foo(double)এবং foo_int/ এর মধ্যে তফাত কী হবে foo_double? আমি জাভা সত্যিই খুব ভাল জানি না তবে আমি কল্পনা করব যে এই জাতীয় নামকরণটি সত্যিই JVM- এ ঘটে (ভাল - সম্ভবত foo(args)তারপরে ব্যবহার করা foo_args- এটি কমপক্ষে সি ++ এ প্রতীক ম্যাংলিং সহ করে (ঠিক আছে - প্রতীক ম্যাঙ্গলিং প্রযুক্তিগতভাবে একটি বাস্তবায়ন বিশদ এবং অংশ নয় ভাষার)
ম্যাকিয়েজ পাইচোটকা

2
@ ডোভাল: "আমি মনে করি না যে কেউ কখনও বলেনি যে সিনট্যাক্স চিনির রূপান্তর তুচ্ছ হতে হবে।" - সত্য, তবে এটি স্থানীয় হতে হবে । সিনট্যাকটিক চিনির একমাত্র দরকারী সংজ্ঞাটি হ'ল ভাষা প্রকাশের বিষয়ে ম্যাথিয়াস ফেলেলিসেনের বিখ্যাত কাগজ থেকে এবং মূলত এটি বলে যে আপনি যদি ভাষা L + y তে লিখিত একটি প্রোগ্রাম পুনরায় লিখতে পারেন তবে (কিছু ভাষা এল এর সাথে কিছু বৈশিষ্ট্য y ) ভাষা এল (অর্থাত্ এই ভাষার একটি উপসেট y না করে ) প্রোগ্রামটির বিশ্বব্যাপী কাঠামো পরিবর্তন না করে (অর্থাত্ কেবল স্থানীয় পরিবর্তনগুলি করা হয়), তারপরে Y + L + y তে সিনট্যাকটিক চিনির মতো এবং
Jörg ডব্লু মিট্টাগ

2
এল এর অভিব্যক্তি বৃদ্ধি না যাইহোক, যদি আপনি করতে পারবেন না যে, কি অর্থাত আপনি আপনার প্রোগ্রাম বিশ্বব্যাপী কাঠামো পরিবর্তন করতে থাকে তাহলে এটা না অন্বিত চিনি এবং না আসলে করতে মধ্যে এল + Y চেয়ে বেশি ভাবপূর্ণ এল । উদাহরণস্বরূপ, বর্ধিত forলুপ সহ জাভা এটি ছাড়া জাভার চেয়ে বেশি ভাবপূর্ণ নয়। (এটি আরও সুন্দর, আরও সংক্ষিপ্ত, আরও পঠনযোগ্য এবং আরও ভাল, আমি যুক্তি দিয়ে বলব, তবে বেশি ভাবপূর্ণ নয় )) যদিও ওভারলোডিংয়ের বিষয়টি সম্পর্কে আমি নিশ্চিত নই। নিশ্চিত হওয়ার জন্য আমাকে সম্ভবত কাগজটি পুনরায় পড়তে হবে। আমার অন্ত্রে বলে যে এটি সিনট্যাকটিক চিনি, তবে আমি নিশ্চিত নই।
Jörg ডব্লু মিট্টাগ

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

8

নাম-ম্যাংলিংয়ের কাজটি দেওয়া, এটি কি সিনট্যাকটিক চিনির চেয়ে বেশি কিছু হওয়ার দরকার নেই?

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

দুর্ভাগ্যক্রমে, আমি কোনও ভাষা এটি করতে দেখিনি। যখন অস্পষ্টতা থাকে, তখন এই সংকলকগুলি এটি সমাধান করে না, তারা লেখককে তাদের জন্য এটি সমাধান করার জন্য জোর দেয়।


আপনি যে বৈশিষ্ট্যটির সন্ধান করছেন সেখানে "একাধিক প্রেরণ" বলা হয়। হাস্কেল, স্কেলা এবং (৪.০ থেকে) সি # সহ প্রচুর ভাষাগুলি এটিকে সমর্থন করে।
আইয়েন

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

2
আমার মনে হয় আপনি ভুল বুঝেছেন। উদাহরণস্বরূপ, সি # তে, যদি কোনও পদ্ধতির পরামিতিগুলির একটি হয় dynamicতবে ওভারলোড রেজোলিউশন রানটাইম সময়ে ঘটে যায়, সংকলন-সময়ে নয় । একাধিক প্রেরণ এটি হ'ল এবং এটি ফাংশনগুলির নাম পরিবর্তন করে প্রতিলিপি করা যায় না।
আইয়েন

মোটামুটি ভালোই. আমি এখনও ভেরিয়েবল টাইপের জন্য পরীক্ষা করতে পারি, তবে এটি সিনট্যাকটিক চিনির উপর আবৃত কেবল একটি বিল্ট-ইন ফাংশন। এটি একটি ভাষার বৈশিষ্ট্য, তবে কেবল সবেমাত্র।
জন জে ওবারমার্ক

7

ভাষার উপর নির্ভর করে এটি সিনট্যাকটিক চিনি কিনা।

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

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


আমি নিশ্চিত নই যে প্রয়োজনীয় উত্তরগুলি যখন অন্য উত্তরগুলি কীভাবে আরও বেশি ভাল করে চলেছে।
টেলাস্টিন

5

সমসাময়িক ভাষার জন্য, এটি কেবল সিনট্যাকটিক চিনি; সম্পূর্ণ ভাষা-অজ্ঞাতসৃষ্টিক পদ্ধতিতে এটি এর চেয়ে বেশি।

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

এটি কেন বেশি হওয়া উচিত তা এখানে।

এমন একটি ভাষা বিবেচনা করুন যা উভয় পদ্ধতির ওভারলোডিং এবং টাইপযুক্ত ভেরিয়েবলগুলিকে সমর্থন করে। আপনি নিম্নলিখিত পদ্ধতি প্রোটোটাইপ থাকতে পারে:

bool someFunction(int arg);

bool someFunction(string arg);

কিছু ভাষায়, সংকলনের সময় আপনি সম্ভবত কোডটির একটি রেখার দ্বারা কোনটিকে ডাকা হবে তা জানার জন্য পদত্যাগ করা হবে। তবে কিছু ভাষায়, সমস্ত ভেরিয়েবল টাইপ করা হয় না (বা এগুলি সমস্ত স্পষ্টভাবে টাইপ করা হয় Objectবা যাই হোক না কেন), সুতরাং এমন একটি অভিধান তৈরির কল্পনা করুন যার কীগুলি বিভিন্ন ধরণের মানগুলির মানচিত্র:

dict roomNumber; // some hotels use numbers, some use letters, and some use
                 // alphanumerical strings.  In some languages, built-in dictionary
                 // types automatically use untyped values for their keys to map to,
                 // so it makes more sense then to allow for both ints and strings in
                 // your code.

এখন, আপনি যদি someFunctionসেই রুম নম্বরগুলির মধ্যে একটিতে আবেদন করতে চান? আপনি এটি কল:

someFunction(roomNumber[someSortOfKey]);

হয় someFunction(int)বলা হয়, অথবা যখন someFunction(string)বলা হয়? এখানে আপনি একটি উদাহরণ দেখুন যেখানে এগুলি সম্পূর্ণরূপে অर्थোগোনাল পদ্ধতি নয়, বিশেষত উচ্চ-স্তরের ভাষাগুলিতে। ভাষাটি খুঁজে বের করতে হবে - রানটাইমের সময় - এর মধ্যে কোনটি কল করা উচিত তাই এখনও এগুলিকে অন্তত কিছুটা একই পদ্ধতি হিসাবে বিবেচনা করতে হবে।

কেন কেবল টেমপ্লেট ব্যবহার করবেন না? কেন কেবল একটি টাইপযুক্ত যুক্তি ব্যবহার করবেন না?

নমনীয়তা এবং সূক্ষ্ম-দানাদার নিয়ন্ত্রণ। কখনও কখনও টেমপ্লেট ব্যবহার / টাইপযুক্ত আর্গুমেন্ট একটি ভাল পদ্ধতির হয়, কিন্তু কখনও কখনও তারা না।

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

তাহলে কি এই পরবর্তী উদাহরণটি খারাপ প্রোগ্রামিং অনুশীলন?

bool stringIsTrue(int arg)
{
    if (arg.toString() == "0")
    {
        return false;
    }
    else
    {
        return true;
    }
}

bool stringIsTrue(Object arg)
{
    if (arg.toString() == "0")
    {
        return false;
    }
    else
    {
        return true;
    }
}

bool stringIsTrue(string arg)
{
    if (arg == "0")
    {
        return false;
    }
    else
    {
        return true;
    }
}

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

bool stringIsTrue(untyped arg)
{
    if (arg.toString() == "0")
    {
        return false;
    }
    else
    {
        return true;
    }
}

তবে যদি আপনার কেবলমাত্র intএস এবং stringএসগুলির জন্য এটি ব্যবহারের প্রয়োজন হয় এবং আপনি যদি সেই অনুসারে সহজ বা আরও জটিল অবস্থার উপর ভিত্তি করে সত্যটি ফিরে আসতে চান তবে কি হবে? তারপরে আপনার ওভারলোডিং ব্যবহারের ভাল কারণ রয়েছে:

bool appearsToBeFirstFloor(int arg)
{
    if (arg.digitAt(0) == 1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool appearsToBeFirstFloor(string arg)
{
    string firstCharacter = arg.characterAt(0);
    if (firstCharacter.isDigit())
    {
        return appearsToBeFirstFloor(int(firstCharacter));
    }
    else if (firstCharacter.toUpper() == "A")
    {
        return true;
    }
    else
    {
        return false;
    }
}

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

কারণ, যেমন আগেই বলা হয়েছে, কিছু হোটেল সংখ্যা ব্যবহার করে, কিছু ব্যবহার করে চিঠি এবং কিছু সংখ্যক এবং বর্ণের মিশ্রণ ব্যবহার করে:

appearsToBeFirstFloor(roomNumber[someSortOfKey]);

// will treat ints and strings differently, without you having to write extra code
// every single spot where the function is being called

এটি এখনও বাস্তব জীবনে আমি যে সঠিক কোডটি ব্যবহার করব ঠিক তেমনটি নয় তবে এটি যে পয়েন্টটি ঠিক ঠিক করছি তা তুলে ধরা উচিত।

তবে ... এটি কেন সমসাময়িক ভাষাগুলিতে সিনট্যাকটিক চিনির চেয়ে বেশি নয়।

ফ্যালকো মন্তব্যগুলিতে এই বক্তব্যটি উত্থাপন করেছিলেন যে বর্তমান ভাষা মূলত একই পদক্ষেপের মধ্যে পদ্ধতি ওভারলোডিং এবং গতিশীল ফাংশন নির্বাচনকে মেশায় না। আমি কিছু ভাষা নির্দিষ্টভাবে কাজ করার জন্য যেভাবে বুঝেছিলাম তা হ'ল আপনি appearsToBeFirstFloorউপরের উদাহরণে ওভারলোড করতে পারবেন এবং তারপরে ভাষাটি টাইপ করা চলকটির রানটাইম মানের উপর নির্ভর করে ফাংশনের কোন সংস্করণটি ডাকা হবে তা রানটাইম সময়ে নির্ধারণ করবে। এই বিভ্রান্তিটি অ্যাকশনস্ক্রিপ্ট ৩.০ এর মতো ইসিএমএ-প্রকারের ভাষাগুলির সাথে কাজ করে আংশিকভাবে উদ্ভূত হয়েছিল, যার ফলে আপনি সহজেই এলোমেলো করতে পারবেন কোন ফাংশনটি রানটাইমের সময় কোডের একটি নির্দিষ্ট লাইনে ডাকা হয়।

আপনি জানেন যে, অ্যাকশনস্ক্রিপ্ট 3 পদ্ধতি ওভারলোডিং সমর্থন করে না। ভিবি.এনইটি হিসাবে, আপনি কোনও প্রকার স্পষ্টভাবে বরাদ্দ না করে ভেরিয়েবলগুলি ডিক্লেয়ার এবং সেট করতে পারেন, তবে আপনি যখন ওভারলোডেড পদ্ধতিতে এই ভেরিয়েবলগুলি আর্গুমেন্ট হিসাবে পাস করার চেষ্টা করেন, তখনও কোন পদ্ধতিটি কল করতে হবে তা নির্ধারণ করার জন্য এটি রানটাইম মানটি পড়তে চায় না; পরিবর্তে এটি টাইপ Objectবা কোনও প্রকারের বা অন্য কোনও জাতীয় আর্গুমেন্ট সহ একটি পদ্ধতি খুঁজে পেতে চায় । সুতরাং উপরের intবনাম stringউদাহরণটি সেই ভাষাতেও কাজ করবে না। সি ++ এর মতোই সমস্যা রয়েছে, আপনি যখন কোনও শূন্য পয়েন্টার বা অন্য কোনও প্রক্রিয়া জাতীয় কিছু ব্যবহার করেন, তখনো আপনাকে সঙ্কলন করার সময় টাইপটি ম্যানুয়ালি বিচ্ছিন্ন করা প্রয়োজন।

প্রথম শিরোনামটি যেমন বলে ...

সমসাময়িক ভাষার জন্য, এটি কেবল সিনট্যাকটিক চিনি; সম্পূর্ণ ভাষা-অজ্ঞাতসৃষ্টিক পদ্ধতিতে এটি এর চেয়ে বেশি। পদ্ধতির ওভারলোডিংকে আরও দরকারী এবং প্রাসঙ্গিক তৈরি করা, যেমন উপরের উদাহরণের মতো, একটি বিদ্যমান ভাষার সাথে যুক্ত করার জন্য প্রকৃতপক্ষে একটি ভাল বৈশিষ্ট্য হতে পারে (যেমন AS3 এর জন্য বিস্তৃতভাবে অনুরোধ করা হয়েছে), বা এটি বিভিন্ন বিভিন্ন মৌলিক স্তম্ভগুলির মধ্যে একটি হিসাবে কাজ করতে পারে একটি নতুন পদ্ধতিগত / অবজেক্ট-ভিত্তিক ভাষা তৈরি করা।


3
রানওটাইমে ফাংশন-ডিসপ্যাচ পরিচালনা করে এবং সংকলন-সময় নয় এমন কোনও ভাষার নামকরণ করতে পারেন? আমি জানি সমস্ত ভাষাগুলির জন্য কোন ফাংশনটি বলা হয় তার সংকলন-সময়ের নির্দিষ্টতা প্রয়োজন ...
ফ্যালকো ২

@ ফ্যালকো অ্যাকশনস্ক্রিপ্ট 3.0 রানটাইম এটিকে পরিচালনা করে। আপনি, উদাহরণস্বরূপ, একটি ফাংশন ব্যবহার করতে পারে যে আয় র্যান্ডম তিনটি স্ট্রিং এক, এবং তারপর তার আগমন মান ব্যবহার এলোমেলোভাবে তিনটি কার্যকারিতা যে কোনো একটি কল করতে: this[chooseFunctionNameAtRandom](); যদি chooseFunctionNameAtRandom()আয় হয় "punch", "kick"অথবা "dodge", তাহলে আপনি thusly একটি খুব সহজ র্যান্ডম বাস্তবায়ন করতে পারে উদাহরণস্বরূপ, ফ্ল্যাশ গেমটিতে শত্রুর এআই উপাদান রয়েছে।
পানজিরসিসিস

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

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

1
উত্তরটি থাকতে দিন, উত্তরের মন্তব্যগুলি থেকে আপনার কিছু গবেষণা অন্তর্ভুক্ত করার বিষয়ে ভাবুন?
ফ্যালকো

2

এটি সত্যই আপনার "সিনট্যাকটিক চিনির" সংজ্ঞা দ্বারা নির্ভর করে। আমি আমার মনে যে সংজ্ঞা সংঘটিত হয়েছে তার কয়েকটি সম্বোধন করার চেষ্টা করব:

  1. একটি বৈশিষ্ট্যটি সিনট্যাকটিক চিনির হয় যখন কোনও প্রোগ্রাম যা এটি ব্যবহার করে তা বৈশিষ্ট্যটি ব্যবহার করে না এমন কোনও ক্ষেত্রে সর্বদা অনুবাদ করা যায়।

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

  2. সংজ্ঞা 1 হিসাবে একই কিন্তু অতিরিক্ত প্রয়োজন যে অনূদিত প্রোগ্রাম টাইপ-নিরাপদ প্রথম, অর্থাত desugaring আপনি তথ্য যে কোন ধরণের আলগা না দ্বারা হিসাবে হিসাবে সঙ্গে।

  3. ও.পি. এর সংজ্ঞা: একটি বৈশিষ্ট্যটি সিনট্যাকটিক চিনির হয় যদি এর অনুবাদ প্রোগ্রামটির কাঠামো পরিবর্তন না করে তবে কেবল "স্থানীয় পরিবর্তন" প্রয়োজন।

আসুন ওভারলোডিংয়ের উদাহরণ হিসাবে হাসেলকে নেওয়া যাক। হাস্কেল প্রকার শ্রেণীর মাধ্যমে ব্যবহারকারী-সংজ্ঞায়িত ওভারলোডিং সরবরাহ করে। উদাহরণস্বরূপ +এবং *অপারেশনগুলি Numটাইপ শ্রেণিতে সংজ্ঞায়িত করা হয় এবং যে কোনও ধরণের যে কোনও শ্রেণীর একটি (সম্পূর্ণ) উদাহরণ ব্যবহার করা যেতে পারে +। উদাহরণ স্বরূপ:

instance Num a => Num (b, a) where
    (x, y) + (_, y') = (x, y + y')
    -- other definitions

("Hello", 1) + ("World", 3) -- -> ("Hello", 4)

হাস্কেলের ধরণের শ্রেণি সম্পর্কে একটি সুপরিচিত বিষয় হ'ল আপনি সেগুলি থেকে মুক্তি পেতে পারেন । অর্থাৎ আপনি এমন কোনও প্রোগ্রাম অনুবাদ করতে পারেন যা সমতুল্য প্রোগ্রামে টাইপ ক্লাস ব্যবহার করে যা সেগুলি ব্যবহার করে না।

অনুবাদটি বেশ সহজ:

  • শ্রেণীর সংজ্ঞা দেওয়া হয়েছে:

    class (P_1 a, ..., P_n a) => X a where
        op_1 :: t_1   ... op_m :: t_m
    

    আপনি এটি একটি বীজগণিত তথ্য টাইপ অনুবাদ করতে পারেন:

    data X a = X {
        X_P_1 :: P_1 a, ... X_P_n :: P_n a,
        X_op_1 :: t_1, ..., X_op_m :: t_m
    }
    

    এখানে X_P_iএবং X_op_iহয় নির্বাচকরা । উদাহরণস্বরূপ, মান X aপ্রয়োগ X_P_1করে এমন একটি মান দেওয়া হয় যা সেই ক্ষেত্রে সঞ্চিত মানটি ফিরিয়ে দেবে, সুতরাং এগুলি X a -> P_i a(বা X a -> t_i) প্রকারের ফাংশনগুলি হয় ।

    একটি জন্য খুব রুক্ষ anology আপনি টাইপ মান মনে হতে পারে X aযেমন structs এবং তারপর যদি xধরনের হয় X aএক্সপ্রেশন:

    X_P_1 x
    X_op_1 x
    

    হিসাবে দেখা যেতে পারে:

    x.X_P_1
    x.X_op_1
    

    (নামযুক্ত ক্ষেত্রগুলির পরিবর্তে কেবলমাত্র অবস্থানিক ক্ষেত্রগুলি ব্যবহার করা সহজ তবে নামযুক্ত ক্ষেত্রগুলি উদাহরণগুলিতে পরিচালনা করা এবং কিছু বয়লার-প্লেট কোড এড়ানো সহজ)

  • একটি উদাহরণ ঘোষণা দেওয়া:

    instance (C_1 a_1, ..., C_n a_n) => X (T a_1 ... a_n) where
        op_1 = ...; ...;  op_m = ...
    

    আপনি এটিকে কোনও ফাংশনে অনুবাদ করতে পারেন যা C_1 a_1, ..., C_n a_nক্লাসগুলির জন্য অভিধানগুলি টাইপের X aজন্য একটি অভিধান মান (অর্থাত্ টাইপের একটি মান ) দেয় T a_1 ... a_n

    অন্য কথায় উপরের উদাহরণটি কোনও ফাংশনে অনুবাদ করা যেতে পারে:

    f :: C_1 a_1 -> ... -> C_n a_n -> X (T a_1 ... a_n)
    

    (নোট যে nহতে পারে 0)।

    এবং প্রকৃতপক্ষে আমরা এটিকে সংজ্ঞায়িত করতে পারি:

    f c1 ... cN = X {X_P_1=get_P_1_T, X_P_n=get_P_n_T,
                     X_op_1=op_1, ..., X_op_m=op_m}
        where
            op_1 = ...
            ...
            op_m = ...
    

    যেখানে op_1 = ...থেকে op_m = ...সংজ্ঞা পাওয়া যায় instanceঘোষণার get_P_i_Tফাংশন দ্বারা সংজ্ঞায়িত করা হয় P_iদৃষ্টান্ত Tপ্রকার (এই কারণ বিদ্যমান থাকা আবশ্যক P_is এর superclasses হয় X)।

  • একটি অতিরিক্ত লোড ফাংশনে একটি কল দেওয়া হয়েছে:

    add :: Num a => a -> a -> a
    add x y = x + y
    

    আমরা ক্লাসের সীমাবদ্ধতার সাথে সম্পর্কিত অভিধানগুলি স্পষ্টভাবে পাস করতে পারি এবং সমমানের কল পেতে পারি:

    add :: Num a -> a -> a -> a
    add dictNum x y = ((+) dictNum) x y
    

    ক্লাসের সীমাবদ্ধতাগুলি কীভাবে সহজভাবে একটি নতুন যুক্তিতে পরিণত হয়েছে তা নোট করুন। +অনুবাদ প্রোগ্রামে নির্বাচকের আগে ব্যাখ্যা করা হয়। অন্য কথায় অনুবাদকৃত addফাংশন, অভিধানটিকে এর আর্গুমেন্টের ধরণের জন্য প্রদত্ত প্রথমে ব্যবহারের ফলে ফলাফলটি গণনা করার জন্য আসল ফাংশনটি "আনপ্যাক" (+) dictNumকরবে এবং তারপরে এই ফাংশনটি আর্গুমেন্টগুলিতে প্রয়োগ করবে।

এটি পুরো বিষয়টি সম্পর্কে খুব দ্রুত স্কেচ। আপনি যদি আগ্রহী হন তবে আপনার সাইমন পিটন জোন্স এট আলের নিবন্ধগুলি পড়তে হবে।

আমি বিশ্বাস করি অন্য ভাষাগুলিতেও ওভারলোডিংয়ের জন্য অনুরূপ পদ্ধতির ব্যবহার করা যেতে পারে।

তবে এটি দেখায় যে, সিনট্যাকটিক চিনির আপনার সংজ্ঞাটি যদি (1) হয় তবে ওভারলোডিং সিনট্যাকটিক চিনি । কারণ আপনি এ থেকে মুক্তি পেতে পারেন।

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

হিসাবে (3)। উত্তরটি হ্যাঁ বা না-এর উচিত কিনা আমি জানি না।

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

আমি হ্যাঁ বলব কারণ দুটি প্রোগ্রাম এখনও একের পর এক মানচিত্র করে, তাই "কাঠামো" আসলে এতটা পরিবর্তিত হয় নি।


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

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


2

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

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

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

জাভাতে আপনি এটিকে কেবল একটি সুবিধার্থী হিসাবে বিবেচনা করে বিবেচনা করতে পারেন উদাহরণস্বরূপ সেখানে কতগুলি ওভারলোড রয়েছে PrintStream.printএবং PrintStream.println। তবে তখন অনেকগুলি DataInputStream.readXপদ্ধতি রয়েছে যেহেতু জাভা রিটার্নের ধরণের উপরে ওভারলোড করে না, তাই কিছু দিক থেকে এটি কেবল সুবিধার জন্য। এগুলি সমস্ত আদিম ধরণের জন্য।

আমার মনে আছে না জাভা কিছু ঘটে তাহলে আমি ক্লাস আছে Aএবং Bব্যাপ্ত O, আমি পদ্ধতি জমিদার foo(O), foo(A)এবং foo(B)একটি জেনেরিক, এবং তারপর <T extends O>আমি ফোন foo(t)যেখানে tএকটি দৃষ্টান্ত হল T। কেস যেখানে ইন Tহয় Aআমি জমিদার উপর ভিত্তি করে প্রেরণ পেতে পারি অথবা এটি যদি আমি নামক হিসাবে foo(O)?

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


জাভাতে, ওভারলোডগুলি সংকলনের সময়ে সমাধান করা হয়। প্রকার মুছে ফেলার ব্যবহারটি দেওয়া, তাদের পক্ষে অন্যথায় হওয়া অসম্ভব। উপরন্তু, এমনকি টাইপ ইরেজিওর ছাড়া, যদি T:Animalটাইপ করা হয় SiameseCatএবং বিদ্যমান overloads হয় Cat Foo(Animal), SiameseCat Foo(Cat)এবং Animal Foo(SiameseCat)যা জমিদার যদি নির্বাচন করতে হবে Tহয় SiameseCat?
সুপারক্যাট

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

পদ্ধতিগুলিতে alচ্ছিক যুক্তি থাকলে ওভারলোডগুলি সহায়ক হতে পারে তবে সেগুলি বিপজ্জনকও হতে পারে। মনে করুন লাইনটি long foo=Math.round(bar*1.0001)*5পরিবর্তিত হয়ে গেছে long foo=Math.round(bar)*5barসমান, উদাহরণস্বরূপ, 123456789L হলে এটি কীভাবে শব্দার্থকে প্রভাবিত করবে ?
সুপারক্যাট

@supercat আমি বাস্তব বিপদ তর্ক করা চাই থেকে অন্তর্নিহিত রূপান্তর আছে longকরার double
ডোভাল

@ ডোভাল: টু double?
সুপারক্যাট

1

দেখে মনে হচ্ছে "সিনট্যাকটিক চিনির" অযথাযুক্ত বা অবুঝ মত der এজন্য প্রশ্নটি অনেক নেতিবাচক উত্তরকে ট্রিগার করে।

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

একই প্যাকেজ নাম প্রযোজ্য। স্ট্রিং জাভা.লং.স্ট্রিংয়ের জন্য কেবল সিনট্যাকটিক চিনি।

আসলে, একটি পদ্ধতি মত

void fun(int i, String c);

ক্লাসে মাইক্লাসকে "মাই_প্যাকেজ_মাইক্লাস_ফুন_িন্ট_ জাভা_এলং_স্ট্রিং" এর মতো কিছু বলা উচিত। এটি পদ্ধতিটি অনন্যভাবে সনাক্ত করতে পারে। (জেভিএম অভ্যন্তরীণভাবে এরকম কিছু করে)। তবে আপনি এটি লিখতে চান না। এজন্য সংকলক আপনাকে মজা লিখতে দেবে (1, "এক") এবং এটি কোন পদ্ধতিটি তা সনাক্ত করতে পারে।

ওভারলোডিংয়ের ক্ষেত্রে আপনি যা করতে পারেন তার মধ্যে একটি জিনিস রয়েছে: আপনি যদি একই পদ্ধতিতে একই পরিমাণে তর্কগুলি ওভারলোড করেন তবে সংকলকটি স্বয়ংক্রিয়ভাবে খুঁজে বের করবে যে কোন সংস্করণটি কেবলমাত্র সমান প্রকারের সাথে নয়, একই সাথে যুক্তিগুলির সাথে মিলিয়ে দেওয়া যুক্তিটির পক্ষে সবচেয়ে উপযুক্ত its প্রদত্ত যুক্তি হ'ল ঘোষিত আর্গুমেন্টের একটি সাবক্লাস।

আপনার যদি দুটি ওভারলোডেড পদ্ধতি থাকে

addParameter(String name, Object value);
addParameter(String name, Date value);

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

অবশ্যই, আপনার অন্য পদ্ধতির সাথে এমন কোনও পদ্ধতি ওভারলোডিং এড়ানো উচিত যা সম্পূর্ণ ভিন্ন জিনিস করে।


1

মজার বিষয় হল, এই প্রশ্নের উত্তর ভাষার উপর নির্ভর করবে।

বিশেষত, ওভারলোডিং এবং জেনেরিক প্রোগ্রামিং (*) এর মধ্যে একটি মিথস্ক্রিয়া রয়েছে এবং জেনেরিক প্রোগ্রামিং কীভাবে প্রয়োগ করা হয় তার উপর নির্ভর করে এটি কেবল সিনট্যাকটিক চিনির (জং) বা একেবারে প্রয়োজনীয় (সি ++) হতে পারে।

এটি হ'ল জেনেরিক প্রোগ্রামিং যখন স্পষ্টত ইন্টারফেসের সাথে প্রয়োগ করা হয় (জং বা হাস্কেলের মধ্যে, এটি টাইপ শ্রেণি হবে), তখন ওভারলোডিং কেবল সিনট্যাকটিক চিনির; অথবা প্রকৃতপক্ষে ভাষার অংশও নাও হতে পারে।

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

(*) একবারে কোনও পদ্ধতি রচনার অর্থে ব্যবহৃত হয়, একই ধরণের বিভিন্ন ধরণের পরিচালনা করতে।


0

কিছু ভাষায় এটি নিছক সিনট্যাকটিক চিনির সন্দেহ নেই। তবে এটি কীসের চিনি তা আপনার দৃষ্টিকোণের উপর নির্ভর করে। আমি এই উত্তরটি পরে এই আলোচনাটি ছেড়ে দেব leave

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

ব্যবহারের প্রতিস্থাপন করা খুব শক্ততার একটি উদাহরণ এমন একটি ভাষা থেকে আসে যা এই বৈশিষ্ট্যটিকে "ফাংশন ওভারলোডিং" বলে না iron পরিবর্তে এটিকে "প্যাটার্ন ম্যাচিং" বলা হয় (যা ওভারলোডিংয়ের সুপারসেট হিসাবে দেখা যায় কারণ আমরা কেবল প্রকারগুলি নয় মানগুলি ওভারলোড করতে পারি)।

এখানে হাস্কেলের ফিবোনাচি ফাংশনটির ক্লাসিক নিষ্পাপ বাস্তবায়ন:

fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

তাত্ক্ষণিকভাবে তিনটি ফাংশনটি যদি অন্য কোনও ভাষায় করা হয় তবে / অন্যথায় প্রতিস্থাপন করা যেতে পারে। তবে এটি মৌলিকভাবে একেবারে সহজ সংজ্ঞা দেয়:

fib n = fib (n-1) + fib (n-2)

অনেক গণ্ডগোল করে এবং সরাসরি ফিবোনাচি অনুক্রমের গাণিতিক ধারণা প্রকাশ করেন না।

তাই কখনও কখনও এটি সিনট্যাক্স চিনির হতে পারে যদি একমাত্র ব্যবহার আপনাকে বিভিন্ন যুক্তি দিয়ে কোনও ফাংশন কল করার অনুমতি দেয়। তবে কখনও কখনও এটি এর চেয়ে অনেক বেশি মৌলিক হয়।


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

function print (string x) { stdout.print(x) };
function print (number x) { stdout.print(x.toString) };

বিকল্পভাবে হিসাবে প্রয়োগ করা যেতে পারে:

function printString (string x) {...}
function printNumber (number x) {...}

অথবা এমনকি:

function print (auto x) {
    if (x instanceof String) {...}
    if (x instanceof Number) {...}
}

অপারেটর ওভারলোডিং optionচ্ছিক আর্গুমেন্টগুলি প্রয়োগ করার জন্য চিনিও হতে পারে (কিছু ভাষায় অপারেটর ওভারলোডিং রয়েছে তবে optionচ্ছিক যুক্তি নয়):

function print (string x) {...}
function print (string x, stream io) {...}

প্রয়োগ করতে ব্যবহার করা যেতে পারে:

function print (string x, stream io=stdout) {...}

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


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

@ 11684: আপনি একটি উদাহরণ নির্দেশ করতে পারেন? আমি সত্যই হাস্কেলকে মোটেও জানি না তবে যখন আমি সেই ফাইব উদাহরণটি (ইউটিউবের কম্পিউটারফাইলে) দেখলাম তখন তার প্যাটার্নটি মিলিতভাবে দুর্দান্তভাবে মার্জিত পেয়েছিল।
slebetman

data PaymentInfo = CashOnDelivery | Adress String | UserInvoice CustomerInfoটাইপ কনস্ট্রাক্টরের সাথে প্যাটার্ন মিলতে পারে এমন একটি ডেটাটাইপ দেওয়া ।
11684

ভালো: getPayment :: PaymentInfo -> a getPayment CashOnDelivery = error "Should have been paid already" getPayment (Adress addr) = -- code to notify administration to send a bill getPayment (UserInvoice cust) = --whatever. I took the data type from a Haskell tutorial and have no idea what an invoice is। আমি আশা করি এই মন্তব্যটি কিছুটা বোধগম্য।
11684

0

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

জাভা উদাহরণ:

String s; int i;
mangle(s);  // Translates to CALL ('mangle':LString):(s)
mangle(i);  // Translates to CALL ('mangle':Lint):(i)

সুতরাং শেষ পর্যন্ত এটি অনুসন্ধানের সাথে একটি সাধারণ সংকলক-ম্যাক্রোর দ্বারা সম্পূর্ণরূপে প্রতিস্থাপন করা যেতে পারে এবং ওভারলোড হওয়া ফাংশন ম্যাঙ্গেলকে ম্যাঙ্গেল_সট্রিং এবং ম্যাঙ্গেল_িন্টের সাথে প্রতিস্থাপন করা যেতে পারে - যেহেতু যুক্তি-তালিকাটি ঘটনামূলক ফাংশন-শনাক্তকারকের অংশ এটি কার্যত যা ঘটে -> এবং সুতরাং এটি কেবল সিনট্যাকটিক চিনি।

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


0

জাভাতে তথ্য সংকলন করা হয় এবং ওভারলোডগুলির মধ্যে কোনটি বলা হয় তা সংকলনের সময় সিদ্ধান্ত নেওয়া হয়।

নীচে sun.misc.Unsafeএক্লিপের ক্লাস ফাইল সম্পাদক হিসাবে দেখা হিসাবে (অ্যাটমিক্সের জন্য ইউটিলিটি) একটি স্নিপেট রয়েছে ।

  // Method descriptor #143 (Ljava/lang/Object;I)I (deprecated)
  // Stack: 4, Locals: 3
  @java.lang.Deprecated
  public int getInt(java.lang.Object arg0, int arg1);
    0  aload_0 [this]
    1  aload_1 [arg0]
    2  iload_2 [arg1]
    3  i2l
    4  invokevirtual sun.misc.Unsafe.getInt(java.lang.Object, long) : int [231]
    7  ireturn
      Line numbers:
        [pc: 0, line: 213]

আপনি দেখতে পাচ্ছেন যে পদ্ধতিটির টাইপ তথ্য কল করা হচ্ছে (লাইন 4) কলটিতে অন্তর্ভুক্ত রয়েছে।

এর অর্থ হল যে আপনি একটি জাভা সংকলক তৈরি করতে পারেন যা টাইপ তথ্য গ্রহণ করে। উদাহরণস্বরূপ উপরের উত্সটির পরে এই জাতীয় একটি স্বরলিপি ব্যবহার করা হবে:

@Deprecated
public in getInt(Object arg0, int arg1){
     return getInt$(Object,long)(arg0, arg1);
}

এবং theালাই দীর্ঘ optionচ্ছিক হবে।

অন্যান্য স্ট্যাটিক্যালি টাইপ করা সংকলিত ভাষায় আপনি একটি অনুরূপ সেটআপ দেখতে পাবেন যেখানে সংকলক সিদ্ধান্ত নেবে যে কোন প্রকারের উপর নির্ভর করে কোন ওভারলোড ডাকা হবে এবং এটি বাইন্ডিং / কলে অন্তর্ভুক্ত করবে।

ব্যতিক্রম সি ডায়নামিক লাইব্রেরি যেখানে প্রকারের তথ্য অন্তর্ভুক্ত নয় এবং একটি ওভারলোডেড ফাংশন তৈরির চেষ্টা করার ফলে লিঙ্কার অভিযোগ করবে।

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