موضوع مقاله: حذف کد مرده | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # حذف کد مرده | مقدمه: کد مرده شامل بخشی از کد است که هیچ‌گاه اجرا نمی‌شود و یا در صورت اجرا، خروجی آن مورد استفاده قرار نگرفته و در واقع فقط بر روی متغیرهای مرده (متغیرهایی که در بقیه بخش‌های برنامه خوانده نمی‌شوند و از آن‌ها استفاده‌ای نمی‌شود) تأثیر می‌گذارد. | ## بخش 1: حذف کد مرده | به‌طور معمول، کامپایلرها در زمان کامپایل برنامه، به صورت بازگشتی تعیین می‌کنند که کدام متغیرها و بخش‌های برنامه استفاده شده‌اند. متغیرها و بخش‌های استفاده شده علامت گذاری می‌شوند و در نهایت بخش‌های علامت نخورده، از برنامه حذف می‌شوند. اکثر کامپایلرهای پیشرفته، گزینه‌های متعددی را در سطوح مختلف برای حذف کد مرده در اختیار قرار می‌دهند. در سطوح پایین، کامپایلر فقط بخش‌هایی از کد که اجرای آن‌های غیرممکن است را حذف می‌کند. در سطوح بالاتر کامپایلر فضایی را برای ذخیره‌سازی متغیرهای بی‌استفاده در نظر نمی‌گیرد. در سطوح بالاتر از آن نیز، کامپایلر دستورها و توابع بی‌استفاده را شناسایی و حذف می‌کند. مزایا حذف کد مرده مزیت‌های فراوانی دارد که از جملهٔ آن‌ها می‌توان به کم شدن اندازهٔ برنامه اشاره کرد، که بدین ترتیب از اجرا شدن کدی که در نتیجهٔ برنامه تأثیری ندارد و عمل‌هایی که می‌توان بدون انجام آن‌ها به نتیجه رسید، جلوگیری می‌شود. | ## بخش 2: حذف کد مرده | در نتیجه، مدت زمان اجرای برنامه کاهش می‌یابد و این موضوع در بسیاری از اوقات، می‌تواند تأثیر زیادی در بهینه‌تر شدن برنامه داشته باشد. علاوه بر این، حذف کد مرده باعث ساده‌تر شدن ساختار برنامه می‌شود و به این صورت، راه برای انجام دیگر بهینه‌سازی‌ها باز می‌شود. خطرات از طرفی باید در عملیات حذف کد مرده بسیار دقت نمود، چرا که ممکن است نتیجهٔ محاسبات بخشی از کد، در جای دیگری استفاده نشود، ولی آن محاسبات باعث ایجاد تغییر در یک متغیر سراسری و یا تولید استثنا (به انگلیسی: Exception) شود، که در این صورت حذف آن بخش از کد، باعث ایجاد خطا در عملکرد برنامه می‌شود. به‌طور معمول، کامپایلرها زمانی که در مورد مرده بودن بخشی از کد ابهام هست، به صورت محافظ کارانه عمل می‌کنند. از طرفی، متغیر b یک متغیر محلی در تابع foo است و به این دلیل نمی‌تواند خارج از foo استفاده شود. بنابراین متغیر b مرده است و کامپایلر در زمان بهینه‌سازی می‌تواند آن‌را حذف نماید. همچنین از آن‌جا که تابع همواره در خط هفتم، با دستور بازگشت به کار خود پایان می‌دهد، هیچ مسیر اجرایی به خط هشتم که متغیر b برای دومین بار در آن مقداردهی می‌شود نمی‌رسد. | ## بخش 3: حذف کد مرده | بنابراین، دسترسی به این مقداردهی امکان‌پذیر نمی‌باشد و این بخش از کد، قابل حذف شدن است. باید دقت شود که اگر برنامه ساختار پیچیده تری داشت، به عنوان مثال بعد از دستور بازگشت از تابع در خط هفتم، برچسبی وجود داشت و از جای دیگری از برنامه دستور goto به آن برچسب بود، آن موقع ممکن بود مسیر اجرایی به دومین مقداردهی متغیر b وجود داشته باشد و دیگر b غیرقابل دسترس نبود. علاوه بر این، با این‌که محاسباتی در این تابع انجام می‌شود، مقدار آن محاسبات در جایی که خارج از حوزهٔ این تابع قابل دسترسی باشد ذخیره نمی‌شود. بنابراین با توجه به اینکه تابع همواره مقدار ۹۶ را بازمی‌گرداند، ممکن است در زمان بهینه‌سازی به مقداری که بازمی‌گرداند ساده شود. حذف پویای کد مرده گاهی اوقات غیرقابل دسترس و مرده بودن بخشی از کد، در شرایط خاصی اتفاق می‌افتد و در هنگام کامپایل مشخص نمی‌شود. به عنوان مثال این شرایط را ورودی برنامه‌ها می‌توانند ایجاد کنند و باعث شوند بخشی از کد هیچ‌گاه در زمان اجرای برنامه، اجرا نشوند. | ## جمع‌بندی | محققان دریافته‌اند که کسر عظیمی از دستورات اجرا شدهٔ برنامه‌ها به صورت پویا مرده‌اند.