Forum: D Programlama Dili RSS
Matematiksel işlemlerle ilgili bir soru ve taşma
cos00kun #1
Üye Kas 2014 tarihinden beri · 130 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Matematiksel işlemlerle ilgili bir soru ve taşma
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.
E=mc^2
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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_donusu…

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
cos00kun #3
Üye Kas 2014 tarihinden beri · 130 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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 ?
E=mc^2
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1913 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
cos00kun #6
Üye Kas 2014 tarihinden beri · 130 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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..
E=mc^2
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-12-16, 06:53:30 (UTC -08:00)