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.

Analogi Kehidupan Nyata: Bayangkan tumpukan piring di meja prasmanan. Anda menaruh piring kotor satu per satu ke atas. Saat ingin mengambil piring untuk makan, Anda pasti mengambil piring teratas (yang terakhir ditaruh) terlebih dahulu. Anda tidak bisa mengambil piring paling bawah tanpa meruntuhkan tumpukan tersebut.

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:

  1. Global Context: Saat file dijalankan, sistem membuat Global Execution Context dan memasukkannya ke stack paling bawah.
    Stack: [ Global ]
  2. Memanggil main(): Program memanggil fungsi main(). Sistem membuat Stack Frame untuk main() dan menaruhnya di atas Global.
    Stack: [ Global, main() ]
  3. Memanggil sapa("Rudi"): Di dalam main(), program memanggil sapa(). Stack Frame baru untuk sapa() ditumpuk di atas.
    Stack: [ Global, main(), sapa() ]
  4. Menjalankan console.log: Fungsi sapa() memanggil console.log(). Ditumpuk sementara di atas.
    Stack: [ Global, main(), sapa(), console.log() ]
  5. Selesai console.log: Tulisan muncul di layar, console.log() selesai dan dikeluarkan dari stack.
    Stack: [ Global, main(), sapa() ]
  6. Selesai sapa(): Blok fungsi sapa() berakhir, dikeluarkan dari stack. Program kembali ke baris setelah pemanggilannya di dalam main().
    Stack: [ Global, main() ]
  7. 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"?

A. Fungsi rekursif tanpa adanya base case (kondisi berhenti)
B. Mendeklarasikan terlalu banyak variabel bertipe string
C. Mengkoneksikan aplikasi ke database yang lambat

Bangun Karier Sebagai AI Engineer dalam 8 Minggu!

Info Detail
Apa Itu Call Stack? Definisi & Penjelasan | Kamus REA Ruangguru