Algorithm program debugging
اشکالزدایی الگوریتمی (همچنین به آن اشکالزدایی اظهاری میگویند) یک تکنیک اشکالزدایی است که نتایج زیر-محاسبات را با آنچه برنامهنویس قصد داشته است، مقایسه میکند
این تکنیک یک نمایش داخلی از تمام محاسبات و زیر-محاسبات انجام شده در حین اجرای یک برنامه با خطا ایجاد میکند و سپس از برنامهنویس در مورد صحت چنین محاسباتی سوال میپرسد
.با پرسیدن سوالات از برنامهنویس یا استفاده از یک مشخصه فرمال، سیستم میتواند دقیقاً مکان خطا در یک برنامه را تشخیص دهد. تکنیکهای اشکالزدایی میتوانند به طور چشمگیری زمان و تلاش مورد نیاز برای اشکالزدایی را کاهش دهند
بررسی اجمالی
[ویرایش]اشکالزدایی برنامه یک بخش بسیار رایج از توسعه نرمافزار است. تا دهه ۱۹۸۰، هنر اشکالزدایی برنامه، که توسط هر برنامهنویسی انجام میشد، بدون هیچ پایهنظری بود
در اوایل دهه ۱۹۸۰، روشهای سیستماتیک و اصولی برای اشکالزدایی برنامه توسعه یافت. به طور کلی، یک باگ رخ میدهد زمانی که یک برنامهنویس یک قصد خاص در مورد آنچه برنامه باید انجام دهد دارد، اما برنامه واقعاً نوشته شده، رفتار متفاوتی نسبت به قصد در یک حالت خاص نشان میدهد
یک روش سازماندهی فرایند اشکالزدایی این است که آن را (حداقل تا حدودی) از طریق یک تکنیک اشکالزدایی الگوریتمی به صورت خودکار سازماندهی کند
ایده اصلی اشکالزدایی الگوریتمی این است که یک ابزار وجود داشته باشد که برنامهنویس را به صورت تعاملی در فرایند اشکالزدایی هدایت کند: این کار را با پرسیدن از برنامهنویس در مورد منابع باگ ممکن انجام میدهد. تکنیک اشکالزدایی الگوریتمی یک نمایش داخلی از تمام محاسبات و زیر-محاسبات انجام شده در حین اجرای یک برنامه با خطا (یک درخت اجرا) ایجاد میکند
سپس، از برنامهنویس در مورد صحت چنین محاسباتی سوال میپرسد. وقتی نتیجه صحیح باشد، برنامهنویس "بله" پاسخ میدهد و وقتی نتیجه نادرست باشد، "خیر" پاسخ میدهد
برخی از اشکالزدایی الگوریتمی همچنین پاسخ "نمیدانم" را قبول میکنند وقتی برنامهنویس نتواند پاسخ دهد (برای مثال به دلیل پیچیدگی سوال). بنابراین، پاسخهای برنامهنویس جستجو برای یافتن باگ را تا زمان جدا کردن قسمتهای صحیح برنامه هدایت میکند
فرآیند اشکالزدایی الگوریتمی به دنبال یافتن یک باگ در هر زمان است. به منظور یافتن باگهای مختلف، فرآیند باید برای هر باگ مختلف دوباره شروع شود
ریشه ها، جهت های فعلی و آینده
[ویرایش]اشکالزدایی الگوریتمی ابتدا توسط اهود شاپیرو در طول تحصیلات دکتری خود در دانشگاه ییل توسعه یافت، که در پایاننامه دکتری خود معرفی شد و به عنوان پایاننامه برجسته ACM در سال ۱۹۸۲ انتخاب شد
شاپیرو روش اشکالزدایی الگوریتمی را در زبان برنامهنویسی Prolog (یک زبان برنامهنویسی منطق عمومی) برای اشکالزدایی برنامههای منطقی پیادهسازی کرد
در صورت برنامههای منطقی، رفتار قصدی برنامه یک مدل است (مجموعهای از عبارات ساده واقعی) و باگها به عنوان ناتمامی برنامه (عدم توانایی در اثبات یک عبارت واقعی) یا نادرستی (توانایی در اثبات یک عبارت غلط) ظاهر میشوند. الگوریتم یک عبارت غلط را در برنامه شناسایی میکند و یک مثال مخالف برای آن یا یک عبارت واقعی که باید به برنامه اضافه شود را فراهم میکند
یک روش برای مدیریت عدم پایان نیز توسعه یافت. تحقیقات و توسعه در حوزه اشکالزدایی الگوریتمی بهبودهای قابل توجهی را نسبت به الگوریتمهای اصلی برای اشکالزدایی Prolog و سایر زبانها داشته و ایدهها را به سایر پارادایمهای زبان مانند زبانهای تابعی و شئگرا گسترش داد
. سه دهه پس از معرفی آن، اشکالزدایی الگوریتمی هنوز یک حوزه فعال تحقیقات علوم کامپیوتر است و احتمالاً به مدت دههها همچنان به همین شکل باقی خواهد ماند، زیرا هنوز هم راهکار جامع واضحی در دست نیست