ফাংশনাল প্রোগ্রামিংয়ে আমরা কেন ধ্রুবক ডেটা স্ট্রাকচার ব্যবহার করি?


22

ক্রিয়ামূলক প্রোগ্রামিং অবিরাম ডেটা স্ট্রাকচার এবং অপরিবর্তনীয় বস্তু নিয়োগ করে। আমার প্রশ্ন হ'ল এখানে এ জাতীয় ডেটা স্ট্রাকচার কেন গুরুত্বপূর্ণ? আমি নিম্ন স্তরে বুঝতে চাই ডাটা স্ট্রাকচার অবিচল না হলে কী হবে? প্রোগ্রামটি প্রায়শই ক্রাশ হবে?


উত্তর:


19

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

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

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

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

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


এটি আমার কাছে অনেক কিছু বোঝায়। আপনার পিপিটি ভাগ করে নেওয়ার জন্য ধন্যবাদ আপনি কি একই সাথে ভিডিও রেকর্ডিংগুলি ভাগ করেন?
gpuguy

@gpuguy। আমি এতটা পাওয়ারপয়েন্ট ব্যবহার করি না। হোয়াইটবোর্ড আমার প্রিয় মাধ্যম। তবে হ্যান্ডআউটগুলি নিজেরাই বেশ পঠনযোগ্য হওয়া উচিত।
উদয় রেড্ডি

+1 গণিত কখনও পরিবর্তনীয় ডেটা অবজেক্টের সাথে কাজ করেনি। এছাড়াও আপনার বক্তৃতা নোট লিঙ্ক।
গাই কোডার

15

পরিবর্তনীয় ডেটা স্ট্রাকচারের সাথে কাজ করার চেয়ে ধ্রুবক ডেটা স্ট্রাকচারের সাথে সঠিকভাবে কাজ করা সহজ । এটি, আমি বলব, এটি প্রধান সুবিধা।

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

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

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


যখন এর অনেক সুবিধা রয়েছে তখন জরুরী ভাষাগুলিতেও অবিচ্ছিন্ন ডাটা স্ট্রাকচার ব্যবহার করবেন না কেন?
gpuguy

4
সম্ভবত শীঘ্রই আপনি জিজ্ঞাসা করবেন "প্রয়োজনীয় ভাষা কেন ব্যবহার করবেন?"
আন্দ্রেজ বাউয়ার

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

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

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

2

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

এটি ফর্মাল পদ্ধতিগুলির ক্ষেত্রে অত্যন্ত কার্যকর।
এই ক্ষেত্রে:

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

উদাহরণ

{p}P{q}[P]ϕpϕq[P]

  • [P]P
  • ϕpϕq)pq

এই পদ্ধতির ফলে দুর্বল প্রাক-শর্ত এবং সবচেয়ে শক্তিশালী পোস্ট-শর্ত গণনাও মঞ্জুরি দেওয়া হয় যা বেশ কয়েকটি পরিস্থিতিতে কার্যকর হয়।


2

আমি নিম্ন স্তরে বুঝতে চাই ডাটা স্ট্রাকচার অবিচল না হলে কী হবে?

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

mt_gen = CreateMersenneTwisterPRNGen(seed)
integral = MonteCarloIntegral_Bulk(mt_gen) + MonteCarloIntegral_Boundary(mt_gen)

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

এক mt_gen জন্য একটি দক্ষ চপল ডাটা স্ট্রাকচার ডিজাইন করতে পারেন যেমন যে কোনো মৃত্যুদণ্ড interleaving MonteCarloIntegral_Bulkএবং MonteCarloIntegral_Boundary"একটি সঠিক" ফল দেবে, কিন্তু একটি ভিন্ন "সঠিক" ফলাফলের সাধারণ নেতৃত্ব একটি ভিন্ন interleaving ইচ্ছা। এই অ-প্রজননযোগ্যতা সম্পর্কিত ফাংশনটিকে "অপবিত্র" করে তোলে এবং এটি আরও কিছু সমস্যার দিকে পরিচালিত করে।

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

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


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

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


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

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


@ ডিডাব্লু আপনি সম্ভবত ঠিক বলেছেন যে এই উত্তরটি একা একা উত্তর নয়। এটি বর্তমানে উদয় রেড্ডি এবং আন্দ্রেজ বাউয়েরের উত্তরে উত্থাপিত কয়েকটি নির্দিষ্ট পয়েন্টগুলিতেই প্রসারিত। আমি মনে করি আমি একে একা দাঁড়ানোর জন্য এটি সংশোধন করতে পারি এবং সরাসরি উত্তর দিতে পারি "ডেটা কাঠামো যদি অবিচল না হয় তবে কী হবে?" প্রশ্নের অংশ। আমি একটি সিউডোরেন্ডম সংখ্যার জেনারেটরকে একটি বিশাল স্টেট স্পেস (2450 বাইট স্টেটযুক্ত "মার্সেন টুইস্টার" এর মতো) ডেটা স্ট্রাকচার হিসাবে দেখব এবং ভুল হতে পারে এমন জিনিসগুলি ব্যাখ্যা করব।
টমাস ক্লিম্পেল

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