চুক্তি এবং নির্ভর টাইপিংয়ের মধ্যে সম্পর্ক


31

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

কিছু কাগজপত্র রয়েছে যা আমাকে মনে করেছে যে আংশিকভাবে স্থিতিশীলভাবে চেক করা চুক্তিগুলি সম্ভব:

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

আমি যে ধারণাটি মিস করছি তার মধ্যে কি আরও গভীর কিছু আছে? বা এগুলি কি কেবল একই অন্তর্নিহিত ধারণাকে উপস্থাপন করার ধূমপুঞ্জী বিভাগগুলি?

উত্তর:


26

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

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

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

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


কেন আপনি বলেন যে চুক্তিগুলি কোয়ান্টিফায়ার মুক্ত?
রাদু গ্রেগোর 13

3
কারন আপনি সাধারণভাবে ফাংশনগুলির সার্বজনীন পরিমাণযুক্ত বৈশিষ্ট্য স্থাপনের জন্য পরীক্ষাগুলি ব্যবহার করতে পারবেন না, এগুলিই।
নীল কৃষ্ণস্বামী

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

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

2
কারণ আমি তোভের শেষ নাম ভুল করে দিয়েছি। " অ্যাফাইন
নীল কৃষ্ণস্বামী

13

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

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

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


7

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


6

উভয় চুক্তি এবং প্রকারগুলি আপনাকে ক্রিয়াকলাপগুলিতে হোয়ের-স্টাইল (প্রাক / পোস্ট শর্ত) স্পেসিফিকেশন উপস্থাপন করতে দেয়। উভয়ই সংকলনের সময় স্থিতিশীলভাবে বা রানটাইম সময়ে গতিশীলভাবে পরীক্ষা করা যায়।

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

শেষ পর্যন্ত, সামান্য পার্থক্য আছে। আমি মনে করি এটি আরও বেশি নির্ভর করে যে প্রকারগুলি এমন যুক্তি যেখানে আপনি স্পেসিফিকেশন প্রকাশ করতে পারেন তবে চুক্তিগুলি এমন একটি প্রোগ্রামিং পদ্ধতি যা আপনি প্রকাশের নির্দিষ্টকরণগুলি করেন do


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

1
আমি এই ধারণাটির মধ্যে ছিলাম যে প্রুফ উত্পন্ন করা সিদ্ধান্তহীন হতে পারে তবে একটি প্রমাণ চেক করা উচিত। অনেক নির্ভরশীল-টাইপিত ভাষা উপপাদ্য-প্রকারের বাসিন্দার প্রমাণ-মান সরবরাহ করতে ব্যবহারকারীর উপর নির্ভর করে।
জেসন রেইচ

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