Heap dan Stack pada Program Komputer

Artikel kali ini membahas secara singkat perbedaan antara Heap dan Stack dan kaitannya dengan komputer.

Stack dan Heap adalah bagian memori komputer tempat data program disimpan

Dalam program komputer kita mengenal sistem pengodean yang mengacu pada bahasa mesin. Secara alamiah mesin hanya mengerti instruksi-instruksi yang diberikan dalam kode-kode khusus disebut bahasa mesin. Bahasa ini menggunakan sistem bilangan biner (itu lho, rangkaian angka 1 dan o) dengan implementasi 0 adalah tegangan rendah (sekitar 0v hingga 1v) dan 1 adalah tegangan tinggi (tapi meski disebut tegangan tinggi nilainya berkisar 5v). Misalkan angka 2 diterjemahkan dalam biner menjadi 00000010.

Untuk menciptakan sebuah program, seorang programmer menggunakan bahasa pemrograman yang sedikit “manusiawi” daripada bahasa mesin. Bahasa ini adalah bahasa khusus yang digunakan untuk memberikan instruksi kepada mesin. Setelah sang programmer “puas” menulis program dalam bahasa pemprograman, tidak serta merta bahasa tersebut bisa langsung dimengerti oleh mesin. Program itu harus diterjemahkan dulu ke bahasa mesin melalui serangkaian proses bernama kompilasi sehingga dapat dibaca oleh mesin. Hasil akhir proses ini adalah sebuah file yang kita sebut sebagai program. Analogi dari proses ini bisa kita ambil contoh ketika orang Indonesia dan orang Amerika bercakap-cakap. Ketika mereka ngobrol, tentu menggunakan bahasa yang sama bukan? Jika obrolan itu berlangsung dalam bahasa Inggris (disini kita anggap si bule nggak ngerti bahasa Indonesia) maka untuk bisa ngobrol dengan bule tersebut si orang Indonesia harus berbicara juga dalam bahasa Inggris dong. Nah sebelum ngomong dalam bahasa Inggris pasti si orang Indonesia ini akan menerjemahkan kata-kata yang ingin diucapkan dari bahasanya (Indonesia)  ke dalam bahasa Inggris. Jika tidak dilakukan maka saat kita berbicara dalam bahasa Indonesia si bule pasti akan kebingungan dan nggak ngerti.

Nah, dalam kompilasi tersebut sebuah program diciptakan dengan sebuah struktur. Mungkin secara spesifik struktur untuk masing-masing operating system berbeda tapi secara garis besar memiliki beberapa persamaan yaitu pengalamatan memori.

Saat berjalan, sebuah program akan menempati lokasi tertentu di memori. Lokasi ini kemudian dikenal dengan alamat memori. Saat program berjalan, memori akan dibagi menjadi tiga bagian atau tiga segment. Ketiga segment itu adalah:

  1. text (code)
  2. Heap
  3. Stack

Segment text (sering disebut sebagai code segment) adalah tempat kode dari program tersebut (basic instruction) berada. Saat teman-teman membuka file EXE di notepad, teman-teman pasti bisa melihat simbol-simbol yang terkadang tidak terbaca oleh manusia. Bagian itulah merupakan kode-kode bahasa mesin, representasi dari instruksi program. Bagian ini menyertakan semua simbol-simbol yang didefinisikan pengguna ketika menciptakan program (contoh: fungsi-fungsi yang didefinisikan).

Nah, kedua bagian selain code segment digunakan untuk menyimpan data yang akan dioperasikan oleh fungsi-fungsi tersebut. Lantas apa perbedaan antara keduanya (heap dan stack) ? Kan sama-sama berupa data.

Apa itu stack?

Stack adalah salah satu bagian yang digunakan untuk menyimpan data-data atau variabel yang pengalamatan memorinya telah dilakukan saat kompilasi (alamat pastinya sudah ditentukan dari awal). Bingung? Coba bayangkan seperti ini. Pada suatu waktu kita akan memasak. Dalam kegiatan memasak itu terdapat daftar barang-barang yang dibutuhkan seperti alat (pisau, wajan, panci, dsb) dan bahan (ayam, telur, minyak goreng, dsb). Nah ketika kita hendak memasak pasti kita membutuhkan tempat khusus kan? Semisal kita memasak di dapur, maka kita harus menyiapkan tempat untuk menaruh semua alat dan bahan sebelum melakukan kegiatan memasak. Dalam bahasa pemprograman, kegiatan memasak tersebut disebut fungsi (melakukan kerja). Di awal sebelum memasak kita telah membuat daftar apa yang harus kita lakukan. Fungsi tersebut membutuhkan variabel-variabel atau data (alat dan bahan). Untuk memasak kita butuh tempat atau bagian dari dapur untuk menaruh alat dan bahan. Tempat yang kita persiapkan itulah yang disebut stack. Stack ditentukan sejak awal-awal.

Dalam stack, data disimpan menggunakan metode Last In First Out (LIFO). Apa ini? Stack artinya tumpukan (Saya juga tahu artinya mas! ) Maksudnya data yang tersimpan di memori akan dialokasikan dan didealokasikan hanya di akhir memori (dinamakan puncak stack). Hal ini bisa kita analogikan seperti saat kita menumpuk piring. Saat kita menumpuk piring (setelah masak ceritanya nih) kita akan meletakkannya dalam satu tumpukan besar. Nah piring yang pertama kali kita taruh (letaknya di bawah tuh) pasti akan kita ambil terakhir kali karena kita ngambilnya dari atas dulu tuh. Nah alokasi semacam inilah yang diimplementasikan dalam memori komputer. Stack adalah bagian memori yang fungsinya digunakan untuk menyimpan memori bersifat sementara.

Apa itu heap?

Di lain sisi, heap adalah area memori yang digunakan untuk alokasi secara dinamis. Bagian-bagian memori yang dialokasikan dilakukan secara sembarang (no pattern). Maksudnya adalah kode-kode yang akan dieksekusi akan diletakkan pada lokasi penyimpanan dalam memori, namun lokasi ini tidak memiliki pattern atau tidak berpola (acak). Lokasi memori yang ditempati ini tidak akan diketahui sebelum runtime (saat dijalankan). Heap seringkali digunakan program untuk berbagai keperluan. Tapi intinya adalah heap dialokasikan untuk mensuplai memori tambahan yang tidak dialokasikan saat kompilasi. Alokasi ini dilakukan saat runtime, seiring berjalannya program.

Untuk memesan alamat memori, program akan terlebih dahulu melakukan pengecekan terhadap kapasitas memori sesuai besar data yang diperlukan. Jika memori tersedia namun dalam ruang terpisah maka program akan memecah informasi tersebut menjadi bagian-bagian kecil yang dapat menempati memori yang tersedia.

Lalu apa yang sebenarnya benar-benar membedakan heap dengan stack?

Dibandingkan dengan heap, stack terlihat lebih banyak digunakan dalam kaitannya untuk mengalokasikan memori bagi variabel-variabel yang digunakan dalam fungsi. Stack digunakan untuk menyimpan data sementara. Sementara heap diperuntukkan bagi informasi yang menetap dan dialokasikan secara khusus oleh pengguna. Heap digunakan untuk menyimpan data tambahan sesuai permintaan (request data).

Karena memori yang dipakai oleh stack bersifat sementara, maka informasi yang terdapat di alamat stack akan langsung didealokasi secara otomatis ketika scope sebuah program berakhir (udah kadaluarsa, lihat contoh). Sedangkan memori yang dialokasikan pada heap akan tetap bertahan sampai program benar-benar mendealokasikannya.

Heap dan Stack dalam sudut pandang pemprograman

Kebanyakan bahasa yang mendukung OOP memiliki struktur yang telah ditentukan sebelumnya (struktur dasar). beberapa bahasa pemrograman juga memiliki fungsi yang disebut main() fungsi atau fungsi utama (sebut saja C, C++, JAVA dan Pascal meski tidak secara tersurat). Apa sebenarnya fungsi ini? Fungsi ini merupakan fungsi utama dan awal mula program dijalankan (entry point atau starting point). Ketika program dijalankan (kode-kode mulai dieksekusi) program akan mengeksekusi baris-baris instruksi yang terdapat main() terlebih dahulu.

Sebagai contoh setiap program C, C++, ataupun C# dan JAVA memiliki paling tidak memiliki sebuah fungsi yang bernama main(). Mari kita lihat contoh program berikut yang ditulis dalam bahasa C++:

int x;                           /* static stack storage, bersifat global dengan scope seluruh program */
int fungsiku(int x) {
   int var1 = 5;
   return var1*x;
}

void main() {

int y;                        /* dynamic stack storage, scopenya melingkupi fungsi main saja */

char* str;                    /* dynamic stack storage, scopenya melingkupi fungsi main saja */

str = new char[50];        /* Mengalokasikan 50 byte penyimpanan di dynamic heap storage */

int a = fungsiku();                 /* Memanggil fungsi */

}

Saat program dijalankan, bagian pertama yang akan dieksekui adalah fungsi main() meskipun di atasnya terdapat fungsi bernama fungsiku(). Semua variabel yang dideklarasikan di dalam fungsi main() akan disimpan dalam stack. Sebagai contoh adalah variabel y dan str. Kenapa stack? karena pertama kali dideklarasikan mereka menempati ruang yang fix (statis).

Variabel str kemudian mengalokasikan memori secara dinamis untuk memuat 50 slot tipe data char. Memori yang telah dipesan ini diletakkan di heap sedangkan str sendiri karena telah didefinisikan dari awal ia tetap di stack. Kenapa dipesan memori pada heap? Karena ruang kosong memori dipesan secara dinamis pada heap sementara stack hanya menyimpan str yang telah dideklarasikan.

Jika fungsi main() memanggil fungsi lain di dalam program, sebut saja fungsiku() dengan parameter, maka program akan memesan sebuah tempat di memori di heap (dinamis lagi) untuk menyimpan isi dari parameter fungsi tersebut (tidak lain adalah variabel x dengan tipe integer). Ketika fungsiku() dieksekusi, terdapat scope baru yaitu scope fungsiku() dengan variabel var1 terdeklarasi. var1 akan dialokasikan ke dalam stack dan dioperasikan hingga akhir scope fungsiku(). Setelah mengesekusi fungsiku() secara otomatis fungsiku() akan mengembalikan ke fungsi main(). Seketika itu variabel dalam var1 akan didealokasikan karena telah kadaluarsa (keluar scope).

Perhatikan bahwa parameter yang dilewatkan dari main() ke fungsiku() juga disimpan di stack. jika fungsiku() memanggil fungsi tambahan lain, maka akan ada banyak ruang yang dialokasikan pada heap.

Ketika fungsiku() telah melaksanakan tugas, maka ia akan mengembalikan sebuah nilai (lihat fungsiku()). Ruang untuk variabel lokal pada heap kemudian didealokasikan dan heap dapat digunakan untuk fungsi lain.

Memori yang dialokasikan pada area heap dapat digunakan kembali selama eksekusi program.

Perlu diingat bahwa sebelum mengalokasikan memori baru, data lama yang menempati memori harus benar-benar dibersihkan. Jika tidak maka data lama akan tertinggal di heap dan tidak dapat dipakai kembali. Keadaan ini disebut sebagai memory leak (kebocoran memori)

Dalam kaitannya dengan OOP, ruang memori untuk objek selalu diletakkan di heap. Objek selalu terletak di heap. Sedangkan data built-in dari objek seperti int, double, float dan parameter dari method berada di stack.

Meskipun berada di heap, namun referensi ke alamat dari objek juga berupa variabel. Karena itu mereka diletakkan di stack.

Segment stack memberikan kestabilan lebih pada data program. Memori yang dialokasikan pada stack akan eksis hingga akhir scope. Kondisi ini bagus untuk variabel global dan statis. Karena itu variabel global dan statis dialokasikan di stack.

Kenapa stack dan heap begitu penting?

Ketika program diload ke memori, dia akan membutuhkan penanganan memori. Jika manajemen memori tidak ada di memori komputer, program akan clash karena data akan saling bertabrakan tak teratur (saling serobot tempat)

Semoga pembahasan singkat ini dapat menambah ilmu kita.

About these ads

2 Comments

  1. terima kasih postingannya ya..
    salam kenal…
    kunjungi juga blog saya fakultas teknik unand

    • sama2…

      salam kenal juga :D

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

Join 39 other followers

%d bloggers like this: