যদিও এটি কখনও কখনও সেভাবে প্রকাশ করা হয় তবে কার্যকরী প্রোগ্রামিং state রাষ্ট্রীয় গণনা রোধ করে না। এটি যা করে তা প্রোগ্রামারকে রাষ্ট্রের স্পষ্ট করতে বাধ্য করে।
উদাহরণস্বরূপ, আসুন একটি অত্যাবশ্যক সারি (কিছু ছদ্ম ভাষাতে) ব্যবহার করে কিছু প্রোগ্রামের প্রাথমিক কাঠামোটি নেওয়া যাক:
q := Queue.new();
while (true) {
if (Queue.is_empty(q)) {
Queue.add(q, producer());
} else {
consumer(Queue.take(q));
}
}
একটি কার্যকরী সারি ডাটা স্ট্রাকচারের সাথে সংশ্লিষ্ট কাঠামো (এখনও একটি আবশ্যক ভাষায়, যাতে এক সাথে এক পার্থক্যকে মোকাবেলা করার জন্য) এরকম দেখতে হবে:
q := Queue.empty;
while (true) {
if (q = Queue.empty) {
q := Queue.add(q, producer());
} else {
(tail, element) := Queue.take(q);
consumer(element);
q := tail;
}
}
যেহেতু সারি এখন পরিবর্তনযোগ্য, তাই বস্তুটি নিজেই পরিবর্তন হয় না change এই সিউডো কোডটিতে q
নিজেই একটি পরিবর্তনশীল; অ্যাসাইনমেন্টগুলি q := Queue.add(…)
এবং q := tail
এটি একটি অন্য অবজেক্টের দিকে নির্দেশ করে। সারি ক্রিয়াকলাপগুলির ইন্টারফেস পরিবর্তিত হয়েছে: প্রত্যেককে অবশ্যই নতুন সারি বস্তুটি প্রত্যাবর্তন করতে হবে যা অপারেশন থেকে ফলাফল।
খাঁটি কার্যকরী ভাষায়, অর্থাত্ কোনও ভাষায় কোনও পার্শ্ব প্রতিক্রিয়া নেই, আপনাকে সমস্ত রাষ্ট্রকে সুস্পষ্ট করে তুলতে হবে। যেহেতু নির্মাতা এবং ভোক্তা সম্ভবত কিছু করছেন, তাদের রাষ্ট্রের অবশ্যই এখানে তাদের কলারের ইন্টারফেসে থাকতে হবে।
main_loop(q, other_state) {
if (q = Queue.empty) {
let (new_state, element) = producer(other_state);
main_loop(Queue.add(q, element), new_state);
} else {
let (tail, element) = Queue.take(q);
let new_state = consumer(other_state, element);
main_loop(tail, new_state);
}
}
main_loop(Queue.empty, initial_state)
এখন কীভাবে প্রতি রাজ্যের প্রতিটি অংশ স্পষ্টভাবে পরিচালিত হয় তা দ্রষ্টব্য। সারি ম্যানিপুলেশন ফাংশনগুলি ইনপুট হিসাবে একটি সারি নেয় এবং আউটপুট হিসাবে একটি নতুন সারি তৈরি করে। প্রযোজক এবং ভোক্তা পাশাপাশি তাদের রাজ্য পাস।
কংকারেন্ট প্রোগ্রামিং এত ভাল মাপসই করা হবে না ভিতরে কার্যকরী প্রোগ্রামিং, কিন্তু এটা খুব ভাল ফিট প্রায় কার্মিক প্রোগ্রামিং। ধারণাটি হ'ল পৃথক গণনা নোডগুলির একটি গুচ্ছ চালানো এবং তাদের বার্তাগুলি বিনিময় করতে দেওয়া। প্রতিটি নোড একটি কার্যকরী প্রোগ্রাম পরিচালনা করে এবং বার্তা প্রেরণ ও গ্রহণ করার সাথে সাথে তার স্থিতি পরিবর্তন হয়।
উদাহরণ অবিরত, যেহেতু একটি একক সারি রয়েছে, এটি একটি নির্দিষ্ট নোড দ্বারা পরিচালিত। গ্রাহকরা একটি নোড কোনও উপাদান পাওয়ার জন্য এই নোডকে বার্তা পাঠান। প্রযোজকরা কোনও উপাদান যুক্ত করতে সেই নোডকে একটি বার্তা পাঠান।
main_loop(q) =
consumer->consume(q->take()) || q->add(producer->produce());
main_loop(q)
একটি "শিল্পোন্নত" ভাষা যে সম্পাতবিন্দু right³ পায় Erlang । সমসাময়িক প্রোগ্রামিং সম্পর্কে জ্ঞান-আলোকের পথ অবশ্যই এর্লং শেখা।
প্রত্যেকে এখন সাইড-এফেক্ট-মুক্ত ভাষায় স্যুইচ করুন!
¹ এই শব্দটি কয়েকটি অর্থ আছে; এখানে আমি মনে করি আপনি এটি পার্শ্ব প্রতিক্রিয়া ছাড়াই প্রোগ্রামিং বোঝাতে ব্যবহার করছেন, এবং এটিই আমি ব্যবহার করছি।
Imp অন্তর্নিহিত রাষ্ট্রের সাথে প্রোগ্রামিং হ'ল আবশ্যক প্রোগ্রামিং ; অবজেক্ট ওরিয়েন্টেশন একটি সম্পূর্ণ orthogonal উদ্বেগ।
³ প্রদাহজনক, আমি জানি, তবে আমি এটি বোঝাতে চাইছি। ভাগ করা মেমরি সহ থ্রেডগুলি সমবর্তী প্রোগ্রামিংয়ের সমাবেশ ভাষা। বার্তা পাস করা বোঝা অনেক সহজ, এবং আপনি সম্মতি যুক্ত হওয়ার সাথে সাথে পার্শ্ব প্রতিক্রিয়াগুলির অভাব সত্যিই জ্বলজ্বল হয়ে যায়।
। এবং এটি এমন কারও কাছ থেকে আসছেন যিনি এরলংয়ের অনুরাগী নন, তবে অন্যান্য কারণে।