Jump to page: 1 2 3
Thread overview
July 12, 2010

Şimdi delete yerine clear olmasının pek yararını göremedim.

Kesin bu fikir Andrei'den çıkmıştır. Özellikle fikir sahibine göre yararları ne ?

Ben yararını anlayabilmiş değilim. Zararı olarak bir belki 2 şey tahmin edebilirim :

  1. Çöp toplayıcıyı beklemek kaynak israfı olacak ?

  2. Belki çöp toplayıcıyı sevmeyen insanlar iliklerine kadar donacak(Andrei'nin yazdığı makaleye anımsatmak amaçlı) ?

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

July 12, 2010

Alıntı (canalpay):

>

Şimdi delete yerine clear olmasının pek yararını göremedim.

Kesin bu fikir Andrei'den çıkmıştır. Özellikle fikir sahibine göre yararları ne ?

Ben yararını anlayabilmiş değilim. Zararı olarak bir belki 2 şey tahmin edebilirim :

  1. Çöp toplayıcıyı beklemek kaynak israfı olacak ?

  2. Belki çöp toplayıcıyı sevmeyen insanlar iliklerine kadar donacak(Andrei'nin yazdığı makaleye anımsatmak amaçlı) ?

#d kanalinda oyle boyle degil bayagi giydirdiler andrei'ye. :)

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

July 12, 2010

C++'da dinamik nesnelerin yaşamları new ile başlar, delete ile biter.

new'ün iki işi vardır: nesne için bellek ayırmak ve o belleği nesnenin üyeleri haline getirmek (yani nesneyi kurmak).

delete'in de bunun tersi iki işi vardır: nesnenin sonlandırıcı işlevini çalıştırmak, ve nesnenin belleğini geri vermek.

Bunların ikisi de D'de var. Sınıf nesneleri zaten new ile kurulmak zorundalar, ve new D'de de aynı şekilde çalışıyor. delete ise şaşırtıcı olarak emekliye ayrılmak üzere! :)

Bunun nedeni, D'de çöp toplayıcı olması ve belleğin geri verilmesinin çöp toplayıcının çok temel bir işi olmasıymış. delete'in iki işinden birincisi, yani nesnenin sonlandırıcı işlevinin çağrılması ise 'clear' ile sağlanıyor. Yani belleğin geri verilmesine karışmıyoruz ama çok gereken durumlarda, sonlandırıcı işlevi kendimiz çağırabiliyoruz.

Bir örnek:

import std.stdio;

class Sınıf
{
   int i;

   this(int i)
   {
       this.i = i;
       writeln(i, " kuruldu");
   }

   ~this()
   {
       writeln(i, " sonlandırıldı");
   }
}

void main()
{
   writeln("main'e girildi");

   foreach (i; 1 .. 5) {
       auto nesne = new Sınıf(i);
       // ... nesneyle ilgili işlemler ...
   }

   writeln("main'den çıkılıyor");
}

Yukarıdaki döngüde oluşturulan nesnelerin sonlandırıcıları normalde main'den çıkıldıktan sonra çağrılıyor:

main'e girildi
1 kuruldu
2 kuruldu
3 kuruldu
4 kuruldu
main'den çıkılıyor
4 sonlandırıldı
3 sonlandırıldı
2 sonlandırıldı
1 sonlandırıldı

Hatta, bazı programlarda hiç çağrılmayabiliyor bile. O yüzden belki de sizin ortamınızda "sonlandırıldı" satırlarını göremeyebilirsiniz.

Bazı özel durumlarda, sonlandırıcıyı kendimiz çağırmak istersek clear'i kullanıyoruz:

   foreach (i; 1 .. 5) {
       auto nesne = new Sınıf(i);
       // ... nesneyle ilgili işlemler ...
       clear(nesne);
   }

Çıktının baş tarafı beklediğimiz gibi oluyor, ama garip bir şekilde, sonda hiç oluşturmadığımız 0 numaralı nesnelerin de sonlandırıldığını görüyoruz:

main'e girildi
1 kuruldu
1 sonlandırıldı
2 kuruldu
2 sonlandırıldı
3 kuruldu
3 sonlandırıldı
4 kuruldu
4 sonlandırıldı
main'den çıkılıyor
0 sonlandırıldı
0 sonlandırıldı
0 sonlandırıldı
0 sonlandırıldı

Bunun nedeni, clear'in nesneyi yok etmemesi, ama o türün '.init' durumuna sokmasıymış. Yani nesne sonlandırılıyor, ama yine de boş bir durumda bulunuyor. Daha sonradan çöp toplayıcı karar verdiğinde, aynı nesneyi bir kere daha sonlandırıyor.

İlginç... :)

Tabii aslında nesnenin hemen döngü sonunda sonlanmasını istesek, 'scope' anahtar sözcüğünden de yararlanabilirdik, ve belki de daha doğru olurdu:

   foreach (i; 1 .. 5) {
       scope auto nesne = new Sınıf(i);
       // ... nesneyle ilgili işlemler ...
   }

O durumda çıktıda 0 numaralı sonlandırmaları görmezdik:

main'e girildi
1 kuruldu
1 sonlandırıldı
2 kuruldu
2 sonlandırıldı
3 kuruldu
3 sonlandırıldı
4 kuruldu
4 sonlandırıldı
main'den çıkılıyor

O da her duruma uygun değildir; çünkü scope nesnelerin o döngünün dışında yaşamaları olanaksızdır. Bence kurallar şöyle olmalı:

  1. Eğer özel bir nedeni yoksa nesnenin sonlanması ile ilgili hiçbir şey yapmamalı

  2. Eğer sonlandırıcının nesneye gerek kalmadığı zaman hemen çağrılması gerekiyorsa, öncelikle 'scope' düşünülmeli

  3. Eğer olmuyorsa, nesnenin işi bittiğinde 'clear' çağrılmalı

Ali

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

July 12, 2010

Bana hiç öyle sohbetler denk gelmiyor. Ben kendim böyle bir sohbet açayım dedim elime yüzüme bulaştırdım :-D

clear için ne düşünüyorsunuz diye sordum. Sonra bilgisayarı yeniden başlatmak zorunda kaldım ve sanırım o sırada birbirlerine girdiler.( Yine göremedim :-D , ben sorup kaçtı gibi gözükünce heycan yaptılar :-D ) Hemen sohbeti açtım ve bu soruyu kim sordu dediklerini gördüm ve ardından canalpay lafı geçti :-) Daha sonra sanırım benim için ortalığı karıştıran biri sandılar :-) Bende; konuşmalarınızı takip edemedim, ingilizcemde iyi değil, eğer birbirinize düşürdüysem özür dilerim yazdım :-)

Daha sonra : sadece teknik olarak iyi kötü özelliklerini öğrenmek istedim, eğer birbirinize düşürdüysem özür dilerim diye yazdım.

Ondan sonra biri benim için ortalığı karıştıranlardan biri diye yazan birine şunu yazdı :
Ben senden nefret ediyorum ve Canalpay'ın bütün hatası D.
Daha sonra banada terlemek yok arkadaş, rahatla yazdı.
Ondan sonra benim için ortalığı karıştıran kişi diyen kişide "insanları seviyorum!" dedi. :-)

Daha sonra akıllarına clear ne demek diye sormak geldi. :-D
Filan...

Ben anladım. Yabancılara soru sorulmuyor.

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

July 12, 2010

clear, yalnızca sonlandırıcı işlevi çağırıyor; delete ise hem sonlandırıcı işlevi çağırıyor, hem de belleği geri veriyor. Fikir şu: belleğin geri verilmesi çöp toplayıcının kendi işi olmalıdır.

Çöp toplayıcılı bir ortamda en iyisi, bildiğimiz gibi, dinamik değişkenleri çöp toplayıcıya bırakmaktır. Bu, değişkenin sonlandırıcısının belirsiz bir zamanda çağrılacağı ve kullandığı belleğin belirsiz bir zamanda geri verileceği anlamına geliyor.

Çoğu durumda bunun hiçbir sakıncası yoktur. Hatta temizlik işlemlerinin bir çok değişken için hep birden yapılması aslında zaman kazancı da sağlıyor. Şu Digital Mars makalesinde çöp toplayıcının yararları gösteriliyor:

http://digitalmars.com/d/2.0/garbage.html

Nadir durumlarda ise, sonlandırıcı işlevin belirli bir anda çağrılması önemli olabiliyor; işte clear o zaman çağrılmalı. Buraya kadar güzel...

Bundan sonra bir seçenek şu olabilirmiş: çöp toplayıcıya "bu nesneyi biz sonlandırdık, sen bir daha sonlandırma" gibi bir not bırakılabilirmiş. Bu da doğal olarak çöp toplayıcıyı biraz daha karmaşıklaştırırmış. Onun yerine, nasıl olsa böyle nesneler nadir olduklarından, "onları .init durumuna sokalım, sonlandırıcıyı bir de çöp toplayıcı bu .init durumdaki nesne üzerinde çağırsın" diye düşünülmüş olmalı. Çöp toplayıcının özel bir iş yapması gerekmez; çünkü o zamanı gelince o nesneyi sonlandırır ve belleğini geri verir. Ayrıca, her değişken için "bu zaten sonlandırılmış mı" gibi bir denetim de gerekmez.

Çöp toplayıcıyı sevmemek için geçerli nedenleri araştırmak gerekir. Eğer gerçekten gerekiyorsa, çöp toplayıcıyı belirli bir süre için bütünüyle kapatmak da mümkün. Şu makaleyi çevirmişim ama unutmuşum: :D

http://ddili.org/makale/bellek.html

Orada çöp toplayıcının .disable ile nasıl kapatıldığına değiniliyor. (Makale D2 için eski kalmış olabilir; kodları şimdi denemedim.)

Ali

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

July 12, 2010

Alıntı (Mengu):

>

#d kanalinda oyle boyle degil bayagi giydirdiler andrei'ye. :)

O kanalda belden aşağı sohbetler de çıkınca artık açmamaya başladım. İş başında iş bilgisayarında o tür sohbetleri neden izlediğimi anlatmak zor olabilir... :)

Mengü, o kanaldaki bazı eleştirileri bu foruma kopyalar mısın. Sen veya ben Türkçe'ye çeviririz...

Digital Mars haber gruplarının da bir delisi var. Özellikle Walter Bright'a çok sataşıyor. Benim tahminim, belki de eskilerden bir kuyruk acısı var... Acaba #d'deki gazcılardan birisi o mu? Çok belirgin bir sataşma tarzı var. Eğer bize gösterirsen, o olup olmadığını anlayabiliriz.

Ali

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

July 12, 2010

misal soyle gostereyim:

Alıntı:

>

Mon Jul 12 2010] [09:16:50] Topic The topic was set by h3!~heretic@team0xf.com on 06/13/2010 02:13:39 PM.
[Mon Jul 12 2010] [09:17:15] the problem is that Andrei is still deeply stuck into his C++ thinking
[Mon Jul 12 2010] [09:17:35] he can't help it but making D more C++ like to get comfortable
[Mon Jul 12 2010] [09:17:44] wm4: I'm "stuck" into C++ too. It's my favourite language
[Mon Jul 12 2010] [09:17:46] instead of adapting to the D way
[Mon Jul 12 2010] [09:18:00] so, letting a beginner of a language gain control over a language == bad idea
[Mon Jul 12 2010] [09:18:00] but i don't want D to be like C++
[Mon Jul 12 2010] [09:18:13] Mode Channel modes: no messages from outside, topic protection
[Mon Jul 12 2010] [09:18:14] Created This channel was created on 11/26/2006 08:42:43 AM.
[Mon Jul 12 2010] [09:18:32] well, at least C++ has delete rolls eyes
[Mon Jul 12 2010] [09:19:22] I also imagine Andrei has experienced too many dangling pointer issues in C++ and that's why he wants delete to go ;D
[Mon Jul 12 2010] [09:20:19] then by all means, make your own functions and add them to the standard library. make it like boost in fact, that will already be great!
[Mon Jul 12 2010] [09:20:37] but DO NOT REMOVE IMPORTANT KEYWORDS
[Mon Jul 12 2010] [09:20:53] Java has a new but no delete: that is retarded
[Mon Jul 12 2010] [09:21:03] if there's one keyword I want to go it's "body"
[Mon Jul 12 2010] [09:21:12] what is body for?
[Mon Jul 12 2010] [09:21:38] contracts: void foo() in { /+ in code +/ } body { /+ real code +/ } out { /+ out code +/ }
[Mon Jul 12 2010] [09:22:14] hmmmm
[Mon Jul 12 2010] [09:22:23] you think body is unnecessary there?
[Mon Jul 12 2010] [09:22:31] in {} {} out {}
[Mon Jul 12 2010] [09:22:46] Andrei saiz: "I don't think writing clear(obj) is more taxing that writing delete obj. "
[Mon Jul 12 2010] [09:22:58] Andrei is an asshole
[Mon Jul 12 2010] [09:23:00] ptDDev: I don't think it's optional here
[Mon Jul 12 2010] [09:23:15] ptDDev: and this case is the only use of the body keyword
[Mon Jul 12 2010] [09:23:27] well, it does have the advantage of allowing people to write the three cases in any order
[Mon Jul 12 2010] [09:23:36] Andrei doesn't seem to understand the problem, or it's a non-problem for him
[Mon Jul 12 2010] [09:23:36] in{} out{} body{} for example
[Mon Jul 12 2010] [09:23:47] pfffft
[Mon Jul 12 2010] [09:23:56] I never liked that contracts syntax anyway
[Mon Jul 12 2010] [09:23:58] what motherfucking jerk
[Mon Jul 12 2010] [09:24:07] actually, I never liked contracts... good idea, shitty implementation
[Mon Jul 12 2010] [09:24:09] what a motherfucking jerk
[Mon Jul 12 2010] [09:24:27] weeh, you're insulting Andrei even more than I am, I can't allow that
[Mon Jul 12 2010] [09:24:41] then insult him more than me!
[Mon Jul 12 2010] [09:24:48] ?andrei
[Mon Jul 12 2010] [09:24:49] Andrei (temporary) == He's Andrei...
[Mon Jul 12 2010] [09:24:51] bring it on
[Mon Jul 12 2010] [09:24:55] done.
[Mon Jul 12 2010] [09:25:56] what an egomaniacal asshole
[Mon Jul 12 2010] [09:26:18] anyway, there have been suggestions to add a delete() function
[Mon Jul 12 2010] [09:27:15] oh nice
[Mon Jul 12 2010] [09:27:29] at least it would kind of look like the same :(
[Mon Jul 12 2010] [09:27:34] facepalm
[Mon Jul 12 2010] [09:28:11] * ptDDev starts an online petition
[Mon Jul 12 2010] [09:28:21] it will be a long rant
[Mon Jul 12 2010] [09:28:23] http://pastebin.com/uVdvh07B
[Mon Jul 12 2010] [09:28:25] "There used to be a time when D - Anonymous - uVdvh07B - Pastebin.com"
[Mon Jul 12 2010] [09:29:01] "and is well suited to aggressive compiler optimization technology." <- I wonder what this one is about?
[Mon Jul 12 2010] [09:29:36] obviously not the linker
[Mon Jul 12 2010] [09:29:51] I mean dmd certainly isn't equipped with any "aggressive compiler optimization"... in contrary, C++ compilers are more aggressive than dmd
[Mon Jul 12 2010] [09:30:59] Quit Etherous has left this server (Quit: Leaving.).
[Mon Jul 12 2010] [09:33:27] ptDDev: if you're going to post something, post it here first
[Mon Jul 12 2010] [09:33:38] yes
[Mon Jul 12 2010] [09:33:45] please help me with this
[Mon Jul 12 2010] [09:33:50] we should protest
[Mon Jul 12 2010] [09:37:26] also andrei just hinted delete() could be put into object.di, although he also blarghed something about "foster use of clear() as safe resource reclamation"
[Mon Jul 12 2010] [09:37:56] does he only think about non-memory resources? does he even understand that you can't rely on the GC to free memory in same cases?
[Mon Jul 12 2010] [09:41:01] wm4: to be called as a property?
[Mon Jul 12 2010] [09:41:08] obj.delete
[Mon Jul 12 2010] [09:41:25] the proposal was about a free function, I think
[Mon Jul 12 2010] [09:41:28] delete(obj);
[Mon Jul 12 2010] [09:41:41] facepalm, twice as hard
[Mon Jul 12 2010] [09:42:42] what's the problem?
[Mon Jul 12 2010] [09:43:46] this leading to syntactical inconsistencies
[Mon Jul 12 2010] [09:43:48] big ones
[Mon Jul 12 2010] [09:44:15] you allocate with auto obj = new Obj; and then deallocate with a function delete(obj);
[Mon Jul 12 2010] [09:44:28] I agree that having new/delete be symmetric would be better, but I can't see how a delete method would be better
[Mon Jul 12 2010] [09:45:23] a delete operator, the way it was before, would be better
[Mon Jul 12 2010] [09:45:56] the method is a way of trying to repair the huge screw up that a mandatory clear() was
[Mon Jul 12 2010] [09:46:45] the situation is far worse now
[Mon Jul 12 2010] [09:46:59] it's not about D turning into C++, it's turning into Java
[Mon Jul 12 2010] [09:47:05] * ptDDev is very disappointed
[Mon Jul 12 2010] [09:47:27] just wait until idup turns into clone()

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

July 13, 2010

Mengü yazılanların tamamını okumadım ancak fena saydırmışlar. Sanırım bunu Türkçeye çevirmemeliyiz :-/

Bu arada Andrei çok ileri görüşlü biri olduğu için önceden clear'a karar vermiş olabileceğini düşündüm ve dediğim doğru çıktı:

Kitabın çok kısa bir bölümünde şunu diyor:

İlk önce Ali Beyin çevirdiklerini diyor. Yok işte sonlandırıcıyı(Ben bozucuyu sevmiyordum ancak sevmeye başladım) çağırır init yapar filan diyor.

Ondan sonra şunu diyor:

Ancak, C++ aksine, clear nesnenin kendi belleğini ellden çıkarmaz ve delete işleci yoktur.(D bir delete işleci kullanıyor ancak onaylanmamış(deprecated, gidici).)

Ben clear'ı azıcık bilgim ile gereksiz, saçma buluyordum ancak çok önceden karar verilmiş. Ancak ben clear (işlev olacak değil mi ? ) işlevinin kod halini görmek istiyorum. Bence işlevi doğru düzgün bir biçimde yazamayacaklar.

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

July 13, 2010

Alıntı:

>

clear zaten var; object.di içinde dört yüklemeli olarak buldum:

Tam okumadan burada daha yazılamadığını düşünüyordum: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=97688

Demek ki yazmış.

Aslında çok önemli değil. Biz Mengü ile kaynak işini konuşuyorduk. D dilinin çok iyi olduğunu ancak doğru düzgün bir ingilizce kaynak çıkmazsa bir yere gelemeyeceğini popüler olamayacağını, Türkiyede ise dil seçilirken dilin popülerliğine bakıldığını eğer Dünyada popüler olmazsa Türkiyede'de kimseye kabul ettiremeyeceğimizi filan...

Daha sonra bunu D sohbetinde de beraber söyledik bir iki konuşuldu yazalım dendi sonra konu Andrei'nin yüksek IQ'sunun haskell öğrenmeye engel olmasına geldi.

Bende Mengü gibi biraz umutsuzlaşıyorum. Ortada güzel bir dil var. Ancak tamamlanamıyor. Belge desen taa en baştan beri doğru düzgün bir belgesi olmadığını yazıyorum. Hep C yada C++ belki Java'cılar için. D1 ile D2 beraber çorba olmuşlar. Çok yavaş ilerliyorlar. Bütün eliştiriler arasında belkide en haklı eleştiri bitiremeyeceksiniz eleştirisi. Artık neyi bekliyorsun dilin neyini tartışıyorsun kitabını çıkarmışın kitaba göre kimseye sormadan son hız ilerle, ayrıca bir belge yaz dil tutulsun işte demiştik ve diğer yeni çıkan dillerin nasılda hemen popüler olduğunu söylemiştik.

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

July 13, 2010

Şöyle bir kod parçası ile clear'ı ile ilgili sorular soracağım:

import std.stdio;
void main()
{
   class deneme
   {
       this()
       {
           File dosya = File("ogrenci_bilgisi", "a");
           dosya.writeln("İsim  : ", "Zafer");
           dosya.writeln("Numara: ", 123);
           dosya.writeln("Sınıf : ", "1A");
       }
       ~this()
       {
           File dosya = File("ogrenci_bilgisi", "a");
           dosya.writeln("Bozucu :İsim  : ", "Zafer");
           dosya.writeln("Bozucu :Numara: ", 123);
           dosya.writeln("Bozucu :Sınıf : ", "1A");
       }
   }
   auto örnek = new deneme();
   clear(örnek);
}

Burada clear yüzünden sınıf 2 kere işletiliyor. Eğer orada sınıfı silmemiz gerekti ve clear böyle işe yaramıyor. Ne yapacağız ? Bunu çok merak ettim. scope'da kullanamıyoruz.

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

« First   ‹ Prev
1 2 3