Programcılıkta Sıfırdan Başlama Kuralı

Anlam Ayrımı Bulunmuyor.

2016 yılında @freeman tarafından açılan bu başlık 1 entry ile zenginleşti ve 530 defa ziyaret edildi.

5 dakikada okunabilir.
Matematikteki aritmetik ile ilgili çok basit bir sebebe dayalıdır ve performans kazanmak için uygulanır. Programcılık bilginiz varsa bir örnek vererek açıklamaya çalışayım;

Şimdi sıradan bir dizi değişken * düşünelim;

C dilinde şöyle tanımlarız;

int dizi<bkz user="" entry-id="" space="" meaning=""> 3 </bkz>;

Bu tanımlamayı yazdığımızda, atıyorum; belleğin 12 numaralı adresinden başlanır, 3 tane integer uzunluğunda alan, bellekte bizim için rezerve edilir. (henüz içine veri yazmadık ama olsun, ayrılır)

Listedeki elemanlara ulaşmak istediğimizde şu numaraları kullanarak 3 elemana da ulaşabiliriz; 0, 1, 2

Ben listenin ortadaki elemanına ulaşmak istersem derleyicinin yapacağı işlem şöyle;

Dizi isimli değişken için bellekte yer ayrılınca, hangi adresten itibaren başladığı bir kenara saklanır, buna istediğimiz an ulaşabiliyoruz. Integer veri tipinin bellekte ne kadar alan harcayacağı, bu işe bakan header dosyası içinde tanımlı. Dizinin eleman numarasını da programı yazarken biz verdik yani 1'inci elemanı * istiyoruz dedik. Derleyici şöyle bir formül uygular;

dizi değişkenin başlangıç adresi + istenen elemanın sıra nosu * integer bit uzunluğu;

Yani dizi isimli array'ın bellekte başladığı adresi alıp; programcının istediği indeks numarası ile veri türünün varsayılan bit uzunluğunun çarpımını buna eklersek, ulaşmak istediğimiz dizi elemanı için bir başlangıç adresi hesaplamış oluruz. Bitiş adresi de elemanın veri türü için tanımlanan bit uzunluğu kadar ilerisi olacak. Böylece dizinin istenen elemanı için bir a ve b noktası tespit etmiş olduk. Farkındaysanız bu bilgiyi bir yere saklayıp alan harcamadık, sadece ihtiyaç duyduğumuz anda işlemciye bir kaç sayı verip hesaplattırarak elde ettik. Ancak hala 0 (sıfır) ile başlama zorunluluğuna gelemedik ama geleceğiz, az kaldı.

Gelin az önceki formülü temsili bellek adresleri ve sayılar kullanarak yerine yazıp deneyelim;

dizi isimli array'ın bellekteki başlangıç adresi: 12 olsun;
dizinin istenen elemanı: 1 olsun * ;
integer veri tipinin bit uzunluğu: 16 olsun;

dizi elemanının başlangıç adresi = 12 + 1 * 16 = 28;

Böylece belleğin 28 numaralı adresinden başlayıp 28 + 16 = 44 numaralı adrese kadar olan bilgiyi alırsak, dizi isimli array'ın ortadaki elemanının tuttuğu veriye ulaşmış oluruz. Ne güzel değil mi elimizde bellek haritamız olmadığı halde ihtiyaç duyduğumuz anda haritamızı kendimiz hesaplayabiliyoruz. Buraya kadar her şey normal, güzel. Senaryoya devam ediyoruz;

Sıfırı başlangıç kabul etmenin mantığı nedir peki? Array'den veri istediğimiz indeks sıfır olunca formül hangi şekle giriyor görelim;

dizi elemanının başlangıç adresi = 12 + 0 * 16 = 12;

Yani kısaca sıfırın matematikte yutan eleman olma özelliğinden faydalandık. Sıra numarası ve veri tipinin varsayılan uzunluğu birbirini götürünce geriye array'ın başlangıç adresi kalıyor. Dolayısıyla bir dizinin sıfırıncı elemanını istemek matematiksel olarak array'ın başlangıç adresini istemek etkisi yaratmış. Bence bir taşla 2 kuş vuran güzel bir hareket.

Hala sıfırdan başlamanın avantajını kavramamış olabilirsiniz; gelin bir de sıfırdan değil de 1'den başlasaydık ne kaybımız olurdu ona bakalım;

Eleman sıra numaraları şu şekilde olacaktı: 1, 2, 3

program yazma şeklimiz şöyle;

dizi<bkz user="" entry-id="" space="" meaning=""> 1 </bkz>;

Burada ilk elemanı istiyoruz, yani eski sisteme göre sıfırıncı eleman.

Bellek adresleri değişmeyecektir biz sadece isyan edip sıfırdan başlayan sistemi değiştirdik. Yani dizi isimli array hala bellekte 12 numaralı adresten başlar, elemanları aynı oldukları yerde durmakta. Bunları değiştirmemiz mümkün değil çünkü mesela integer tipini temsil etmek için gereken bit miktarını değiştiremeyiz. Bunlar en temel mantıksal-matematiksel kanunlardır. O halde formülümüzü değiştirmemiz gerekecek;

dizi elemanının başlangıç adresi = 12 + <bkz type="short" space=" "> 1-1 </bkz>* 16 = 12;

Şimdi de ortadaki elemanı, yani eski sisteme göre pozisyonu 1, yeni sisteme göre 2 olan elemanı yeni sisteme uygun biçimde istediğimizde formül;

dizi elemanının başlangıç adresi = 12 + <bkz type="short" space=" "> 2-1 </bkz>* 16 = 28;

Gördüğünüz gibi işlem sonuçları sıfırdan başladığımız sistemle aynı; yani dizinin ilk elemanı hep 12'den başlıyor, ortadaki elemanı da hep 28 numaralı bellek adresinden başlıyor. Değişen tek şey parantez içine aldığımız fazladan bir çıkarma işlemi oldu. Bu da işlemciye her seferinde fazladan bir işlem yükü bindirmiş oldu. Olsun.

Yaptığımız program, 4 işlem yapan basit bir hesap makinesi olsaydı bu dezavantajı kabul edebilirdik sonuçta işlemciler canavar gibiler ama bunun bir hesap makinesi değil de video kodlayan bir yazılım veya Crysis 3 filan olduğunu düşünün! İşlemciye bindireceği yükü düşünün.

İşte meşhur sıfırdan başlama zorunluluğu, o fazladan 1 çıkarma işleminden kurtulmak demek. Çünkü sıfır matematikte yutan elemandır.

#programlama