Thread overview
Matematiksel işlemlerle ilgili bir soru ve taşma
Oct 23, 2017
cos00kun
Oct 23, 2017
cos00kun
Nov 09, 2017
Salih Dinçer
Nov 09, 2017
cos00kun
October 23, 2017

Diyelimki şöyle bir kodumuz var;

....
....
uint sayi;
sayi=sayi.max;
sayi=(sayi * 2) / 5;
...
...

Burada derleyici işlem yaparken öncelikle sayi*2 i yaptığında register yada hafızada bu ilk hesabı nereye atıyor ? stack bölgesindemi yer alıyor ?

Bu soruyu sormamdaki amacım taşma konularını iyice özümsememle ilgili.. eğer önce (sayi * 2) bu hesap yapılıp stacke atılıyorda ardından "../5" işlemi yapılıp sayı değişkenine atanıyorsa bu durumda neden taşma olsun ? eğer bu ilk işlem sayi değişkenine atanıyorsa zaten taşma normal diye düşünüyorum.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 23, 2017

Ali hocam bazan sorumu yada derdimi anlatabilirimmi diye uzun uzadıya birşeyler karalıyor ardından mesajı paylaştıktan sonrada tam olarak anlatabildim mi yada anlaşılacak mı diye düşünüyorum ancak görüyorumki tamda istediğim sorunun cevabını mükemmel sadelikte söyleyiveriyosunuz :) bunu için çok ama çok teşekkürler..

Şimdi sizin çokta güzel ifade ettiğiniz gibi "derleyicinin ara işlemler için kullandığı" geçici depolamalarda derleyici bu ara işlemlerdeki sonuçları yine tanımladığımız değişkene mi atarak işlem yapıyor yoksa direk kendisi stack hafızadan bir bölümü okuyup yazıp sonra işlem bittikten sonra boşaltıyor mu acaba ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 23, 2017

Her ifadenin türü belli ve ne yazık ki C dilinden alınmış olduğundan D bu konuda bir düzeltme getirmiyor. Bu kuralları şurada "int terfileri" ve "Aritmetik dönüşümler" bölümlerinde özetliyorum:

http://ddili.org/ders/d/tur_donusumleri.html#ix_tur_donusumleri.terfi,%20tamsay%C4%B1

Asıl kaynak da şurada:

https://dlang.org/spec/type.html#integer-promotions

Yazmaçta (register) da olsa, belleğe yazılmış da olsa, 'sayi * 2' ifadesinin türü uint'tir. Yani, derleyicinin ara işlemler için kullandığı ve daha uzun bir tür yok.

Not: Böyle denemeler için pragma(msg) çok yararlı bir araç:

void main() {
   uint stack;
   pragma(msg, typeof(stack * 2));    // uint yazar
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

October 23, 2017

Programlama dilleri (en azından C, C++, ve D) ara işlemler gibi konulara karışmazlar. Derleyicinin görevi, dil kurallarının etkilerini gösterecek kod üretmektir. Dolayısıyla, bırakalım ara işlemleri, 'stack' değişkeni bile yalnızca yazmaçta yaşayabilir. Hatta, belki de hiç kullanılmayan bir değişken tamamen koddan çıkartılabilir.

Aynı derleyici farklı eniyiyeştirme seçeneklerine göre farklı davranır. Örneğin, '-O' (optimized) seçeneğini ile üretilen kod çok farklıdır.

Buna rağmen, pratikte "bu değişken program yığıtında, öteki heap'te" vs. diyebiliriz çünkü her ne kadar diller derleyiciyi serbest bıraksalar da örneğin yerel değişkenlerin en etkin olarak program yığıtında bulunduklarını biliriz. Örneğin, derleyicinin her mikroişlemcinin sunduğu yığıt yazmacından (SP - stack pointer) yararlanmaması fazla enayilik olur.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 09, 2017

Bunları assemly kodlarına bakarak görebilirsin. Windows'da oluyor mu bilmiyorum ama Linux'da derlerken (sanırım GCC'den gelen) assembly kütüğünü kaydetme olanağı var.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 09, 2017

Assembly kodlarına windowsta VS den bakılabiliyor sanırım zaten bakılamassa da problem değil benim daha önceki yıllarda kullandığım birkaç debugger var bunlarla bayraklar dahil her adımı çok rahat izleyebiliyorum ama bunları yapmak aklıma sonra geldiği için soruyu da sormuş bulundum :)
İlgi için teşekkürler..

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]