Stack ve Heap Kavramları

Bir yazılımcının tek derdi kodu nasıl okunabilir ya da güzel yazdığı değil derinlerde neler döndüğünü de merak etmesi olmalıdır. Bu metafor üzerinden sizlere açıklamam gereken birkaç kavramın olduğunu düşünüyorum. Peki Computer Science (Bilgisayar Bilimleri) eğitimi almış bir mühendisin birçok derste (Data Structures, Computer Architecture ya da Operation Systems …) karşılaştığı bu yapılardan bahsetmek istiyorum.

Bu kavramlar nedir abi ?. Biz nereye geldik neler oluyor ?. Stack ne Heap ne yenir mi ?. İçilir mi ?.

Stack ve Heap bellekte (ram) bulunan mantıksal yapılardır. Primitif tip dediğimiz int, short, byte, long, decimal, double, float gibi tipler value type (değer tipi) olarak adlandırılır ve stack de tutulur. Çalışma zamanından (runtime) önce bu değerlerin bilinmesi gerekir ve işletim sistemi program çalışmadan önce stack de belirli bir yer ayırır eğer bu bölüm kodu yazan kişi tarafından aşılırsa stack taşma hatası ile (stack overflow) karşılaşılabilir.. Stack de veriler üst üste (LIFO) mantığında dizilir ve sırası gelmeden aradaki bir değer ile işlem yapılamaz. Class type (Sınıf tipi) değişkenler referans tiplerdir referans ettikleri model (referans) stack de değerleri ise heap de saklanır.

Heap ve Stack arasında ki en önemli farklardan birisi heap de veriler karışık bir şekilde saklanır stack de ise artan ya da azalan adres mantığında (big and little endian) çalışır. Buna bağlı olarak heap de ki bir veriye erişmek stack de ki bir veriye erişmeye göre daha maliyetli bir işlemdir. Başka bir farkı ise stack de ki veri hemen silinirken heap de ki veri Garbage Collector (Çöp Toplayıcı) algoritmasına bağlıdır.

Bir diğer konu ise bu bahsettiklerime çok da uzak olmayan Immutable Type (zorunlu , değiştirilemeyen tip). birazdan anlatıcaklarım ile bir örnek yaparak konuyu bağlamayı düşünüyorum.

Haydaaaaa ! nerden çıktı şimdi bu Immutable Type.

String tipi birçok programlama dilinde var ve primitif bir tip değil birer obje tipidir ve aynı zamanda immutable bir tipdir. Ne demek istiyorum.

Yukarı da gördüğünüz üzere java da bir string değişken tanımlanmış ve değer atılmış.

ardından değişkenin değeri değiştirilmiş (ekleme yapılmış) ve obje referansı değişmiş bu string tipinin immutable olduğunu gösterir yani değerini değiştiremezsiniz demek istiyor ve bunun yerine yeni bir obje oluşturup eski objeyi çöp toplayıcısına bırakıyor.

Buna bağlı olarak stack de oluşturulan bir değişkene değer atıldığında ve sonradan aynı değer stack de bulunan farklı bir değişkene atıldığında dinamik oluşamayacağı için birbirinde habersiz iki farklı değişken mantığında çalışır. Fakat heap alanında ise bir obje oluşturulduğunda ve daha sonradan aynı değere sahip farklı bir obje oluşturulduğunda heap alanı zaten böyle bir obje bende var bir daha oluşturmayacağım senin tipini bu objeye referans ediyorum sende rahat et bende rahat edeyim der. :)

Anlatmak istediklerim kısaca bu kadar umarım faydalı olmuştur, görüş , düşünce ve eleştirilerinizi paylaşırsanız memnun olurum.

Esen kalın..

Kaynaklar : Stack and Heap , Immutable Object , Big and Little Endian