ক্রিয়ামূলক প্রোগ্রামিং অবিরাম ডেটা স্ট্রাকচার এবং অপরিবর্তনীয় বস্তু নিয়োগ করে। আমার প্রশ্ন হ'ল এখানে এ জাতীয় ডেটা স্ট্রাকচার কেন গুরুত্বপূর্ণ? আমি নিম্ন স্তরে বুঝতে চাই ডাটা স্ট্রাকচার অবিচল না হলে কী হবে? প্রোগ্রামটি প্রায়শই ক্রাশ হবে?
ক্রিয়ামূলক প্রোগ্রামিং অবিরাম ডেটা স্ট্রাকচার এবং অপরিবর্তনীয় বস্তু নিয়োগ করে। আমার প্রশ্ন হ'ল এখানে এ জাতীয় ডেটা স্ট্রাকচার কেন গুরুত্বপূর্ণ? আমি নিম্ন স্তরে বুঝতে চাই ডাটা স্ট্রাকচার অবিচল না হলে কী হবে? প্রোগ্রামটি প্রায়শই ক্রাশ হবে?
উত্তর:
আপনি যখন অপরিবর্তনীয় ডেটা অবজেক্টের সাথে কাজ করেন, ফাংশনগুলির মধ্যে এমন সম্পত্তি থাকে যা আপনি যখনই তাদের একই ইনপুটগুলির সাথে কল করেন তখন তারা একই আউটপুট উত্পাদন করে। এটি গণনাগুলির ধারণাটি তৈরি করা এবং সেগুলি সঠিক করে তোলা সহজ করে। এটি তাদের পরীক্ষা করা আরও সহজ করে তোলে।
এটি কেবল একটি শুরু। যেহেতু গণিত দীর্ঘকাল ধরে ফাংশন নিয়ে কাজ করেছে, তাই প্রচুর যুক্তিযুক্ত কৌশল রয়েছে যা আমরা গণিতের কাছ থেকে ধার নিতে পারি, এবং সেগুলি প্রোগ্রাম সম্পর্কে কঠোর যুক্তির জন্য ব্যবহার করতে পারি। আমার দৃষ্টিকোণ থেকে সর্বাধিক গুরুত্বপূর্ণ সুবিধা হ'ল ফাংশনাল প্রোগ্রামগুলির জন্য টাইপ সিস্টেমগুলি উন্নত। সুতরাং, আপনি যদি কোথাও কোনও ভুল করেন তবে সম্ভাবনাগুলি খুব বেশি যে এটি কোনও প্রকারের অমিল হিসাবে প্রদর্শিত হবে। সুতরাং, টাইপড ক্রিয়ামূলক প্রোগ্রামগুলি অপরিহার্য প্রোগ্রামগুলির চেয়ে অনেক বেশি নির্ভরযোগ্য হতে থাকে।
আপনি যখন পরিবর্তনীয় ডেটা অবজেক্টগুলির সাথে কাজ করেন, বিপরীতে, আপনার প্রথমে একাধিক অবস্থার স্মরণ এবং পরিচালনা করার জ্ঞানীয় বোঝা থাকে যা একটি গণনার সময় এই বস্তুটির মধ্য দিয়ে যায়। আপনাকে সঠিক ক্রমে জিনিসগুলি যত্ন নিতে হবে, একটি নির্দিষ্ট পদক্ষেপের জন্য আপনার প্রয়োজনীয় সমস্ত সম্পত্তি সেই সময়ে সন্তুষ্ট কিনা তা নিশ্চিত করে। ভুল করা সহজ, এবং টাইপ সিস্টেমগুলি এই ভুলগুলি ধরার পক্ষে যথেষ্ট শক্তিশালী নয়।
গণিত কখনও পরিবর্তনীয় ডেটা অবজেক্টের সাথে কাজ করে না। সুতরাং, কোনও যুক্তিযুক্ত কৌশল নেই যা আমরা সেগুলি থেকে ধার নিতে পারি। কম্পিউটার সায়েন্সে বিশেষত ফ্লয়েড-হোয়ার লজিক আমাদের নিজস্ব কৌশল প্রচুর পরিমাণে বিকাশ করেছে । তবে এগুলি স্ট্যান্ডার্ড গাণিতিক কৌশলগুলির চেয়ে মাস্টারদের কাছে আরও চ্যালেঞ্জিং, বেশিরভাগ শিক্ষার্থী এগুলি পরিচালনা করতে পারে না, এবং তাই তারা খুব কমই শেখানো হয়।
এই দুটি দৃষ্টান্ত কীভাবে পৃথক রয়েছে তার তাত্ক্ষণিক পর্যালোচনার জন্য, আপনি প্রোগ্রামিং ল্যাঙ্গুয়েজসের নীতিমালায় আমার বক্তৃতা নোটের প্রথম কয়েকটি হ্যান্ডআউটের সাথে পরামর্শ করতে পারেন ।
পরিবর্তনীয় ডেটা স্ট্রাকচারের সাথে কাজ করার চেয়ে ধ্রুবক ডেটা স্ট্রাকচারের সাথে সঠিকভাবে কাজ করা সহজ । এটি, আমি বলব, এটি প্রধান সুবিধা।
অবশ্যই, তাত্ত্বিকভাবে বলতে গেলে, অবিচ্ছিন্ন ডাটা স্ট্রাকচারের সাথে আমরা যা কিছু করি তা আমরা পরিবর্তনীয়গুলির সাথেও করতে পারি এবং বিপরীতে। অনেক ক্ষেত্রে অবিরাম ডেটা স্ট্রাকচারগুলিতে অতিরিক্ত ব্যয় হয়, সাধারণত সেগুলির অংশগুলি অনুলিপি করতে হয়। 30 বছর আগে সুপার কম্পিউটারগুলি যখন আপনার মোবাইল ফোনের চেয়ে কম মেমরি পেয়েছিল তখন এই বিবেচনাগুলি অবিরাম ডেটা স্ট্রাকচারগুলিকে অনেক কম আকর্ষণীয় করে তুলত। তবে আজকাল সফ্টওয়্যার উত্পাদনের মূল প্রতিবন্ধকতাগুলি বিকাশের সময় এবং রক্ষণাবেক্ষণ ব্যয় বলে মনে হয়। এইভাবে আমরা উন্নয়নের দক্ষতার জন্য মৃত্যুদন্ড কার্যকর করতে কিছু দক্ষতা ত্যাগ করতে ইচ্ছুক।
কেন অবিরাম ডেটা স্ট্রাকচার ব্যবহার করা সহজ? কারণ কোনও প্রোগ্রামের বিভিন্ন অংশের মধ্যে অ্যালিজিং এবং অন্যান্য ধরণের অপ্রত্যাশিত মিথস্ক্রিয়াকে ট্র্যাকিং করতে মানুষ সত্যই খারাপ । তারা স্বয়ংক্রিয়ভাবে মনে করে যে দুটি জিনিস আহ্বান করা হয়েছে x
এবং y
এরপরে সংঘর্ষে কিছুই নেই। সর্বোপরি, "সকালের তারা" এবং "সন্ধ্যা তারা" সত্যিই একই জিনিস তা খুঁজে বের করার প্রচেষ্টা নেওয়া দরকার। একইভাবে, এটি ভুলে যাওয়া খুব সহজ যে কোনও ডেটা কাঠামো পরিবর্তিত হতে পারে কারণ অন্যান্য থ্রেড এটির সাথে কাজ করছে, বা কারণ আমরা এমন একটি পদ্ধতি বলেছিলাম যা ডেটা কাঠামো পরিবর্তন করতে দেখা যায় ইত্যাদি। আমরা যখন কাজ করি তখন এই উদ্বেগগুলির মধ্যে অনেকগুলি উপস্থিত হয় না অবিরাম ডেটা স্ট্রাকচার
ক্রমাগত ডেটা স্ট্রাকচারের অন্যান্য, প্রযুক্তিগত সুবিধাও রয়েছে। এগুলি অপ্টিমাইজ করা সহজতর। উদাহরণস্বরূপ, আপনি সবসময় আপনার ক্লাউডের অন্য কোনও নোডের উপর একটি ধ্রুবক ডেটা স্ট্রাকচার অনুলিপি করতে ইচ্ছুক হন, সিংক্রোনাইজেশনের কোনও উদ্বেগ নেই।
অন্যের উত্তর যুক্ত করা, এবং একটি গাণিতিক পদ্ধতির চাঙ্গা করে, ফাংশনাল প্রোগ্রামিংয়ের সাথে রিলেশনাল বীজগণিত এবং গ্যালোয়িস সংযোগগুলির সাথে একটি দুর্দান্ত মিল রয়েছে।
এটি ফর্মাল পদ্ধতিগুলির ক্ষেত্রে অত্যন্ত কার্যকর।
এই ক্ষেত্রে:
উদাহরণ
এই পদ্ধতির ফলে দুর্বল প্রাক-শর্ত এবং সবচেয়ে শক্তিশালী পোস্ট-শর্ত গণনাও মঞ্জুরি দেওয়া হয় যা বেশ কয়েকটি পরিস্থিতিতে কার্যকর হয়।
আমি নিম্ন স্তরে বুঝতে চাই ডাটা স্ট্রাকচার অবিচল না হলে কী হবে?
আসুন একটি ডেটা স্ট্রাকচার হিসাবে একটি বিশাল রাষ্ট্রীয় স্থানের সাথে একটি সিউডোরডম সংখ্যা জেনারেটর ( 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