آیا تا به حال اصطلاح دیباگ (Debug) رو شنیدین؟ آیا میدونید کلمه دیباگ به چه معناست؟ تا حالا دقت کردهاین که چرا در بعضی از عکسهای مرتبط با تکنولوژی، به ویژه برنامهنویسی، عکس یه حشره یا سوسک هم دیده میشه؟ آیا میدونستین که فرآیند دیباگ، یکی از چالشبرانگیزترین فعالیتهای هر برنامهنویس هستش؟ در این مقاله قصد دارم تا به زبان ساده شما رو با مفهوم دیباگ (Debug) آشنا کنم.
در ابتدا بیاین که با هم دیگه معنای کلمهی دیباگ رو بررسی کنیم. در واقع پروسهی دیباگ یه داستان جالبی داره. این ماجرا برمیگرده به حدود شصت هفتاد سال پیش، زمانی که اولین کامپیوترها به وجود اومده بودند. کامپیوترهای اون زمان در واقع نوعی ماشینحسابهای غولپیکری بودند که به اندازهی یه اتاق فضا اشغال میکردند. زمانی این کامپیوتر الکترومکانیکی دچار یه مشکل شده بود که اپراتورها بعد از جستجو و رفع مشکل به این نتیجه رسیدهاند که یه حشرهای داخل یکی از رلهها گیر کرده و این حشره مرده باعث اختلال در کارکرد اون دستگاه شده بود. بعدها اونها این حشره ضمیمه گزارش کارشون کردند که در عکس پایین اونو میتونید ببینید.
حالا بیایم معنای لغوی دیباگ رو بررسی کنیم. دیباگ یا Debug یه کلمه انگلیسی هستش که از دو بخش تشکیل شده: De + Bug
De در زبان انگلیسی یه پیشوند منفیکننده هستش. و Bug هم به معنای حشره.
پس ترجمه تحت اللفظی دیباگ (debug) یعنی حذف حشره!
از اون زمان به بعد اصطلاح دیباگ در حوزه توسعه نرمافزار رایج شد. دیباگ به معنای فرآیند کشف مشکلات و معایب کدها و اشکالزدایی اونها گفته میشه. با اینکه الان دیگه سالهای زیادی از این اتفاق میگذره و تقریبا میشه گفت که توسعه کامپیوترها و نرمافزارها دیگه به شیوه سنتی قدیم نیستش، اما در بین برنامهنویسان همچنان به این فرآیند اشکالزدایی و رفع عیب، دیباگ گفته میشه. و از اونجایی که باگ به معنای حشره هستش، اگه دقت کنید در بعضی از عکسهای مرتبط به فرآیند دیباگ، عکس یه حشره و موجودی شبیه سوسک وجود داره!
خب تا اینجا با تاریخچه پیدایش دیباگ و معنای لغوی اون آشنا شدیم. در ادامه قصد داریم تا انواع خطاهای در برنامهنویسی رو معرفی کنیم.
به طور کلی خطاهای برنامهنویسی رو میشه از دو نوع منظر دسته بندی کرد.
معمولا خطاها از لحاظ زمان رخداد به دو دسته میشند: خطاهای زمان کامپایل (Compile) و خطاهای زمان اجرا (Runtime)
خطاهای زمان کامپایل: این نوع از خطاها، قبل از اجرای کد و در زمان کامپایل اتفاق میفتند. در واقع به فرآیند تبدیل کدهای یه زبان به زبان ماشین یا صفر و یک کامپایل گفته میشه. در این مواقع یه پیام خطا مبنی بر نوع خطا و موقعیت اون در کد، توسط کامپایلر و یا IDE به کاربر نشون داده میشه.
خطاهای زمان اجرا: این نوع خطاها، در زمان اجرا رخ میدن. و معمولا در مواقعی اتفاق میفته که یه ورودی غیرمجاز به برنامه داده میشه. در این مواقع اغلب، برنامه متوقف میشه و بعضا یه پیام خطایی رو هم به کاربر نشون میده.
به طور کلی ۳ نوع خطا در زبانهای برنامهنویسی داریم:
این نوع خطاها وابسته به زبان برنامهنویسی مربوط هستند. برای مثال در یه زبانی مثل جاوا یا سیپلاسپلاس، گذاشتن سمیکالن در پایان خطها اجباری هستش. اما مثلا در یه زبانی مثل پایتون (Python) دیگه نیازی به سمیکالن در پایان خطها نیست. در واقع این قواعد، از قواعد دستوری اون زبان محسوب میشن که مجموعهی این قواعد سینتکس اون زبان رو تشکیل میده و در هر زبانی این سینتکسها متفاوته. هر برنامهنویسی قبل از کار کردن با یه زبان برنامهنویسی، باید با قواعد سینتکسی اون زبان آشنا بشه. میشه گفت که این خطاها جزو سادهترین خطاها هستند و معمولا به طور ناخواسته توسط برنامهنویس رخ میدند. برای مثال؛ برنامهنویس فراموش میکنه که آخر خط رو سمیکالن بذاره. اما خبر خوب اینکه، اکثر ادیتورها یا ویرایشگرهای برنامهنویسی که اصطلاحا به اونها IDE گفته میشه قابلیت تشخیص این خطاها رو دارند و حتی هنگام برنامهنویسی و به صورت لحظهای بازخورد میدن. این نوع خطاها در زمان کامپایل اتفاق میفتند و کامپایلرها این خطاها رو با جزییاتی از قبیل خط موردنظر و نوع خطا به برنامهنویس گزارش میدند. از این رو معمولا آسونترین نوع خطاها هستند که اشکال زدایی میشن.
این دسته از خطاها، معمولا در زمان کامپایل یا در زمان اجرا اتفاق میافتند. به طور کلی دو نوع خطای معنایی وجود داره: خطای معنایی استاتیک و داینامیک.
خطاهای استاتیک اغلب در هنگام کامپایل اتفاق میفتند. مثلا در ابتدای برنامه، یه متغیر رو تعریف میکنید، اما اونو مقداردهی نمیکنید و در ادامه قصد دارین تا از مقدار اون متغیر استفاده کنید؛ مثلا اونو چاپ کنید.
دستهی دیگهای از خطاهای معنایی، داینامیک هستند و در زمان اجرا رخ میدن. مثل تقسیم عدد بر صفر یا خواندن از روی فایلی که وجود نداره.
و اما چالشبرانگیزترین نوع خطاها، خطاهای منطقی هستند. در این نوع خطاها، کد شما از لحاظ دستوری و سینتکسی مشکلی نداره و کامپایلر به راحتی اونو کامپایل میکنه. همچنین کد شما خطای معنایی هم نداره و برنامه شما ظاهرا به درستی اجرا میشه. اما…
اما نتیجه و خروجیای که بدست میاد یه خروجی منطقی و قابل قبولی نیست و برخلاف انتظار شماست. مثلا سادهترین مثالش این هستش که شما یه تابع تعریف میکنید که قراره عملیات محاسباتی خاصی، مثل محاسبه یه فرمول رو انجام بده. ورودیهای شما درست هستند اما خروجیای که در نهایت میبینید یه خروجی اشتباه هستش و احتمالا باید یه بازنگری در الگوریتم کدتون داشته باشید.
همونطور که گفتم، این نوع از خطاها، سختترین نوع خطاها محسوب میشن. چون اینجا کامپیوتر این قدر باهوش نیستش که به شما بگه فلانجا رو اشتباه انجام دادی. برای اون کامپیوتر بیچاره و بیجان! فقط یه سری قواعد سینتکسی و پایهای مهم هستش. و کامپیوتر فقط الگوریتمی رو که بهش دادین رو اجرا میکنه. به عبارت دیگه علت به وجود اومدن خطاهای منطقی، نادرست بودن الگوریتم هستش.
یه جملهی قشنگی رو هم یه جا میخوندم که نوشته بود:
کامپیوترها هیچگاه اشتباه نمیکنند، این برنامهنویسان هستند که با الگوریتمهای نادرست کامپیوترها رو برنامهنویسی میکنند.
خب تا به اینجا با انواع خطاهای رایج در زبانهای برنامهنویسی آشنا شدیم و در پایان قصد داریم تا چند راهکار برای اشکالزدایی کدها رو بهتون معرفی کنم.
در این روش شما میتونید خطاهای سینتکسی و خطاهای معنایی خودتون رو به کمک IDE اشکال زدایی کنید. معمولا ویرایشگرهای مدرن امروزی در هنگام رخداد خطا به شما یه پیامی رو نشون میدن که در اون، نوع خطای شما و موقعیت اون مشخصه. شما از این طریق، به راحتی میتونید به خط مورد نظر برید و کدتون رو اصلاح کنید. اگه در اینجا نمیدونستین که چطور مشکلتون رو رفع کنید، میتونید از روش بعدی کمک بگیرین.
این یه روش خیلی کاربردی و رایج در برنامهنویسان هستش. به این صورت که برنامهنویس اگه نتونست به کمک پیام خطای کامپایلر، کدش رو اشکالزدایی کنه، فقط کافیه که اون پیام خطا رو کپی کنه و در گوگل سرچ کنه. به همین راحتی!
و در اغلب موارد اولین نتیجه، سایت محبوب stackoverflow هستش. در این سایت پرسش و پاسخهای زیادی از جمله باگیابی کدها وجود داره. در اکثر موارد، جواب شما در این سایت وجود داره. چون احتمالا شما اولین کسی نیستین که با این خطاها روبرو شدین و طبیعتا برنامهنویسهای زیادی قبل از شما بودهاند که با این مشکل مواجه شدهاند و اون افراد سوالات خودشون رو در این سایت پرسیدهاند و بقیه هم جواب دادهاند.
تا به اینجا دو روش کاربردی برای اشکالزدایی کدها گفته شد. البته روشهای دیگهای هم وجود دارند که به دلیل طولانی شدن حجم مقاله ذکر نشدند.
و اما در پایان سخن، برنامهنویسی یکی از مهارتهایی هستش که علاوه بر تسلط بر دانش برنامهنویسی، نیاز به صبر و پشتکار داره و برای مثال ممکنه شما مدتها، وقتتون رو صرف رفع یه خطا و اشتباه کنید و در نهایت متوجه یه اشتباه کوچک بشین که خیلی ساده بنظر میومده. اما اون چیزی که مهمه، پشتکار و استقامت شماست و شما رو از بقیه برنامهنویسهای دیگه متمایز میکنه.
امیدوارم که این مقاله برای شما مفید بوده باشه ?
منبع: وبسایت شخصی محمدحسین میثاقپور - دیباگ (Debug) به زبان ساده