কার্যকরী প্রোগ্রামিং - অপরিচ্ছন্নতা


12

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

সম্পাদনা : প্রশ্নটি আরও কিছুটা স্পষ্ট করার জন্য, এফপিতে একাধিক থ্রেডে (যেমন: উত্পাদক এবং ভোক্তা) একযোগে কীভাবে স্থাবর কাঠামো (উদা: সারি) ভাগ করা হবে?


সম্মতি সংক্রান্ত সমস্যাগুলি হ্যান্ডেল করার একটি উপায় হ'ল প্রতিবার কাতারের অনুলিপি করা (কিছুটা ব্যয়বহুল, তবে কাজ করে)।
চাকরী

infoq.com/preferencesations/Functional-Data-Structures-in-Scala আপনি এই স্পিচ অন্তর্দৃষ্টিপূর্ণ দেখতে পাবেন।
ডেডালনিক্স

উত্তর:


19

যদিও এটি কখনও কখনও সেভাবে প্রকাশ করা হয় তবে কার্যকরী প্রোগ্রামিং 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 উদ্বেগ।
³ প্রদাহজনক, আমি জানি, তবে আমি এটি বোঝাতে চাইছি। ভাগ করা মেমরি সহ থ্রেডগুলি সমবর্তী প্রোগ্রামিংয়ের সমাবেশ ভাষা। বার্তা পাস করা বোঝা অনেক সহজ, এবং আপনি সম্মতি যুক্ত হওয়ার সাথে সাথে পার্শ্ব প্রতিক্রিয়াগুলির অভাব সত্যিই জ্বলজ্বল হয়ে যায়।
এবং এটি এমন কারও কাছ থেকে আসছেন যিনি এরলংয়ের অনুরাগী নন, তবে অন্যান্য কারণে।


2
+1 আরও অনেক সম্পূর্ণ উত্তর, যদিও আমি মনে করি যে কেউ এলোমেলো করে দিতে পারে যে এরলং খাঁটি এফপি ভাষা নয়।
রেন হেনরিচস

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

2
@ জর্গ সম্মত। যদিও, আবারও, কেউ শুঁটতে পারে যে খাঁটি এফপি এবং ওও অরথোগোনাল।
রেন হেনরিচস

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

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

4

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


3
যদি প্রতিটি অ্যাড / রিমুভ অপারেশনের জন্য এটি একটি নতুন সারি হয় তবে কীভাবে দু'জন (বা আরও) অ্যাসিঙ্ক অপারেশনগুলি (থ্রেড) সারি ভাগ করবে? এটি কিউর নতুন-আইং বিমূর্ত করার একটি প্যাটার্ন?
ভেঙ্ক্রাম

সমকালীনতা একটি সম্পূর্ণ আলাদা প্রশ্ন। আমি একটি মন্তব্যে পর্যাপ্ত উত্তর দিতে পারি না।
রেন হেনরিখস

2
@ রিন হেনরিচস: "একটি মন্তব্যে পর্যাপ্ত উত্তর দিতে পারে না"। এর অর্থ সাধারণত মন্তব্য সম্পর্কিত সমস্যাগুলির সমাধান করার জন্য উত্তরটি আপডেট করা উচিত।
এস .লট

কনকুরেন্সিও একচেটিয়া হতে পারে, হ্যাশেলস কন্ট্রোল.কনকুরન્સી.এসটিএম দেখুন।
বিকল্প

1
@ এস.লট এক্ষেত্রে এর অর্থ হ'ল ওপিকে একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত। এই প্রশ্নটির অনিশ্চয়তা ওটি, যা অবিচ্ছেদ্য ডেটা কাঠামো সম্পর্কে।
রেন হেনরিচস

2

... এফপিতে স্থায়ী সমস্যাগুলির সাথে ওওপিতে রাষ্ট্রীয় উপস্থাপনা দ্বারা সমাধান করা সমস্যাগুলি (উদাহরণস্বরূপ: প্রযোজক এবং গ্রাহকের সাথে একটি সারি)

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

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

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

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


1

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

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

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