فراخوانی پشته
اکثر کامپایلرها برای فراخوانی و برگشت زیربرنامه فراخوانی پشته (call stack) را پیادهسازی میکنند. Call stack یا run-time stack یک پشته است که اطلاعاتی درباره زیربرنامه فعال یک برنامه را نگهداری میکند. زیربرنامه فعال زیربرنامهای است که فراخوانی شدهاست اما هنوز اجرایش تمام نشدهاست.
وقتی زیربرنامهای فراخوانی میشود، قبل از اینکه کنترل اجرای برنامه به آدرس زیربرنامه پرش کند آدرس دستورالعمل بعدی (دستورالعملی که درحافظه بعد از دستور فراخوانی قرار دارد) درجائی باید ذخیره شود که هنگام برگشت از زیربرنامه از آن استفاده میشود. این آدرس را آدرس برگشتی (return addresses) مینامند.
معماری که بر اساس پشته است آدرس برگشتی را به عنوان نقطه برگشت در پشته اضافه میشود. هر بار که زیربرنامهای فراخوانی میشود آدرس برگشتی در پشته push میشود. هنگام برگشت از زیربرنامه آدرس برگشتی از پشته pop شده و کنترل برنامه به آن آدرس پرش میکند و اجرای برنامه از بعد از دستور فراخوانی ادامه پیدا میکند.
به دلیل استفاده از پشته یک زیربرنامه میتواند خودش یا زیربرنامههای دیگر را صدا بزند.
در زبانهای سطح بالا فراخوانی پشته معمولا از برنامه نویس مخفی است. درمقابل در زبان اسمبلی نیاز است خود برنامهنویس با پشته درگیر شود.
کاربرد پشتهها در فراخوانی توابع [ویرایش]
هر وقت تابعی فراخوانی میشود یک رکورد فعالیت برای آن تابع ایجاد میگردد و محیط فعلی را برای آن تابع ذخیره میکند. رکورد فعالیت شامل اطلاعات زیر است:۱. پارامتر ها۲. اطلاعات حالت فراخوان،مثل محتویات ثباتها و آدرسهای برگشت۳. متغیرهای محلی۴. حافظههای موقت برای انجام محاسبات میانیچون ممکن است هر تابع، توابع دیگری را فراخوانی کند و اجرای خود آن تابع به تعویق افتد، رکورد فعالیت آن باید طوری ذخیره شود که وقتی تابع از سر گرفته میشود، بتوان به رکورد فعالیت آن دست یافت. ساختمان دادهای که رکوردهای فعالیت در آن ذخیره میشوند، باید رفتار LIFO (خروج به ترتیب عکس ورود) داشته باشد، زیرا اولین تابعی که خاتمه یابد، آخرین تابعی است که فراخوانی شدهاست و رکورد فعالیت آن باید زودتر از همه بازیابی شود.
از اینرو پشته ساختمان داده مناسبی برای این کار است. چون این پشته در زمان اجرا دستکاری میشود، پشته زمان اجرا نام دارد. وقتی تابعی فراخوانی میشود، کارهای زیر انجام میگیرد:۱. یک کپی از رکورد فعالیت آن در پشته قرار میگیرد.۲. پارامترها ذخیره میشوند.۳. کنترل به آدرس شروع بدنه تابع منتقل میشود. بنابراین، رکورد فعالیت بالای پشتهٔ زمان اجرا، مربوط به تابع در حال اجرا است. وقتی تابعی خاتمه مییابد، یک عمل ()pop رکورد فعالیت این تابع را از پشته حذف میکند و رکورد فعالیت تابع قبلی، که این تابع را فراخوانی کردهاست، در بالای پشته قرار میگیرد.[۱].
پانویس [ویرایش]
- ↑ جعفر نژاد قمی, ساختمان داده در++C.[=صفحات کتاب]
منابع [ویرایش]
- جعفر نژاد قمی، مهندس عین الله. " ساختمان دادهها در ++c ". چاپ پنجم. تهران:نشر علوم رایانه، ۱۳۸۷.