یکی از مهمترین ساز و کارهایی که باید از سوی دانشجویان علوم کامپیوتر درک گردد پشتهی فراخوانی تابع است (گاهی اوقات تحت عنوان پشتهی اجرای برنامه نیز شناخته میشود). این ساختمان داده – که در پشت صحنه کار خود را انجام میدهد – ساز و کار فراخوانی و بازگشت توابع و همچنین ایجاد، نگهداری و انهدام متغیرهای خودکار توابع فراخوانیشده را نیز پشتیبانی میکند.
برای درک نحوهی انجام فراخوانی تابع در زبانهای برنامهنویسی ابتدا باید به بررسی یک ساختمان داده به نام پشته (Stack) بپردازیم. پشته را میتوانید مانند تعدادی بشقاب که روی هم قرار گرفتهاند در نظر بگیرید. هنگامی که یک بشقاب بر روی این توده قرار داده میشود، معمولا در بالای بشقابها گذاشته میشود (به این عمل گذاشتن یا پوش push کردن بشقاب در پشته میگویند). به طور مشابه، هنگامی که یک بشقاب از توده برداشته میشود، معمولا از بالای بشقابها برداشته میشود (به این عمل برداشتن یا پاپ pop کردن بشقاب از پشته میگویند). پشتهها به عنوان ساختمانهای دادهای LIFO (Last-In, First-Out) شناخته میشوند یعنی آخرین آیتمی که در پشته گذاشته میشود (push) اولین آیتمی است که از پشته برداشته میشود (pop). همانطور که در تصویر میبینیم، این رفتار LIFO دقیقا همان کاری است که تابع، زمان بازگشت به تابع فراخوانندهی خود انجام میدهد.
هنگامی که یک تابع فراخوانی میشود، ممکن است قبل از آنکه مقداری را بازگرداند، توابع دیگری را فراخوانی کند، به همین ترتیب این توابع نیز ممکن است پیش از بازگردان یک مقدار به تابع فراخوانندهی خود، توابع دیگری را فراخوانی کنند. هر تابع در نهایت باید کنترل را به تابع فراخوانندهی خود باز گرداند. بنابراین، باید آدرسهای بازگشت را که هر تابع برای بازگرداندن کنترل به تابع فراخوانندهی خود به آنها نیاز دارد پیگیری و حفظ نماییم. پشتهی فراخوانی تابع یک ساختمان دادهی کامل برای ادارهی این اطلاعات است.
هر زمان که یک تابع اقدام به فراخوانی تابع دیگر میکند، یک ورودی به داخل پشته push میشود. این ورودی، یک قاب پشته (Stack Frame) یا یک رکورد فعالسازی (activation record) نامیده میشود و حاوی آدرس بازگشتی است که تابع فراخواندهشده برای بازگشت به تابع فراخوانندهی خود به آن نیاز دارد. قاب پشته حاوی یک سری اطلاعات دیگر نیز هست که به زودی در مورد آنها بحث خواهیم کرد. اگر تابع فراخواندهشده، بجای فراخوانی تابع دیگری قبل از بازگشت، به مکان فراخوانی شدنش بازگردد، قاب پشتهی فرخوانی تابع pop میشود و کنترل به آدرس بازگشت، در قاب پشته pop شده منتقل میگردد.
از مزایای پشتهی فراخوانی این است که هر تابع فراخوانیشده اطلاعات مورد نیاز خود برای بازگشت به فراخوانندهی خود را در بالای پشتهی فراخوانی مییابد و اگر یک تابع یک فراخوانی به تابع دیگری انجام دهد، یک قاب پشته برای فراخوانی تابع جدید در پشتهی فراخوانی push میشود. بنابراین، آدرس بازگشت مورد نیاز برای بازگشت تابع جدیدا فراخوانیشده به فراخوانندهی خود اکنون در بالای پشته قرار گرفته است.
قابهای پشته یک وظیفهی مهم دیگری نیز بر عهده دارند. اغلب توابع دارای متغیرهای خودکار مثل پارامترها و متغیرهای محلی که تابع اعلان مینماید، هستند. متغیرهای خودکار باید در زمان اجرای یک تابع وجود داشته باشند. این متغیرها حتی اگر تابع اقدام به فرخوانی توابع دیگر نماید نیز باید در حالت فعال باقی بمانند. البته هنگامی که یک تابع فراخواندهشده به فراخوانندهی خود بر میگردد، متغیرهای خودکار تابع فراخواندهشده باید از بین بروند. قاب پشتهی تابع فراخواندهشده یک مکان کامل و مطلوب جهت رزرو حافظه برای برای متغیرهای خودکار تابع فراخواندهشده است. این قاب پشته مادامی که تابع فراخواندهشده فعال است وجود دارد. هنگامی تابع فراخواندهشده به فراخواننده خود بر میگردد و دیگر نیازی به متغیرهای خودکار محلی خود ندارد، قاب پشتهی آن از درون پشته pop میشود، در این حالت متغیرهای خودکار محلی برنامه، دیگر شناخته شده نیستند.
البته میزان حافظه در یک کامپیوتر محدود است، از این رو تنها میزان مشخصی از حافظه میتواند برای ذخیرهی رکوردهای فعالسازی در پشتهی فراخوانی تابع بکار برده شود. اگر تعداد فراخوانیهای تابع صورت گرفته بیش از ظرفیت ذخیرهسازی رکوردهای فعالسازی در پشتهی فراخوانی تابع باشد، یک خطا به نام سرریز پشته (Stack Overflow) رخ میدهد.