"ব্লুব প্যারাডক্স" এবং সি ++


37

আমি এখানে নিবন্ধটি পড়ছিলাম: http://www.paulgraham.com/avg.html এবং "ব্লব প্যারাডক্স" সম্পর্কে অংশটি বিশেষ আকর্ষণীয় ছিল। যে কেউ মূলত সি ++ তে কোড করে তবে অন্যান্য ভাষায় এক্সপোজার থাকে (বেশিরভাগ হাস্কেল) আমি এই ভাষাগুলির কয়েকটি দরকারী জিনিস সম্পর্কে অবগত যা সি ++ তে প্রতিলিপি করা শক্ত। প্রশ্নটি মূলত এমন লোকদের কাছে যারা সি ++ এবং অন্য কোনও ভাষা উভয় ক্ষেত্রেই দক্ষ, আপনি কি এমন একটি ভাষা ব্যবহার করেন যা আপনি কেবলমাত্র সি ++ এ লিখতে পারলে ধারণা বা বাস্তবায়ন করা কঠিন?

বিশেষত এই উদ্ধৃতিটি আমার দৃষ্টি আকর্ষণ করেছে:

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

যদি দেখা যায় যে সি ++ ব্যবহারের কারণে আমি "ব্লাব" প্রোগ্রামারের সমতুল্য এটি নীচের প্রশ্নটি উত্থাপন করে: আপনি অন্যান্য ভাষায় এমন কোন কার্যকর ধারণা বা কৌশল ব্যবহার করেছেন যা আপনি ধারণাকে ধারণ করতে অসুবিধাজনিত হয়ে পড়েছিলেন তবে সি ++ এ লিখছেন বা "চিন্তা" করছেন?

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

এই প্রশ্নটি "সি ++ বনাম লিস্প" বিতর্ক বা কোনও ধরণের ভাষা-যুদ্ধের বিতর্ক হওয়ার উদ্দেশ্যে নয়। এই জাতীয় একটি প্রশ্ন জিজ্ঞাসা করা একমাত্র উপায় আমি এমন জিনিসগুলি সম্পর্কে জানতে পারা সম্ভব যা আমি জানি না যা আমি জানি না।



2
আমি রাজী. এতক্ষণ এটি কোনও সি ++ বনাম লিস্প বিতর্কে পরিণত হয় না বলে আমি মনে করি এখানে কিছু শেখার আছে।
jeffythedragonslayer

@ ম্যাসনভিয়েল: there are things that other languages can do that Lisp can't- অসম্ভব, যেহেতু লিস্প টিউরিং -সম্পূর্ণ। সম্ভবত আপনি বলতে চাচ্ছেন যে কিছু জিনিস আছে যা লিস্পে করা ব্যবহারিক নয় ? যে কোনও প্রোগ্রামিং ভাষা সম্পর্কে আমি একই কথা বলতে পারি ।
রবার্ট হার্ভে

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

@ ম্যাসন হুইলার: (সত্যিই নয়।)
রবার্ট হার্ভে

উত্তর:


16

ঠিক আছে, যেহেতু আপনি হাস্কেলকে উল্লেখ করেছেন:

  1. প্যাটার্ন ম্যাচিং. আমি প্যাটার্ন মিলটি পড়তে এবং লিখতে আরও সহজ হতে পাই। মানচিত্রের সংজ্ঞাটি বিবেচনা করুন এবং কীভাবে প্যাটার্ন ম্যাচিং না করে কোনও ভাষায় এটি প্রয়োগ করা হবে সে সম্পর্কে ভাবুন।

    map :: (a -> b) -> [a] -> [b]
    map f [] = []
    map f (x:xs) = f x : map f xs
  2. টাইপ সিস্টেম। এটি কখনও কখনও ব্যথা হতে পারে তবে এটি অত্যন্ত সহায়ক। সত্যই এটি বুঝতে এবং এটিতে আপনি কী পরিমাণ বাগ পাকাল তা বুঝতে আপনাকে এটির সাথে প্রোগ্রাম করতে হবে। এছাড়াও, রেফারেন্সিয়াল স্বচ্ছতা দুর্দান্ত is এটি কেবলমাত্র হাস্কেলের প্রোগ্রামিংয়ের পরে স্পষ্ট হয়ে ওঠে যখন একটি অত্যাবশ্যক ভাষায় রাষ্ট্র পরিচালনার ফলে কতগুলি বাগ হয়।

  3. সাধারণভাবে কার্যকরী প্রোগ্রামিং। পুনরাবৃত্তির পরিবর্তে মানচিত্র এবং ভাঁজ ব্যবহার করা। Recursion। এটি উচ্চ স্তরের চিন্তাভাবনা সম্পর্কে।

  4. অলস মূল্যায়ন। আবার এটি উচ্চতর স্তরে চিন্তা করা এবং সিস্টেমটিকে মূল্যায়ন পরিচালনা করতে দেয়।

  5. ক্যাবল, প্যাকেজ এবং মডিউল। আমার জন্য ক্যাবল ডাউনলোড প্যাকেজ থাকা সোর্স কোড খুঁজে পাওয়া, কোনও মেকফিল লেখার চেয়ে অনেক বেশি সুবিধাজনক etc.


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

আপনি যা বলেন তা সত্য, তবে অভিব্যক্তি সমস্যাটি বীজগণিত ডেটা ধরণের সীমাবদ্ধতা সম্পর্কে (এবং স্ট্যান্ডার্ড ওওপির দ্বৈত সীমাবদ্ধতা সম্পর্কে)।
ব্লেজারব্লেড

@ হুগমগ আপনি কি পর্যবেক্ষকের পরিবর্তে ভিজিটর ধরণটি বোঝাতে চেয়েছিলেন?
সেবাস্তিয়ান রেডল

হ্যাঁ। আমি এই দুটি নাম সবসময় স্যুইচ করি :)
hugomg

@ হুগমগ এটি Maybe(সি ++ দেখার জন্য std::optional) থাকার কথা নয় , এটি স্পষ্টতই বিষয়গুলি optionচ্ছিক / অযোগ্য / সম্ভবত চিহ্নিত করতে হবে।
উত্সাহককে

7

Memoize!

এটি সি ++ তে লেখার চেষ্টা করুন। সি ++ 0x এর সাথে নয়

খুব কষ্টকর? ঠিক আছে, এটি C ++ 0x দিয়ে চেষ্টা করুন ।

আপনি এই 4-লাইন (বা 5-লাইন, যাই হোক না কেন: পি) কে ডি -তে সংকলন-সময় সংস্করণটি পরাজিত করতে পারেন তা দেখুন :

auto memoize(alias Fn, T...)(T args) {
    auto key = tuple(args);                               //Key is all the args
    static typeof(Fn(args))[typeof(key)] cache;           //Hashtable!
    return key in cache ? cache[key] : (cache[key] = Fn(args));
}

এটিকে কল করার জন্য আপনার যা যা করা দরকার তা হ'ল:

int fib(int n) { return n > 1 ? memoize!(fib)(n - 1) + memoize!(fib)(n - 2) : 1;}
fib(60);

আপনি স্কিম-তেও অনুরূপ কিছু চেষ্টা করতে পারেন, যদিও এটি সামান্য ধীর হওয়ার কারণ এটি রান সময়ে ঘটে এবং কারণ এখানে অনুসন্ধানটি হ্যাশের পরিবর্তে লিনিয়ার (এবং ভাল, কারণ এটির স্কিম):

(define (memoize f)
    (let ((table (list)))
        (lambda args
            (cdr
                (or (assoc args table)
                    (let ((entry (cons args (apply f args))))
                        (set! table (cons entry table))
                        entry))))))
(define (fib n)
        (if (<= n 1)
            1
            (+ (fib (1- n))
                (fib (- n 2)))))))
(set! fib (memoize fib))

1
সুতরাং আপনি এপিএলকে ভালবাসেন যেখানে আপনি একটি লাইনে কিছু লিখতে পারেন? সাইজ কিছু যায় আসে না!
বো পারসন

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

1
@ মেহরদাদ - আমার মন্তব্য সবচেয়ে কমপ্যাক্ট প্রোগ্রাম সম্পর্কে সেরা প্রোগ্রামিং ভাষার লক্ষণ নয়। যে ক্ষেত্রে APL হাত নিচে জয় হবে, কারণ আপনি একটি একক গৃহস্থালির কাজ অপারেটর সঙ্গে অধিকাংশ জিনিস না। কেবল সমস্যাটি হ'ল এটি অপঠনযোগ্য।
বো পারসন

@ বো: যেমনটি আমি বলেছিলাম, আমি এপিএলের প্রস্তাব দিচ্ছিলাম না; আমি এটি কখনও দেখিনি। ফাইলের আকার ছিল এক নির্ণায়ক (যদিও উল্লেখযোগ্য এক, হিসেবে দেখা যেতে পারে যদি আপনি সি ++ দিয়ে এই চেষ্টা) ... কিন্তু কোন সমস্যা? এই কোড?
মেহরদাদ

1
@ ম্যাট: আপনার কোডটি একটি ফাংশন মেমোয়েজ করেছে , তবে এই কোডটি কোনও ফাংশনকে স্মরণ করতে পারে। এগুলি মোটেও সমতুল্য নয়। আপনি যদি সি -+ 0x এর মতো উচ্চতর অর্ডার ফাংশনটি লেখার চেষ্টা করেন তবে এটি ডি এর চেয়ে অনেক বেশি ক্লান্তিকর (যদিও এটি এখনও বেশ সম্ভব ... যদিও এটি সি ++ তে সম্ভব না)।
মেহেরদাবাদ

5

সি ++ একটি বহুমুখী ভাষা, যার অর্থ এটি অনেকগুলি চিন্তাধারাকে সমর্থন করার চেষ্টা করে। কখনও কখনও একটি সি ++ বৈশিষ্ট্য অন্য ভাষার প্রয়োগের চেয়ে আরও বিশ্রী বা কম সাবলীল হয়, যেমন কার্যকরী প্রোগ্রামিংয়ের ক্ষেত্রে।

এটি বলেছিল, আমি আমার নেটিভ সি ++ ভাষার বৈশিষ্ট্যটির শীর্ষের অংশটি ভাবতে পারি না যা yieldপাইথন বা জাভাস্ক্রিপ্টে যা করে।

আর একটি উদাহরণ সমকালীন প্রোগ্রামিং । সি ++ 0x এর সম্পর্কে একটি মন্তব্য থাকবে, তবে বর্তমান মানটি তা করে না, এবং সম্মতিটি ভাবার সম্পূর্ণ নতুন উপায়।

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


সি ++ দেওয়া সি ++ 2003 এ জেনারেটর তৈরি করা কতটা কঠিন হবে তা আমি ভাবতেও শুরু করতে পারি না। সি ++ 2011 এটিকে আরও সহজ করে তুলবে, তবে তুচ্ছ নয়। সি ++, সি # এবং পাইথনের সাথে নিয়মিত কাজ করা, জেনারেটরগুলি খুব সহজেই সি ++ এর মধ্যে আমি যে বৈশিষ্ট্যটি সবচেয়ে বেশি মিস করি তা সহজেই হয় (এখন যে সি +++ ল্যাম্বডাস যুক্ত করেছে)।

আমি জানি আমি এটির জন্য গুলি করব, তবে যদি আমাকে একেবারে সি ++ এ জেনারেটর প্রয়োগ করতে হত তবে আমাকে ব্যবহার করতে হবে ... setjmpএবং longjmp। এটি কতটা ভেঙে যায় তা আমার কোনও ধারণা নেই তবে আমার ধারণা ব্যতিক্রমগুলিই প্রথম হবে। এখন, আপনি যদি আমাকে ক্ষমা করবেন, আমার মাথা থেকে বেরিয়ে আসার জন্য আমাকে আধুনিক সি ++ ডিজাইনের পুনরায় পড়া দরকার ।
মাইক ডিসিমোন

@ মাইক ডিসিমোন, আপনি কীভাবে সেটজ্যাম্প এবং লংজ্যাম্পের সাথে সমাধানের চেষ্টা করতে চান সে সম্পর্কে বিস্তারিত (ব্রিফলি) করতে পারবেন?

1
কর্টাইনগুলি ফান্টারের কাছে আইসোমরফিক হয়।
GManNickG

1
@Xeo, @Mike: xkcd.com/292
Mehrdad

5

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

ইন্ট্রোস্পেকশন এবং রান-টাইম কোড সংকলন / সম্পাদন / মূল্যায়ন / যা যথেষ্ট পরিমাণে শক্তিশালী বৈশিষ্ট্য যা সি ++ এর অভাব রয়েছে।


Coroutines ফ্রিআরটিওএসগুলিতে উপলব্ধ ( এখানে দেখুন ), যা সিতে প্রয়োগ করা হয়েছে? আমি ভাবছি যে তাদের সি ++ এ কাজ করতে কী লাগবে?
মাইক ডিসিমোন

কো-রুটিনগুলি সি-তে বস্তুর অনুকরণের জন্য একটি বাজে হ্যাক C সি ++ তে, কোডগুলি এবং ডেটা বান্ডিল করতে অবজেক্টগুলি ব্যবহৃত হয়। তবে সি তে, আপনি পারবেন না। সুতরাং আপনি ডেটা সঞ্চয় করতে সহ-রুটিন স্ট্যাক এবং কোডটি ধরে রাখতে সহ-রুটিন ফাংশন ব্যবহার করেন।
MSalters 10:38


1
@ ফেররুসিও: লিঙ্কটির জন্য ধন্যবাদ ... উইকিপিডিয়া নিবন্ধেও কয়েকটি রয়েছে। @ এসএমএলটারস: আপনাকে "ন্যক্কারজনক হ্যাক" হিসাবে সহ-রুটিনগুলি কীভাবে বর্ণনা করে? আমার কাছে খুব স্বেচ্ছাচারিত দৃষ্টিভঙ্গি মনে হচ্ছে। স্টোর স্টোর ব্যবহার করে স্টোর ব্যবহার করে রিকার্সিভ অ্যালগরিদম দ্বারাও করা হয় - সেগুলিও কি হ্যাকিশ? এফডাব্লুআইডাব্লু, কর্টিনস এবং ওওপি একই সময়ে (১৯60০ এর দশকের গোড়ার দিকে) ঘটনাস্থলে এসেছিল ... বলতে বলতে যে প্রাক্তনটির সি-তে বস্তুর জন্য একটি হ্যাক উদ্ভট বলে মনে হয় ... আমি কল্পনা করতাম কিছু সি প্রোগ্রামার তখনই অনুমিত বস্তুগুলির অনুকরণে আগ্রহী ছিল, > সি ++ এর 15 বছর আগে।
টনি

4

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


গতিতে পার্থক্য কী ছিল?
কোয়ান্ট_দেব

1
@ কোয়ান্ট_দেব: অবশ্যই এক মিলিয়ন মিলিয়ন!
ম্যাট এলেন

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

2

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

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

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

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

আপনি বিমূর্ততার উচ্চতর এবং উচ্চ স্তরের সম্পর্কে ভুলে যেতে চাইতে পারেন - এটি হ'ল সংক্ষিপ্ত এবং সংক্ষিপ্ত ক্ষেত্র। আপনি সর্বদা এটি পরে নিতে পারেন। এটি শিখতে একটি স্ন্যাপ, দিনের কথা। আমার মতে, হার্ডওয়্যার 1 এর ভাষা শিখতে , হাড়ের কাছে যতটা সম্ভব কাছাকাছি পৌঁছানোর জন্য আপনি আরও ভাল হতে চাই।


1 সম্ভবত বেশ জার্মান নয়, তবে carএবং cdrতাদের নামগুলি হার্ডওয়্যার থেকে নিন: প্রথম লিস্প এমন একটি মেশিনে ছুটে এসেছিলেন যেটির প্রকৃত হ্রাস রেজিস্টার এবং প্রকৃত ঠিকানা রেজিস্টার ছিল। কীভাবে?


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

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

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

@ মাইকে তারপরে আপনাকে নতুন ভাষার সাথে পূর্ববর্তী ভাষার সাথে যোগাযোগের বিষয়টি মোকাবেলা করতে হবে;)
চাদ

2

সহযোগী অ্যারে

ডেটা প্রক্রিয়াকরণের একটি সাধারণ উপায় হ'ল:

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

এটির জন্য সঠিক সরঞ্জামটি হলেন সহযোগী অ্যারে

  • এসোসিয়েটিভ অ্যারেগুলির জন্য আমি যে ভাষাটি দেখেছি তার জন্য সর্বোত্তম ভাষা সমর্থন হ'ল এমএমপিএস , যেখানে এসোসিয়েটিভ অ্যারেগুলি হয়: ১. সর্বদা বাছাই করা হয় ২. এগুলি খুব একই বাক্য গঠন সহ ডিস্কে (তথাকথিত ডাটাবেস) তৈরি করা যায়। (পার্শ্ব প্রতিক্রিয়া: এটি ডাটাবেস হিসাবে চূড়ান্তভাবে শক্তিশালী, প্রোগ্রামার এর স্থানীয় বিটিতে অ্যাক্সেস পেয়েছে ever এখন পর্যন্ত সেরা নোএসকিউএল সিস্টেম)
  • আমার দ্বিতীয় পুরষ্কার পিএইচপি-তে যায় , আমি ach এ [] = এক্স বা [এ [এক্স] [ওয়াই] [জেড] ++ - এর মতো ফোরচ এবং সহজ বাক্য গঠন পছন্দ করি ।

আমি সত্যিই জাভাস্ক্রিপ্টের সহযোগী অ্যারে সিনট্যাক্স পছন্দ করি না, কারণ আমি তৈরি করতে পারি না, একটি [x] [y] [z] = 8 বলুন , প্রথমে আমাকে একটি [এক্স] এবং একটি [এক্স] [ওয়াই] তৈরি করতে হবে

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

আমি বলি না যে সি ++ (এবং জাভা) তে কোনও ব্যবহারযোগ্য সাহসী অ্যারে নেই, তবে টাইপলেস (বা অ-কঠোর টাইপযুক্ত) স্ক্রিপ্টের ভাষাগুলি সংকলিতগুলিকে মারধর করে, কারণ এগুলি টাইপলেস স্ক্রিপ্টের ভাষা।

দাবি অস্বীকার: আমি সি # এবং অন্যান্য। নেট ল্যাঙ্গুয়েস, আফাইকের সাথে পরিচিত নই তারা ভাল মিশুক অ্যারে হ্যান্ডলিং করে।


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

1
পাইথনে, আপনি হয় অন্তর্নির্মিত dictপ্রকারটি ব্যবহার করতে পারেন (উদাহরণস্বরূপ x = {0: 5, 1: "foo", None: 500e3}, লক্ষ্য করুন যে কীগুলি বা মান একই ধরণের হওয়ার প্রয়োজন নেই)। এর মতো কিছু করার চেষ্টা করা a[x][y][z] = 8শক্ত কারণ ভাষাটি ভবিষ্যতের দিকে তাকাতে হবে তা দেখার জন্য যে আপনি কোনও মান নির্ধারণ করছেন বা অন্য একটি স্তর তৈরি করছেন; অভিব্যক্তি a[x][y]নিজে আপনাকে বলতে নেই।
মাইক ডিসিমোন

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

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

@ মাইক: আপনার পোস্ট করা খুব বিনোদনমূলক লিঙ্কগুলি সেগুলি পড়তে পেরে আমি খুব হাসি পেয়েছি।
শাটল

2

আমি জাভা, সি \ সি ++, সমাবেশ এবং জাভা স্ক্রিপ্ট শিখিনি। জীবিকা নির্বাহের জন্য আমি সি ++ ব্যবহার করি।

যদিও, আমাকে বলতে হবে যে আমি এসেম্বলি প্রোগ্রামিং এবং সি প্রোগ্রামিং বেশি পছন্দ করি। এটি বেশিরভাগ ইমপিটিভ প্রোগ্রামিংয়ের সাথে ইনলাইন।

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

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

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

আপনি মিশ্রণে প্রোগ্রামিং দৃষ্টান্ত যুক্ত করলে এটি আরও জটিল হয়ে যায় কারণ আমাদের বিশ্বের দৃষ্টিভঙ্গি আলাদা different


2

এমন কোনও শক্তিশালী ভাষার বৈশিষ্ট্য বা রীতিমতো আপনি কি এমন ভাষায় ব্যবহার করেন যা আপনি কেবল সি ++ এ লিখতে পারলে ধারণা করা বা বাস্তবায়ন করা কঠিন?

আপনি অন্যান্য ভাষায় এমন কোন কার্যকর ধারণা বা কৌশলগুলির মুখোমুখি হয়ে গেছেন যে আপনি সি ++ এ লিখতে বা "চিন্তাভাবনা" করে থাকলে ধারণাটি করতে অসুবিধা হত?

সি ++ অনেকগুলি পদ্ধতিকে অক্ষম করে তোলে। আমি এতদূর যেতে পারব যে আপনি নিজেকে C ++ এ সীমাবদ্ধ রাখলে বেশিরভাগ প্রোগ্রামিং ধারণা ধারণ করা শক্ত। এখানে কয়েকটি সমস্যার সমাধান যা আরও বেশি সহজে সমাধান করা যায় যেগুলি সি ++ শক্ত করে তোলে।

বরাদ্দ এবং আহ্বান কনভেনশন নিবন্ধন করুন

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

এই মত ধারণা আমি কিছু সমাবেশ ভাষা প্রোগ্রামিং এ যান থাকার পরামর্শ এবং খুঁজে বার করো সম্বন্ধে জানার জন্য এআরএম কোড নির্মাণ মান সম্পর্কে এই নিবন্ধটি

রান-টাইম কোড জেনারেশন

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

আমি স্কিম প্রয়োগ বাস্তবায়ন এবং EVALমেটাসারিকুলার মূল্যায়ন সম্পর্কে শিখতে খেলতে প্রস্তাব করছি ।

গাছগুলিতে হেরফের

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

এই "সি ++ এর জন্য হাস্যকর সহজ জেএসএন পার্সার" এর ওজন মাত্র 484 এলওসি যা সি ++ এর জন্য খুব ছোট। এখন এটি আমার নিজের সাধারণ JSON পার্সারের সাথে তুলনা করুন যা এফ # এর মাত্র 60 LOC এ ওজন s পার্থক্যটি মূলত কারণ এমএল এর বীজগণিত ডেটাটাইপস এবং প্যাটার্ন ম্যাচিং (সক্রিয় নিদর্শন সহ) গাছগুলিকে ম্যানিপুলেটেড করা সহজতর করে তোলে।

পরীক্ষা করে দেখুন OCaml লাল কালো গাছ খুব।

বিশুদ্ধভাবে কার্যকরী ডেটা স্ট্রাকচার

সি ++ তে জিসির অভাব কিছু কার্যকর পন্থা অবলম্বন করা ব্যবহারিকভাবে অসম্ভব করে তোলে। বিশুদ্ধভাবে কার্যকরী ডেটা স্ট্রাকচারগুলি এ জাতীয় একটি সরঞ্জাম।

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

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

লেজ কল

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

উদাহরণস্বরূপ, অর্থ শিল্প থেকে এফ # তে মেমোয়েজেশন সহ ধারাবাহিকতা-পাসিং শৈলী ব্যবহার করে 0-1 ন্যাপস্যাক সমস্যার এই বাস্তবায়নটি দেখুন । আপনার যখন লেজ কল হয়, ধারাবাহিকতা পাস করার শৈলী একটি সুস্পষ্ট সমাধান হতে পারে তবে সি ++ এটিকে অক্ষম করে তোলে।

concurrency

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


1

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

সি ++ সি ++ 11 দিয়ে আধুনিকতায় ব্যাপক পদক্ষেপ নিয়েছে, একে একে "আধুনিক" ভাষা বলা কিছুটা প্রসারিত। সি ++ ১ ((যা এখনও মুক্তি পায়নি) আধুনিক মানগুলিতে আসতে আরও বেশি পদক্ষেপ নিচ্ছে, যতক্ষণ না "আধুনিক" মানে "আগের সহস্রাব্দ থেকে নয়"।

এমনকি পাইথনের এক লাইনে যে লিখতে পারে তার সহজতম বোধগম্যতা (এবং গিডোর 79৯ টি চরিত্রের লাইন দৈর্ঘ্যের সীমা মেনে চলা) সি ++ এ অনুবাদ করার সময় প্রচুর এবং প্রচুর কোডের লাইন হয়ে যায়, এবং সি ++ কোডের কয়েকটি লাইন বরং সংশ্লেষিত হয়।


ভাল দ্রষ্টব্য: আমার বেশিরভাগ প্রোগ্রামিং সি ++ তে রয়েছে। আমি ভাষা পছন্দ করি
ডেভিড হামেন

আমি ভেবেছিলাম রেঞ্জের প্রস্তাবটি কি এটি সমাধান করার কথা ছিল? (এমনকি সি ++ 17
মার্টিন বা

2
"আধুনিকতায় বিশাল পদক্ষেপ": বর্তমান সহস্রাব্দে উদ্ভাবিত সি ++ 11 কী "আধুনিক" বৈশিষ্ট্যগুলি সরবরাহ করে?
জর্জিও

@ মার্টিনবা - "রেঞ্জ" প্রস্তাব সম্পর্কে আমার বোঝাপড়াটি হ'ল এটি পুনরাবৃত্তিকারীদের প্রতিস্থাপন যা সহজে কাজ করা সহজ এবং ত্রুটিযুক্ত প্রবণতা কম। আমি কোনও প্রস্তাবনা দেখিনি যা তারা তালিকা বোধের মতো আকর্ষণীয় কিছু মঞ্জুরি দেয়।
জুলাই

2
@ জর্জিও - বর্তমান সহস্রাব্দে কোন জনপ্রিয় ভাষার কোন বৈশিষ্ট্য আবিষ্কার করা হয়েছিল?
জুলাই

0

কলব্যাক কলকারী একটি সংকলিত গ্রন্থাগার, যা কোনও ব্যবহারকারী সংজ্ঞায়িত শ্রেণীর ব্যবহারকারী সংজ্ঞায়িত সদস্য ফাংশন।


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

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

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

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

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

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

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


1
I have not seen a similarly flexible way to define a callback in any other language yet (though I'd be very interested to hear about them!) আপনি কেবল যা বর্ণনা করেছেন ঠিক সেভাবেই যা ইভেন্ট-চালিত ইউআই কোড ডেলফিতে কাজ করে। (এবং। নেট উইনফর্মগুলিতে, যা ডেলফি দ্বারা প্রচুর পরিমাণে প্রভাবিত হয়েছিল))
ম্যাসন হুইলারের

2
"সি ++ তে আপনি কোনও ভিএলএর ধরণ লিখতে পারবেন না" [...] - সি ++ এ, সি 99-স্টাইলের ভিএলএগুলি অপ্রয়োজনীয়, কারণ আমাদের রয়েছে std::vector। যদিও স্ট্যাক বরাদ্দ না ব্যবহারের কারণে এটি কিছুটা কম দক্ষ, এটি কার্যত কোনও ভিএলএর কাছে কার্যকরীভাবে বিচ্ছিন্ন, সুতরাং এটি "ব্লাব" টাইপ সমস্যা হিসাবে গণ্য হয় না: সি ++ প্রোগ্রামাররা এটি কীভাবে কাজ করে তা দেখতে পারে এবং কেবল বলে, "আহা হ্যাঁ , সি সি ++ এর চেয়ে আরও দক্ষতার সাথে এটি করে।
জুলাই

2
"সি ++ তে আপনি কোনও ল্যাম্বদার প্রকারটি লিখতে পারবেন না typ এমনকি আপনি এটি টাইপও করতে পারবেন না Thus সুতরাং, কোনও ল্যাম্বডায় কাছাকাছি যাওয়ার কোনও উপায় নেই বা কোনও বস্তুর মধ্যে এটির কোনও রেফারেন্স সংরক্ষণ করা যায় না" - এটাই তার std::functionজন্য।
জুলাই

3
"আমি অন্য কোনও ভাষায় কলব্যাক সংজ্ঞায়নের জন্য একইভাবে নমনীয় উপায়টি দেখিনি (যদিও আমি তাদের সম্পর্কে শুনতে আগ্রহী!)" - জাভাতে, আপনি লিখতে পারেন object::methodএবং এটি একটি উদাহরণে রূপান্তরিত হবে প্রাপ্তি কোডটি যা প্রত্যাশা করে তা ইন্টারফেসের। সি # এর প্রতিনিধি রয়েছে। প্রতিটি বস্তু-কার্যকরী ভাষার এই বৈশিষ্ট্য থাকে কারণ এটি মূলত দুটি প্যারাডিজমের ক্রস-বিভাগের পয়েন্ট।
জুলাই

@ জুলস আপনার যুক্তিগুলি ব্লব-প্যারাডক্স সম্পর্কে যা ঠিক তা হল: একজন দক্ষ সি ++ প্রোগ্রামার হিসাবে, আপনি এগুলি সীমাবদ্ধতা হিসাবে দেখেন না। তবে এগুলি সীমাবদ্ধতা এবং C99 এর মতো অন্যান্য ভাষা এই নির্দিষ্ট পয়েন্টগুলিতে আরও শক্তিশালী। আপনার শেষ পয়েন্ট: অনেক ভাষায় কার্যকারিতা সম্ভব, তবে আমি এমন একটিও জানি না যা আপনাকে কোনও পদ্ধতির নামটি অন্য কোনও শ্রেণীর কাছে দেওয়ার অনুমতি দেয় এবং এটি আপনাকে সরবরাহ করে এমন কোনও বস্তুতে কল করে দেয়।
মাস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.