پشته تماس: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
Rezabot (بحث | مشارکت‌ها)
جز ربات ردهٔ همسنگ (۲۶) +املا (۱۱ core): + رده:ادسخر دیکسترا
FreshmanBot (بحث | مشارکت‌ها)
جز اصلاح فاصله مجازی + اصلاح نویسه با ویرایشگر خودکار فارسی
خط ۱:
اکثر [[کامپایلر|کامپایلرها]] برای فراخوانی و برگشت زیربرنامه '''فراخوانی پشته''' (call stack) را پیاده‌سازی می‌کنند. Call stack یا run-time stack یک پشته است که اطلاعاتی دربارهدربارهٔ [[زیربرنامه]] فعال یک برنامه را نگهداری می‌کند. زیربرنامه فعال زیربرنامه‌ای است که فراخوانی شده‌است اما هنوز اجرایش تمام نشده‌است.
 
وقتی زیربرنامه‌ای فراخوانی می‌شود، قبل از اینکه کنترل اجرای برنامه به آدرس زیربرنامه پرش کند آدرس دستورالعمل بعدی (دستورالعملی که درحافظه بعد از دستور فراخوانی قرار دارد) درجائی باید ذخیره شود که هنگام برگشت از زیربرنامه از آن استفاده می‌شود. این آدرس را آدرس برگشتی (return addresses) می‌نامند.
خط ۷:
به دلیل استفاده از پشته یک زیربرنامه می‌تواند خودش یا زیربرنامه‌های دیگر را صدا بزند.
 
در زبان‌های سطح بالا فراخوانی پشته معمولاً از برنامه نویس مخفی است. درمقابلدر مقابل در زبان [[اسمبلی]] نیاز است خود برنامه‌نویس با پشته درگیر شود.
 
== کاربرد پشته‌ها در فراخوانی توابع ==
خط ۱۶:
== محتویات ==
=== ذخیره آدرس برگشت ===
وقتی که [[رویه (علوم رایانه)|رویه‌ای]] فراخوانی می‌شود، باید مکان (آدرس) دستورالعملی که رویه را فراخوانی کرده در جایی ذخیره شود تا بعد از برگشت تابع، اجرای برنامه از همان نقطه از سر گرفته شود. استفاده از یک پشته برای ذخیره کردن آدرس برگشت تابع مزایایی نسبت به دیگر روش‌ها دارد. یکی از مزیت‌ها این است که هر فرایندی پشته مخصوص به خود را دارد، در نتیجه رویه می‌تواند به صورت reentrant باشد و می‌تواند به شکل همزمان برای چندین فرایند که هر کدام کارهای مختلفی را انجام می‌دهند فعال باشد. مزیت دیگر این است که [[بازگشت (علوم رایانه)|بازگشت]] به شکل خودکار پشتیبانی می‌شود. وقتی که تابعی خودش را به صورت بازگشتی فراخوانی می‌کند، به ازای هر بار فراخوانی تابع باید یک آدرس برگشت ذخیره شود تا بعداً بتوان از انهاآن‌ها برای برگشتن از تابع استفاده کرد. این قابلیت به شکل خودکار توسط پشته فراهم می‌شود.
 
=== ذخیره‌سازی داده‌های محلی ===
خط ۲۲:
 
=== ارسال پارامترها ===
در هنگام فراخوانی توابع، معمولاً تعدادی آرگومان به آنهاآن‌ها ارسال می‌شود که آنهاآن‌ها را باید در جایی ذخیره کرد تا تابع بتواند از آنهاآن‌ها استفاده کند. اگر تنها چند پارامتر کوچک وجود داشته باشد، از [[ثبات|ثبات‌های]] [[پردازنده]] می‌توان برای ذخیره کردن این پارامترها استفاده کرد. اما اگر پارامترها بیشتر از چیزی باشد که بتوان آنهاآن‌ها را در ثبات‌ها قرار داد، باید از فضای موجود در حافظه برای ذخیره کردن آنهاآن‌ها استفاده کنیم. از پشته برنامه می‌توان برای ذخیره کردن این پارامترها استفاده کرد. از آنجا که معمولاً تابع هر بار با پارامترهای مختلفی فراخوانی می‌شود، هر فراخوانی، فضای مخصوص به خودش را در پشته برنامه خواهد داشت.
 
== پانویس ==