Call Stack
Call Stack (Tumpukan Panggilan) adalah struktur data mendasar yang digunakan oleh mesin pengeksekusi bahasa pemrograman (seperti V8 Engine di JavaScript atau JVM di Java) untuk melacak eksekusi fungsi secara aktif. Melalui mekanisme ini, komputer tahu fungsi mana yang sedang berjalan, di mana ia dipanggil, dan ke mana harus kembali setelah fungsi tersebut selesai.
1. Konsep Dasar LIFO (Last In, First Out)
Call Stack bekerja menggunakan prinsip LIFO (Last In, First Out). Artinya, elemen terakhir yang dimasukkan ke dalam tumpukan adalah elemen pertama yang akan dikeluarkan.
2. Anatomi Stack Frame
Setiap kali sebuah fungsi dipanggil, sistem membuat sebuah kotak memori baru di dalam stack yang disebut Stack Frame (atau Activation Record). Setiap Stack Frame menyimpan informasi penting berikut:
- Parameter / Argumen: Nilai yang dilewatkan ke dalam fungsi tersebut.
- Variabel Lokal: Variabel yang dideklarasikan di dalam ruang lingkup (scope) fungsi tersebut.
- Return Address (Alamat Kembali): Koordinat baris kode asal yang memanggil fungsi tersebut, agar program tahu harus melanjutkan ke baris mana setelah fungsi selesai.
3. Simulasi Eksekusi Program (Step-by-Step)
Perhatikan potongan kode sederhana berikut:
function sapa(nama) {
console.log("Halo, " + nama);
}
function main() {
sapa("Rudi");
}
main();
Berikut adalah perjalanan Call Stack saat kode di atas berjalan:
- Global Context: Saat file dijalankan, sistem membuat Global Execution Context dan memasukkannya ke stack paling bawah.
Stack: [ Global ] - Memanggil main(): Program memanggil fungsi
main(). Sistem membuat Stack Frame untukmain()dan menaruhnya di atas Global.
Stack: [ Global, main() ] - Memanggil sapa("Rudi"): Di dalam
main(), program memanggilsapa(). Stack Frame baru untuksapa()ditumpuk di atas.
Stack: [ Global, main(), sapa() ] - Menjalankan console.log: Fungsi
sapa()memanggilconsole.log(). Ditumpuk sementara di atas.
Stack: [ Global, main(), sapa(), console.log() ] - Selesai console.log: Tulisan muncul di layar,
console.log()selesai dan dikeluarkan dari stack.
Stack: [ Global, main(), sapa() ] - Selesai sapa(): Blok fungsi
sapa()berakhir, dikeluarkan dari stack. Program kembali ke baris setelah pemanggilannya di dalammain().
Stack: [ Global, main() ] - Selesai main(): Fungsi
main()selesai dan dikeluarkan. Terakhir, global context dibersihkan saat program ditutup.
Stack: [ ] (Kosong)
4. Apa itu "Stack Overflow" dan Cara Menghindarinya
Karena ukuran memori Call Stack terbatas, ia memiliki batas maksimum penumpukan frame. Jika program memanggil terlalu banyak fungsi secara berturut-turut tanpa mengeluarkan frame lama, tumpukan akan meluap. Hal ini paling sering terjadi pada **Rekursi Tanpa Batas** (fungsi memanggil dirinya sendiri terus-menerus tanpa henti):
function panggilTerus() {
panggilTerus(); // Error: RangeError: Maximum call stack size exceeded
}
panggilTerus();
Solusi: Selalu sediakan Base Case atau kondisi berhenti yang jelas pada setiap fungsi rekursif agar stack frame memiliki kesempatan untuk diselesaikan dan dibersihkan dari memori.
Uji Pemahaman Mandiri
Manakah dari situasi berikut yang paling mungkin menyebabkan error "Stack Overflow"?
