Jump to page: 1 2
Thread overview
November 21

D dili ile ilgili Çöp toplayıcının devre dışı bırakılması ile ilgili Chat GPT ile yaptığım soru cevap çalışmasında bana durum o kadarda kötü değil "@nogc" kullanırsan en azından fonksiyonlarda Garbage Collector'un devre dışı kalacağından dem vurdu :) tamam dedim peki Garbage Collector'u tüm program boyunca nasıl devre dışı bırakırım! Bana aslında bunun "GC.disable()" ile yapılabileceğini söyledi! Tabiki hevesim yine kursağımda kaldı çünkü bu seferde Phobos kütüphanesinde kullandığımız onlarca fonksiyonu kullanamayacağımı söyledi. İki ucu çamurlu değenek :)

Şimdi bir kodun başında D dilinin tüm olanaklarını kullanabilme özgürlüğü ile nasıl Garbage Collector'u devre dışı bırakabilirim ?

Şöyle bir ifade gördüm ama baştaki parantezlerin @nogc ye etkisi nedir anlayamadım?
() @nogc

November 21

On Thursday, 21 November 2024 at 06:23:42 UTC, Cos00kun wrote:

>

D dili ile ilgili Çöp toplayıcının devre dışı bırakılması ile ilgili Chat GPT ile yaptığım soru cevap çalışmasında bana durum o kadarda kötü değil "@nogc" kullanırsan en azından fonksiyonlarda Garbage Collector'un devre dışı kalacağından dem vurdu :) tamam dedim peki Garbage Collector'u tüm program boyunca nasıl devre dışı bırakırım! Bana aslında bunun "GC.disable()" ile yapılabileceğini söyledi! Tabiki hevesim yine kursağımda kaldı çünkü bu seferde Phobos kütüphanesinde kullandığımız onlarca fonksiyonu kullanamayacağımı söyledi. İki ucu çamurlu değenek :)

Şimdi bir kodun başında D dilinin tüm olanaklarını kullanabilme özgürlüğü ile nasıl Garbage Collector'u devre dışı bırakabilirim ?

Şöyle bir ifade gördüm ama baştaki parantezlerin @nogc ye etkisi nedir anlayamadım?
() @nogc

Merhaba,

Benim izlenimime göre GPT'ler d'nin bu özelliklerine yeterince hakim değiller. Dökümantasyona göre: "Unlike the @nogc attribute, GC.disable() halts collections across all threads, **yet still allows GC allocations**. Disabling collections". Bu durumda GC.disable() sadece o anda çöp toplama çevrimini durduruyor. Ama çöp toplayıcısından dinamik bellek ayırmaya devam edebiliyorsun. Bu yüzden alttaki örnek çalışıyor.

import std.stdio;
import core.memory : GC;


    void main()
    {	
        GC.disable(); // bir sonraki GC.enable()'a kadar çöpler toplanmayacak.

        int[] arr = new int[5]; // ama sen ÇT'dan hafıza almaya devam edebilirsin.
        arr[] = 13;

        GC.enable(); // çöpler toplansın diye izin veriyorsun. Ama nihai olarak runtime karar verecek yani illa burada çöp toplanmayacak. sen artık buna izin verdiğini söylüyorsun

        writeln(arr);
    }

Gelelim @nogc'ye. Bir fonksiyonu @nogc olarak işaretlersen o fonksiyon GC'ye bağımlı hiçbir işlemi yapamaz. bunun derlenmesini zaten derleyici engeller.

```d
@gogc void yap(){
    int[] arr = new int[5]; // olmaz, derleyici buna izin vermez. bunun yerine nogc hafıza tahsis eden yöntemler kullanılmalı
}


@nogc yapNogc(){
    int[] arr = (cast(int*)malloc(5 * int.sizeof))[0..5];
    ...
    free(cast(void*)arr.ptr);
}
```

Burada yapNogc'yi nogc olmayan herhangi bir fonksiyon çağırabilir. Ama tersi mümkün değilç nogc fonksiyon sadece diğer nogc fonksiyonları çağırabilir.

Programının tamamı @nogc olsun istiyorsan, main fonksiyonunu nogc olarak markalayabilirsin. bu senin programının hiçbir zaman çöp toplayıcısını kullanmayacağını garanti eder. Ancak bu durumda standart kütüphanenin birçok fonksiyonunu kullanamazsın (bunun yerine Üçüncü parti çözümler var).

betterC ise başka bir konu, şimdilik bu kadar.

November 21

On Thursday, 21 November 2024 at 06:23:42 UTC, Cos00kun wrote:

>

D dili ile ilgili Çöp toplayıcının devre dışı bırakılması ile ilgili Chat GPT ile yaptığım soru cevap çalışmasında bana durum o kadarda kötü değil "@nogc" kullanırsan en azından fonksiyonlarda Garbage Collector'un devre dışı kalacağından dem vurdu :) tamam dedim peki Garbage Collector'u tüm program boyunca nasıl devre dışı bırakırım! Bana aslında bunun "GC.disable()" ile yapılabileceğini söyledi! Tabiki hevesim yine kursağımda kaldı çünkü bu seferde Phobos kütüphanesinde kullandığımız onlarca fonksiyonu kullanamayacağımı söyledi. İki ucu çamurlu değenek :)

Şimdi bir kodun başında D dilinin tüm olanaklarını kullanabilme özgürlüğü ile nasıl Garbage Collector'u devre dışı bırakabilirim ?

Şöyle bir ifade gördüm ama baştaki parantezlerin @nogc ye etkisi nedir anlayamadım?
() @nogc

"() @nogc" ifadesi bir fonksiyon pointer'ını veya delegate'i markalamış olabilir. Kodun tamamına bakmak gerek. Belki böyle birşey:

alias BenimNOGCFonksiyonTipim = int function() @nogc;

    void banaFonksiyonVerÇalıştırayım(BenimNOGCFonksiyonTipim fonk){
        int i = fonk();
    }

    @nogc int alsanaInt(){ // alsanaInt nogc olmak zorunda eğer bunu BenimNOGCFonksiyonTipim olarak kullanacaksam
        return 5;
    }

BenimNOGCFonksiyonTipim f1 = &alsanaInt;

banaFonksiyonVerÇalıştırayım(f1);

November 21

Tüm yorumlarınıza çok teşekkür ediyorum harika detaylı cevaplar olmuş..
Bu arada hiç yabancı gelmiyor sizin isminiz. Komik bulabilirsin belki ama sanki sizle C/C++ ile muhabbet mi etmiştik, bi döküman mı yayınlamıştınız da okumuştum çıkartamadım ama isim hiç yabancı değil.. garip.. Neyse çok teşekkürler tekrardan eğer D ile profesyonel olmasa da (zaten bir amatör bile değilim belki de) grafik yönetim ve grafik motorları ile ilgili öğrenme aşamasına girmeye karar verirsem bol bol soru sorarım buradan ve Salih ve Ali arkadaşlarımızın iyi bildiği gibi kafalarınızı şişiririm yine :P
saygılar sevgiler..

November 21

On Thursday, 21 November 2024 at 10:12:20 UTC, Cos00kun wrote:

>

...
eğer D ile profesyonel olmasa da (zaten bir amatör bile değilim belki de) grafik yönetim ve grafik motorları ile ilgili öğrenme aşamasına girmeye karar verirsem bol bol soru sorarım buradan ve Salih ve Ali arkadaşlarımızın iyi bildiği gibi kafalarınızı şişiririm yine :P

Estağfirullah Çoşkum hocam, böyle öğreniyoruz; boş boş düşünmeden deneyerek...

Gerçekten de öyle, yani sorularınız kafamızda ödem yapmayacak aksine denedikce öğrenecez ve ödemi atacaz. İlaç bu :)

Hadi, @nogc bir oyun yazalım mı? İşin için rasgelelik ve bir takım terimler koyalım. Backend otursun gerisi sanat. Misal şöyle verilerimiz olsun:

enum TerrainType
{
  Plains, Forest, Mountain, Water, Desert
}

struct HexTile
{
  size_t      row, column;
  TerrainType terrain;
  int         resourceValue;
  bool        isOccupied;
}

Başlangıçta yapacağımız basit! Verilen yapıya göre new operatörünü kullanmadan tek bir @nogc özniteliği ile oyun sahnesini kuralım. Gerisi gelir zaten...

SDB@79

November 21

On Thursday, 21 November 2024 at 11:22:25 UTC, Salih Dincer wrote:

>

Başlangıçta yapacağımız basit! Verilen yapıya göre new operatörünü kullanmadan tek bir @nogc özniteliği ile oyun sahnesini kuralım. Gerisi gelir zaten...

SDB@79

Evet AI'ya yapıyı vermek ile işin angarya kısmını (işlevleri üretmek) çok zor olmadı. Şimdi yukarda, başlangıç noktamızda (ADIM 0'da) nakletteklerim ile beraber ortada şöyle bir ana yordamlarımız olsun, gayet basit değil mi?

ADIM 1:

import core.stdc.stdio : printf;
import std.experimental.allocator.mallocator : Mallocator;

@nogc: // tek satırla aşağıdaki her şey noGC

void main() //@nogc
{
  enum { ROWS = 5,
      COLUMNS = 5,
       LENGTH = ROWS * COLUMNS * HexTile.sizeof
  }

  //HexTile[ROWS * COLUMNS] hexMap;/*
  auto alloct = Mallocator.instance;
  auto hexMap = cast(HexTile*)
       alloct.allocate(LENGTH);

  if (hexMap is null)
    printf("Tahsis başarısız");//*/

  hexMap.generateHexMap(ROWS, COLUMNS);
  hexMap.displayHexMap(ROWS, COLUMNS);
  //hexMap.freeMem();
}

Diğer adıma geçmeden önce belirtmeliyim ki bunu heap yerine statik dizi kullanarak stack'de de yapmak mümkün. Zaten kodda tek satırda göstererek yaptım ama gizledim. Yorumu açarsanız .ptr de kullanmanız gerekecek. Örneğin:

hexMap.ptr.generateHexMap(ROWS, COLUMNS);
//      ^-- biz kaşındık ptr'lerden kurtuluş yok :)

Şimdi bunu unutalım ve bellek tahsisini bizim yaptığımız öngörelim. Devam edeceğiz (ADIM 3 v 4), az sonra...

SDB@79

November 21

On Thursday, 21 November 2024 at 11:58:13 UTC, Salih Dincer wrote:

>

Devam edeceğiz (ADIM 3 v 4), az sonra...

İşte son kısım ama belleğe geri vermede (ADIM 4'de) takıldım onu yapamadım. Sanırım yine aynı modülü deallocate()'tini kullancaz.

ADIM 3:

auto randomTile(int limit)(int row, int column)
{
  import core.stdc.stdlib : rand;

  auto terrain = cast(TerrainType)(rand() % 5);
  int resourceValue = rand() % limit;

  return HexTile(row, column, terrain, resourceValue, false);
}

auto generateHexMap(HexTile* map, int rows, int columns)
{
  for (int r = 0; r < rows; r++)
    for (int c = 0; c < columns; c++)
      map[r * columns + c] = randomTile!100(r, c);
}

auto displayHexMap(const HexTile* map, int rows, int columns)
{
  for (int r = 0; r < rows; r++)
    for (int c = 0; c < columns; c++)
    {
      const tile = map[r * columns + c];
      printf("Hex(%d,%d): Terrain=%d, Resources=%d, Occupied=%d\n",
              tile.row, tile.column, tile.terrain,
              tile.resourceValue, tile.isOccupied
            );
    }
}

Lütfen tüm adımları bir yere (PC'ye veya telefonunuzdan run.dlang.io'ya kopyalayın) ve çalıştırın. Çünkü hatasız derleniyor ve bize @nogc'nin dünyayı kör etmediğini, gerekirse kullanabileceğimizi gösteriyor. Tabi örnekte her şey noGC o yüzdan ekstra dikkat lütfen.

SDB@79

November 21

On Thursday, 21 November 2024 at 11:22:25 UTC, Salih Dincer wrote:

>

Estağfirullah Çoşkum hocam, böyle öğreniyoruz; boş boş düşünmeden deneyerek...
SDB@79

Öyle zaten dökümanmış, videoymuş şuymuş buymuş hep tali faktörler. Bu işin jargonu basit! açacaksın IDE yada editorunu yazmaya başlayacaksın!!
Açıkçası birkaç kere D ye döndüm deyip sonra ortalardan kaybolduğum için tekrar başladım diye yazmıyorum burada ama Çaktırmadan anımsamaya çalışıyorum sonra Ali ve Salih hocalardan yine mi başladın ve bıraktın fırçası yememek için ses etmiyorum :P

Bakalım sonra olmadı yavaştan Vulkan API ile en azından denemeler yapıp uzun yıllar boyunca ufak ufak kendimi geliştirmeyi planlıyorum. Önceden kendime güvenim yoktu ancak Lua öğrenip Lua ve birkaç kütüphanesi ile basit oyunlar (Kelime bulmaca, mangala v.s gibi) oyunları tasarlayıp yaklaşık 4000 satırlık bir oyun campaignini tasarlayabilince ne yalan söyliim kendime güvenimde geldi hiç Vulkan API bilgim ve D bilgim olmadan.
Buranın sıcaklığı hiç bir zaman aşka yerde olmuyor :)

November 21

On Thursday, 21 November 2024 at 12:15:35 UTC, Salih Dincer wrote:

>

On Thursday, 21 November 2024 at 11:58:13 UTC, Salih Dincer wrote:

>

Devam edeceğiz (ADIM 3 v 4), az sonra...

İşte son kısım ama belleğe geri vermede (ADIM 4'de) takıldım onu yapamadım. Sanırım yine aynı modülü deallocate()'tini kullancaz.

ADIM 3:

auto randomTile(int limit)(int row, int column)
{
  import core.stdc.stdlib : rand;

  auto terrain = cast(TerrainType)(rand() % 5);
  int resourceValue = rand() % limit;

  return HexTile(row, column, terrain, resourceValue, false);
}

auto generateHexMap(HexTile* map, int rows, int columns)
{
  for (int r = 0; r < rows; r++)
    for (int c = 0; c < columns; c++)
      map[r * columns + c] = randomTile!100(r, c);
}

auto displayHexMap(const HexTile* map, int rows, int columns)
{
  for (int r = 0; r < rows; r++)
    for (int c = 0; c < columns; c++)
    {
      const tile = map[r * columns + c];
      printf("Hex(%d,%d): Terrain=%d, Resources=%d, Occupied=%d\n",
              tile.row, tile.column, tile.terrain,
              tile.resourceValue, tile.isOccupied
            );
    }
}

Lütfen tüm adımları bir yere (PC'ye veya telefonunuzdan run.dlang.io'ya kopyalayın) ve çalıştırın. Çünkü hatasız derleniyor ve bize @nogc'nin dünyayı kör etmediğini, gerekirse kullanabileceğimizi gösteriyor. Tabi örnekte her şey noGC o yüzdan ekstra dikkat lütfen.

SDB@79

Salih Bey selamlar. Bir ara minecraft'ın gibi voxel esaslı procedural dünya oluşturmak için basit bir kod aramıştım da öyle fazla vakit kaybettrimeyecek basit birşey bulamamıştım. Godot ile oyuncu ve blok koy yok et kısmını tutorialler yardımıyla yapabilmiştim, hatta arada eğlence olsun diye açıp oyuncuyu adamda gezdiriyorum. Bu arada Godot motoru bence çok iyi ve d'yi de destekliyor. bizimki öylesine hobi tabiki.

November 21

On Thursday, 21 November 2024 at 10:12:20 UTC, Cos00kun wrote:

>

Tüm yorumlarınıza çok teşekkür ediyorum harika detaylı cevaplar olmuş..
Bu arada hiç yabancı gelmiyor sizin isminiz. Komik bulabilirsin belki ama sanki sizle C/C++ ile muhabbet mi etmiştik, bi döküman mı yayınlamıştınız da okumuştum çıkartamadım ama isim hiç yabancı değil.. garip.. Neyse çok teşekkürler tekrardan eğer D ile profesyonel olmasa da (zaten bir amatör bile değilim belki de) grafik yönetim ve grafik motorları ile ilgili öğrenme aşamasına girmeye karar verirsem bol bol soru sorarım buradan ve Salih ve Ali arkadaşlarımızın iyi bildiği gibi kafalarınızı şişiririm yine :P
saygılar sevgiler..

Adımı buralarda görmüş olabilirsiniz. Neticede ünlü biri değilim ;)

« First   ‹ Prev
1 2