আমরা কেন সময় গ্যারান্টি সংকলনের দিকে আরও গবেষণা করছি না?


12

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

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

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

অনুপস্থিত মনে হয় intএমন কোনও কিছুর উদাহরণ হ'ল এমন একটি ভাষা যা অন্তর্নিহিত আর্কিটেকচারের বিটের সংখ্যা দ্বারা নির্ধারিত একটি জেনেরিক ধরণের সংজ্ঞা দেওয়ার পরিবর্তে যে কোনও ব্যক্তির ব্যাপ্তি থাকতে পারে (নীচে উদাহরণের Int [a..b]মধ্যে একটি পূর্ণসংখ্যার ধরণের বর্ণনা দেয় ক এবং খ অন্তর্ভুক্ত):

a : Int [1..24]
b : Int [1..12]
a + b : Int [2..36]
a - b : Int [-11..23]
b - a : Int [-23..11]

বা (এটি আডা থেকে নেওয়া):

a : Int [mod 24]
b : Int [mod 24]
a + b : Int [mod 24]

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

a : Int [-3..24]
b : Int [3..10]

তারপর:

a / b

কখনও সংজ্ঞায়িত করা হবে না।

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


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

1
@ Ӎσᶎ: সি # এ অ্যাট্রিবিউটস কেবলমাত্র মেটাডেটা ক্লাস, সুতরাং কোনও ডেটা বৈধতা রানটাইমের সময় ঘটে।
রবার্ট হার্ভে

8
আপনি কীভাবে জানবেন যে এই বিষয়ে সামান্য গবেষণা আছে? গুগলিং চেষ্টা করুন dependent typeবা refinement type
ফিল

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

1
@ রবার্ট হার্ভে: এডিএ আরও গ্যারান্টি সরবরাহ করে এমন অর্থ এই নয় যে সংকলকটি সমস্ত ত্রুটিগুলি ধরা দেবে, এটি কেবল ত্রুটিগুলি কমই ঘটায়।
জর্জিও

উত্তর:


11

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

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

Contract.Requires(-3 <= a && a <= 24);
Contract.Requires( 3 <= b && b <= 10);

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

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

সাধারণ ধারণার সীমা সম্পর্কে:

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

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


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