Merhaba,
Şurada (http://ddili.org/forum/thread/1209) başlayan tartışma 'vizyonumu genişletti'ğini söyleyerek devam edersek; D Programlama Dili'nin slice(dilim) olanakları, henüz tanışmadıysanız size de çok şey katabilir...
Hali hazırdaki Ali hocanın dersiyle başlayın: http://ddili.org/ders/d/dilimler.html
Karmaşık gibi görünen (aslında değil, her şey tereyağından kıl alır gibi leziz!) kodlara geçmeden evvel, lütfen iki çift söz etmeme izin verin. Sanki vermeseniz yazmayacağım...:)
Alıntı ("BELLEKBOL SAHASI"):
>Dış mekanda, senelerdir kullanılmayan bir basketbol sahası düşünün. Size orayı, yarım gün içinde süpürme görevi verdiler. Çünkü öğleden sonra seyirciler gelmeye başlayacak ve burada önemli bir maç oynanacak. N'aparsınız?
Elbette bir köşeden başlayıp diğer çapraz köşeye kadar süpürme ahmaklığına girişmezsiniz. Çünkü öyle yaparsanız zamanla süpürdüğünüz çer çöp artacak ve logaritmik olarak yavaşlayacaksınızdır. Neticede böyle bir şeye kalkışırsanız, size verilen sürenin ortalarında hızlanmak isteyecek ve tozu dumana katmaya başlayacaksınız ve patron ise sizi hemen kovacak...:)
(Patron kontrole gelir...)
- Bu kadar süre n'aptın? Her yer bıraktığım gibi duruyor!
- Kovuldun...:)
Belki başınıza böyle bir şey gelmemiştir. Ama kullandığımız bilgisayarlardaki bellek birimlerini temizlemek arasında neredeyse hiç bir fark olmadığını söyleyebilirim. Tabi gerçek hayatta rüzgar faktörü var ki yarım günlük bir iş, bütün gün sürebilir...:)
(Nereden mi biliyorum!)
Askerde, devrem ile böyle bir maceraya gönüllü (aslında zorunlu!) olarak girişmiştik de ondan. Basketbol "sahası nedir ki canım!" demeyin. Tek kişi olmadığınız halde bütün çöpleri yığmak ve oradan uzaklaştırmak hiç de kolay bir şey değil. Peki doğrusu nedir? Tabi ki başladığınız yerdeki çöpü bir miktar süpürdükten sonra diğer arkadaşınıza (onun ismi GC olsun) teslim etmek. O da çöp yığınını arabasına yükleyip peşinizden gelecek ve süpürülen diğer yığınları toplamaya devam edecek.
(Kodlara az kaldı...)
Şimdi, gerçek hayattan bu basit örneği niye verdiğim ortada. Bir basketbol sahası da tıpkı bilgisayarınızdaki belleğin bir bölümü gibidir; her santimetre karesine bir bayt veri işlendiğini hayal edin. Ancak günümüz belleklerini yeryüzüne yaydığımızda milyonlarca basketbol sahası olduğunu ve bütün bunları düzenli aralıklar ile temizleme göreviniz olduğunu düşünürseniz olay hiç de basit değil. Bunu ben de yeni fark ettim; gerçek hayatta tecrübe etmeme rağmen...:)
Her şey bir Memory Manager sınıfı yazmak ile başladı ki Talha Zekeriya Durmuş buna önayak olmuştur. Elbette aşağıdaki kodlar sadece bir temel ve geleneksel malloc() işlevine benzese de dilimler kullanıldığı için çok farklı. Ayrıca GC olaylarına girmeye başlasak da sanırım hala çok uzağız. Çünkü hiç bir şey göründüğü gibi basit değil...
(Nereye! Hemen kormayın canım...:))
Basitten başlayalım! Dilimleri bilenler pekala 2 adet işaretçi ile belleğin (dizinin) bir bölümünü işaret ettiğini hatırlayacaktır. Geleneksel yöntemleri uygulasaydık; istenen boyutta bellek birimine, başka bir veri yazılmayacağının garantisi ile birlikte 1 adet işaretçi gönderecektik. Biz ise dilim gönderiyoruz ama bu öyle tek başına gezinen sarhoş bir dilim değil...:)
> struct Düğüm {
> size_t konum;
> char[] dilim;
> Düğüm* önceki,
> sonraki;
> bool boş_Mu;
> }
> ```
> Dilimimiz, şimdilik sadece char değişkenlerini göstereceğini varsayalım. Bu durumda yukarıdaki gibi bir kaç arkadaşı ile birlikte bir yapı oluşturabiliriz. Bilgiler Türkçe olduğu için, dilimizi kullananlar bu arkadaşların görevini hemen anlayacaklar. Aslında bu yapı bir bağlı listenin temeli. Bunu önceki ile sonraki işaretçilerden anlamışsınızdır.
>
> Özetle, dilimi Düğüm ismindeki bir taşıyıcı vasıtasıyla hayatta tutacağız ve yanındaki arkadaşları ile bütün dilimleri birbirlerine bağlayacağız. Eğer birinin kullanımı biterse ya onu boş olarak (boş_mu = true) işaretleyeceğiz, ya da komşusu da boş ise bunları birleştirmeyi (süpürmeyi) tercih edeceğiz. Ama maceramız bitmeyecek; bir de süpürdüklerimizi toplamamız gerekecek ki bu sanırım, ilk makaleyi epeyce aşan bir mevzu...
>
> Lütfen aşağıdaki kodu, yukarıdaki yapı ile birlikte derleyiniz. Henüz geliştirme devam ettiği için ileride daha farklı özelliklere ile donatılacaktır. Şimdiden koda hakim olmanızda fayda var, çünkü işler karışacak...:)
>
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]