Tidak mungkin untuk mengimplementasikan fungsi panggilan semantik tanpa menggunakan semacam tumpukan. Hanya dimungkinkan untuk memainkan permainan kata (mis. Gunakan nama lain untuk itu, seperti "buffer pengembalian FILO").
Dimungkinkan untuk menggunakan sesuatu yang tidak mengimplementasikan semantik fungsi panggilan (misalnya gaya kelanjutan lewat, aktor), dan kemudian membangun semantik fungsi panggilan di atasnya; tetapi ini berarti menambahkan semacam struktur data untuk melacak di mana kontrol dilewatkan ketika fungsi kembali, dan bahwa struktur data akan menjadi tipe tumpukan (atau tumpukan dengan nama / deskripsi yang berbeda).
Bayangkan Anda memiliki banyak fungsi yang semuanya dapat saling memanggil. Pada saat run-time, setiap fungsi harus tahu ke mana harus kembali ketika fungsi keluar. Jika first
panggilan second
maka Anda memiliki:
second returns to somewhere in first
Kemudian, jika second
panggilan third
Anda memiliki:
third returns to somewhere in second
second returns to somewhere in first
Kemudian, jika third
panggilan fourth
Anda memiliki:
fourth returns to somewhere in third
third returns to somewhere in second
second returns to somewhere in first
Karena setiap fungsi dipanggil, lebih banyak informasi "tempat kembali" harus disimpan di suatu tempat.
Jika suatu fungsi kembali, maka informasi "tempat kembali" digunakan dan tidak lagi diperlukan. Misalnya, jika fourth
kembali ke suatu tempat di third
kemudian jumlah informasi "tempat untuk kembali" akan menjadi:
third returns to somewhere in second
second returns to somewhere in first
Pada dasarnya; "semantik fungsi panggilan" menyiratkan bahwa:
- Anda harus memiliki informasi "tempat untuk mengembalikan"
- jumlah informasi bertambah ketika fungsi dipanggil dan dikurangi ketika fungsi kembali
- bagian pertama dari "tempat untuk kembali" informasi yang disimpan akan menjadi bagian terakhir dari "tempat untuk kembali" informasi yang dibuang
Ini menjelaskan buffer FILO / LIFO atau tumpukan.
Jika Anda mencoba menggunakan jenis pohon, maka setiap simpul di pohon tidak akan pernah memiliki lebih dari satu anak. Catatan: simpul dengan banyak anak hanya dapat terjadi jika suatu fungsi memanggil 2 fungsi atau lebih pada saat yang sama , yang membutuhkan semacam konkurensi (mis. Utas, fork (), dll) dan itu tidak akan menjadi "semantik fungsi panggilan". Jika setiap simpul di pohon tidak akan pernah memiliki lebih dari satu anak; maka "pohon" itu hanya akan digunakan sebagai buffer FILO / LIFO atau tumpukan; dan karena itu hanya digunakan sebagai buffer FILO / LIFO atau tumpukan, cukup adil untuk mengklaim bahwa "tree" adalah tumpukan (dan satu-satunya perbedaan adalah permainan kata dan / atau detail implementasi).
Hal yang sama berlaku untuk setiap struktur data lain yang dapat digunakan untuk mengimplementasikan "fungsi panggilan semantik" - itu akan digunakan sebagai tumpukan (dan satu-satunya perbedaan adalah permainan kata dan / atau detail implementasi); kecuali jika rusak "fungsi panggilan semantik". Catatan: Saya akan memberikan contoh untuk struktur data lain jika saya bisa, tetapi saya tidak bisa memikirkan struktur lain yang sedikit masuk akal.
Tentu saja bagaimana stack diimplementasikan adalah detail implementasi. Ini bisa berupa area memori (di mana Anda melacak "stack top saat ini"), itu bisa berupa semacam daftar yang ditautkan (di mana Anda melacak "entri saat ini dalam daftar"), atau itu dapat diterapkan di beberapa cara lain. Juga tidak masalah apakah perangkat keras memiliki dukungan bawaan atau tidak.
Catatan: Jika hanya satu doa dari prosedur apa pun yang dapat aktif setiap saat; maka Anda dapat secara statis mengalokasikan ruang untuk informasi "tempat kembali". Ini masih berupa tumpukan (mis. Daftar entri yang dialokasikan secara statis yang digunakan dengan cara FILO / LIFO).
Perhatikan juga bahwa ada beberapa hal yang tidak mengikuti "fungsi panggilan semantik". Hal-hal ini termasuk "semantik yang berpotensi sangat berbeda" (mis. Kelanjutan lewat, model aktor); dan juga menyertakan ekstensi umum ke "semantik fungsi panggilan" seperti konkurensi (utas, serat, apa pun), setjmp
/ longjmp
, penanganan pengecualian, dll.