Yazan : Şadi Evren ŞEKER
Bilgisayar bilimlerinde, programlama dillerinde bir değişkenin tanımlandığı hafıza alanı ve değişkenin hafızada tutuluş biçimi farklılık gösterir. Dilin tanımına göre değişkenlerin hafızaya (RAM) işlenişi ve yaşam süreleri üç farklı şekilde olabilir:

1. Sabit (static)
2. Yığın-Hareketli (stack-dynamic)
3. Yığıt-Hareketli (heap-dynamic)
a. Açıktan Yığıt-Hareketli (Explicit Heap-Dynamic)
b. Gizli Yığıt-Hareketli (Implicit Heap-Dynamic)

Yukarıda görüldüğü üzere yığıt-hareketli tutuluş şeklide iki grupta incelenebilir.

Sabit Değişkenler (Static Variables)

Programın çalışmasından önce hafızaya (RAM) yüklenen ve programın çalışması süresince hep hafızada kalan değişken türleridir. Dolayısıyla bu değişken türlerinin programın içerisindeki yükleme ve kaldırma işlemlerinden etkilenmesi söz konusu değildir. Ayrıca programın çalışması süresince yapılan bütün işlemlerin bu değişkenler tarafından takip edilmesi de mümkündür.

Sabit değişkenlerin bir avantajı hız açısından verimdir (time performance) çünkü değişklerin adres hesaplamaları oldukça basit olmaktadır.

Buna karşılık esneklikten feragat edilmektedir. Yani değişkenler hafızaya çakılmakta ve programın tamamı bitene kadar oynamamaktadırlar. Bu durumda değişkenin kullanımı bitmiş olsa bile hafızada kalır ve yerine başka bir değişkenin yüklenmesi engellenir.

Aşağıda JAVA dilinde yazılmış vir sabit değişkenin (static variable) kullanımı gösterilmiştir:

public class deneme{
   static int nesneSayisi = 0;
   public deneme(){
      nesneSayisi++;
   }
}

Yukarıdaki kod incelendiğinde bir adet sabit değişken tanımlanmıştır (nesneSayisi) ve içine ilk değer olarak 0 değeri verilmiştir. Bu değişken program çalışmaya başlamadan önce hafızaya yüklenecek ve burada kalacaktır. Ardından deneme nesnesinden üretilen bütün nesneler için yapıcı fonksiyon (constructor function) çalışacak ve nesneSayisi değişkenini 1 arttıracaktır. Bu durumda nesneSayisi değişkeni, deneme nesnelerinin birer parçası olmadığı için her nesne üretilmesi ile birlikte bir kere daha hafızaya yüklenmeyecek bunun yerine hafızada sabit kalacaktır.

Sonuç olarak deneme sınıfından (class) üretilen her nesne (object) için nesneSayisi’nın değeri bir artacak ve sonuçta nesneler hafızada bulunsa da bulunmasa da o ana kadar üretilmiş olan nesne sayısını tutacaktır.

Yığın-Hareketli Değişkenler (Stack-Dynamic Variables)

Bir programlama dilinin tasarımında kullanılan değişken tutma tipidir. Basitçe değişken hafızaya çalışma sırasında (run-time) yüklenir. Ancak değişken hafızada sabit (static) olarak kalır ancak içeriği zamanla değişebilir.

Temel olarak JAVA ve C++ gibi dillerde nesne atıflarının (object referrer) tamamı bu hafıza şeklinde tutulmaktadır. Örneğin aşağıdaki JAVA satırını ele alırsak:

insan ali;
ali= new insan();

“ali” isminde bir değişken, insan tipinden bir nesneyi gösterecek şekilde tanımlanmıştır. Yani ali değişkeni bir nesne atıfıdır. (object referrer). İşte yukarıdaki bu tanımlamada ali değişkeni yığın-hareketli değişken olarak tanımlanmış ve hafızanın yığın (stack) olarak kullanılan bölgesine yerleştirilmiştir.

Açık-Yığıt Hareketki Değişkenler (Explicit-Heap Dynamic Variables)

Bu değişken tipi ise, programcı tarafından açıkça belirtilerek kullanılabilen ve hareketli olarak (dynamic) ayrılarak geri bırakılabilen alanlardır. Programlama dillerinde dinamik hafıza yönetimi (dynamic memory management) özelliği sayesinde hafızanın istenilen boyutta programcı tarafından ayrılması (allocate) mümkündür. Örneğin C ve C++ dillerinde malloc,ralloc veya calloc fonksiyonları ile bu işlem programcı tarafından yapılabilir.

JAVA , C++ ve C# gibi dillerde ise bu iş için özel olarak kullanılan new komutu bulnmaktadır. Örneğin aşağıdaki kodu inceleyelim:

insan ali;
ali= new insan();

Yukarıdaki kodun ilk satırında bir nesne atfı tanımlanmış ve ali ismindeki bu atıfın insan tipinden nesneleri gösterebileceği belirtilmiştir. İkinci satırda ise new komutu ile insan sınıfından (class) bir nesne (object) tanımlanmış ve bu nesneyi ali isminde nesne atıfı göstermiştir.

İşte yukarıdaki kodun ikinci satırında oluşturulan bu yeni nesne hafızada heap ismi verilen bölgeye yerleştirilir. Daha doğrusu bu bölgede ileride içerisine veri konulması için yeterli yer ayrılır.

Kapalı-Yığıt Hareketli Değişkenler (Implicit-Heap Dynamic Variables)

Bu değişken tipi genellikle programlama dili içerisinde dinamik olarak oluşturulan ancak özel bir şekilde programcının belirtmesine gerek duyulmayan yapıları ifade eder.

Örneğin C veya C++ dillerinde bulunan union yapısı buna bir örnektir. Bir değişkenin tipi union şeklinde tanımlandığı zaman bu değişkenin değerinin heap (yığıt) içerisinde tutulması tasarlanır ancak burada özel bir tanım gerekmez.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir