Forum: D Programlama Dili RSS
@nogc niteliği
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: @nogc niteliği
Yeni bir D olanağı eklendi. Teklifi şurada:

  http://wiki.dlang.org/DIP60

Kısaca, @nogc ("çöp toplayıcı kullanılmasın" anlamında "no garbage collector"dan geliyor) olarak işaretlenmiş olan bir işlev dinamik bellekten yer ayıramıyor. Böyle işaretlenmiş olan bir işlevi çağıranlar çöp toplayıcıya iş getirmediklerinden emin olmuş oluyorlar.

Bu olanak 2.066'da geliyor. Şu örnek github'dan indirilmiş olan dmd'de derleniyor:
void foo() @nogc
{
    int[] dizi;
    dizi ~= 42;
}
 
void main()
{}
Hata mesajı:

Error: cannot use operator ~= in @nogc function foo

Ali
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Zekeriya'nın çok hoşuna gideceğini düşünüyorum :)

Bildirim için teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
zekeriyadurmus #3
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Cevap yazmıştım ama gitmemiş. Başlığı görünce o fonksiyonu çöp toplayıcıdan azat ediyor sandım ama değilmiş öyle olsa daha iyi olurdu fakat yine de iş görür biraz daha düzgün kod yazarız artık :)

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
zekeriyadurmus:
fonksiyonu çöp toplayıcıdan azat ediyor sandım

Bir anlamda öyle oluyor. Derlenebilmesi için işlev çöp toplayıcıya bağlı olanak kullanamıyor ve böylece azat edilmiş oluyor. :)

Ali
Avatar
zekeriyadurmus #5
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yani o anlam geliyor akla ama benim aklıma gelen şey new yaptığımızda bunu çöp toplayıcının yakalamaması veya oluşturulan bir veriyi sonlandırmaması ki bu benim daha çok işime yarardı.

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
new yaparsan çöp toplayıcıdan almış oluyorsun. Eğer başka bir bellek düzeneğin varsa oradan da alabilirsin: benim_new() gibi.

Oluşturulan verinin sonlandırılmamasının bir yolu, o veriye bir referans tutmak. Nasıl olsa o veriye bir biçimde erişeceğine göre bir referans herhalde vardır diye düşünülüyor.

Yoksa benim aklıma gelmeyen başka bir olanak mı düşünüyorsun?

Ali
Avatar
zekeriyadurmus #7
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali hocam ben gc.disable bile etsem o yine çalışıyor ve hatta şöyle içinde 100.000 tane pointer taşıyan dizim olsun (o test ettiğim sürümde öyleydi en azından) gc çalıştığı an bütün pointerları taraması vakit alıyordu benim istediğim şey şu:
Ben zaten o fonskiyon içerisinde memory leak olmayacağı konusunda eminim. Bütün memory yönetimini elle kendim yapmak istiyorum bu sayede D nin memory yönetim modülü işlemlerimi yavaşlatmayacak veya karışmayacak. Sırf bunun için C gibi içinde built-in gc olmayan bir dil kullanmayı da düşündüm veya bir kısmını C de yazıp d nin bundan bihaber olmasını sağlayabilirim. Yeterki tamamen benim kontrolümde olan ve D nin karışmadığı bir bellek alanı olsun ve GC sadece ben istediğim zaman çalışsın. Ali hocam kısaca GC üzerinde daha fazla kontrol istiyorum.

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #8
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bir yerde görmüştüm ama şimdi hatırlayamadım. Bu GC yi tamemen devre dışı da bırakabiliyorduk. Bu da tam istemediğim bir şey ama çaresiz kalırsam bunu uygulayabilirim. Bu olayları rhodeus script için istiyorum aslında. Hız olayı çok kafama taktığım bir mesele ve yavaş olmasını kabul edemiyorum. Yeterince hızlı çalışmayacaksa ne anlamı var bunu kullanmanın değil mi?

Ama öte yandan dili compiled dillere yaklaştırmayı da düşünüyorum. Tür tanımlama olaylarını dile eklemek ve oluşturulan IL çıktısını çalıştırma anında JIT ile makine kodu olarak işletmek çok daha mantıklı geliyor.

Web konusunda tür tanımlamalı ve scripting mantığında çalışan bildiğim bir tek HackLang var. Bunu hacklang çıkmadan öncede düşünüyordum (Eylülden beri). Sürekli olarak "devrim" olacak diyordum ama bakıyorum ki facebook bunu gerçekleştirdi ama bunu D dilini örnek alarak yapmayı planlıyorum. Kısaca dscript gibi bir şey olacak. Tabi böyle bir şeyi yapabilmek için bellek yönetimine çok iyi hakim olmak gerek. Bu konuda pekte iyi değilim ve şu an için buna ayırabileceğim zamanım da yok diyebilirim. Üniversite konusu belli olunca başlamayı planlıyorum ama o zamana kadar bu memory konusunda birkaç bir şey kapabilirim inşallah :)

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şuradaki yöntemler D'de de geçerli (Çok eski bir makale olduğundan kodları yeni derleyicilerde derlenmiyor olabilir; denemedim.):

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

Bir de, çöp toplayıcının taramasını istemediğimiz belleği GC.BlkAttr.NO_SCAN ile ayırabiliyoruz:

  http://ddili.org/ders/d/bellek_yonetimi.html

Hatta teoride yepyeni bir çöp toplayıcı yazıp D çalışma ortamına bile bağlayabiliyoruz ama hiç bunu yapan duymadım.

Ali
Avatar
zekeriyadurmus #10
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
http://ddili.org/ders/d/bellek_yonetimi.html şunu defalarca okudum.

http://ddili.org/makale/bellek.html şunu eksik okumuşum ve burada işime yarayacak şeyler varmış :)

Yakın zamanlarda (belkide ben fark etmedim daha önceden de vardı) core modülüne yeni sınıflar eklenmiş. Şu mutex kavramı ile ilgili şeyler de var onları okumak gerek ama bundan önce şu üyelerin new constructor unu kullanarak birkaç şey yapmak istiyorum.

D çalışma ortamına bağlamama gerek yok gibi şu an için. Niyetim jit compiler ile makine kodu üretmek ve belirli bir yerden sonra onun çalışmasını sağlamak ve bu süreçte D nin çöp toplayıcısının kesinlikle bu çalışma zamanında üretilen
kodlara müdahale etmemesi gerek.

String gibi ubyte[] gibi dizilerin (dilim demek biraz tuhaf geliyor) hangi adrese kurulacağını seçemiyoruz değil mi?

Zekeriya
Bilgi meraktan gelir...
Avatar
zekeriyadurmus #11
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Zamanında http://forum.dlang.org/thread/gsphkm$2ba7$3@digitalmars.com şurada tartışılmış (çok uzundu okuyamadım sadece göz attım) ve anladığım kadarıyla aşağıdaki şeyler eklenmiş. RefCounted ı biraz inceleyip (belkide değiştirip) kullanabilirim sanal makinede ama ne kadar performans verir bilmiyorum.

http://dlang.org/phobos/std_typecons.html#.Unique
http://dlang.org/phobos/std_typecons.html#.RefCounted

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #10
zekeriyadurmus:
String gibi ubyte[] gibi dizilerin (dilim demek biraz tuhaf geliyor)

Duruma göre ben ikisini de söyleyebiliyorum. D'de dilimin farkını öne çıkartmak için özellikle bastırıyorum. :)

hangi adrese kurulacağını seçemiyoruz değil mi?

Bunun için C'nin stdlib'inden yararlanılır:
import std.c.stdlib;
 
void main()
{
    int * p = cast(int*)malloc(42 * int.sizeof);
    scope(exit) free(p);
 
    // Artık elimde 42 elemanlı bir C dizisi var. (Bu diziler ne yazık ki
    // kendi uzunluklarını bilemez.)
    foreach (i; 0 .. 42) {
        p[i] = i;
    }
 
    // D'nin güzel bir olanağı, p gibi çiğ dizilerden bile dilim
    // oluşturabilmesidir:
    auto d = p[0..42];
 
    // Türü, int dilimi
    static assert(is (typeof(d) == int[]));
 
    // Bu dilim p'deki elemanları gösterir:
    assert(d.ptr == p);
 
    // Tabii, dilime eleman ekleyince p'yi terkedeceğine dikkat etmek gerek:
    foreach (i; 0 .. 100) {
        d ~= i;
    }
    assert(d.ptr != p)// yeni elemanlar sığsın diye d'ye yeni yer ayrılmıştır
}

Ali
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-11-18, 09:32:22 (UTC -08:00)