Gün 3 - Mayıs 29, "Keynote", Andrei Alexandrescu
(Ali'nin yorumu: Bu konuşma çok güzeldi. Ses getireceğinden eminim. Özellikle, üstü kapalı olarak C++'ın sonunda açıkça geride kalacağını da belirtmiş oluyor çünkü Stroustrup 'statif if'e kesinlikle karşı.)
Andrei'nin konuşması ilginç başladı: "Türden bağımsız programlamayı (generic programming) artık bırakmamız gerekiyor" gibi bir sözle başladı ("Generic programming must go").
Şunları söylüyor:
Açık yararlarına rağmen, generic programming esnek olmayabilir (fazla "ridgid"dir.)
Dört adet isimli aralık çeşidi olduğuna göre, türden bağımsız programlamaya karşı hareket ediyoruz: InputRange, ForwardRange, BidirectionalRange, RandomAccessRange.
Bir de şu sabit kavramları tanımladık: hasLength, isInfinite, hasSlicing, hasMobileElements.
"İsim" üzerine odaklansak, şunları tanımlamak gerekirdi: InputRangeWLength, ForwardRangeWLength, BidirectionalRangeWLength, RandomAccessRangeWLength, InputRangeInfinite, ForwardRangeInfinite, BidirectionalRangeInfinite, RandomAccessRangeInfinite, RandomAccessRangeWSlicing, RandomAccessRangeWLengthWSlicing, RandomAccessRangeInfiniteWSlicing, ...
(Bu noktada şimdilerde üzerinde çalıştığı bellek ayırma modülünü (std.allocator) yazarken karşılaştığı konulara geçti.)
Bellek ayırma konusunda şu kavramlar var:
Memory allocation is high-vocabulary
◦ alignment
◦ (dynamically) aligned allocation
◦ rounding up/quantization
◦ in-place expansion
◦ reallocation
◦ contiguous vs. non-contiguous
◦ ownership
◦ resolving internal pointers
◦ deallocation
◦ per-instance state vs. monostate
◦ thread-local vs. shared
Bunların bütün kombinasyonlarına karşılık isimler bulmak saçma olurdu.
Descartes'a gönderme yapıyor: Tüm bildiklerinizi bir kenara bırakın. Şimdi, bellek ayıran koddan ne beklediğimizi düşünelim: Tabii ki allocate()...
Önerisi: Tasarımlarımızı içgözlem (introspection) üzerine kuralım.
Ve tabii allocate()'in yanında bir de 'hizalama birimine' (alignment) ihtiyacımız var.
En basit bellek ayırıcı, bir göstergeyi ilerletmektir. ("Push the pointer" dediği saydam (13/32)).
Şimdi bu bellek ayırıcıya yeni beceriler eklemeye başlıyor: 1'den farklı hizalama birimi, vs.
Sonra birisi başaramazsa diğeri kullanılan iki ayırıcılı FallbackAllocator'ı gösteriyor. (17/32)
FallbackAllocator'ta ilginç bir noktaya değiniyor: null'la karşılaştırmak yerine '(r.length != n)' karşılaştırmasını yapmasının nedeni, kullanıcı 0 bayt ayırmak istediğinde başarılı olmamızın gerekmesiymiş.
Yeni bir temel işleme ihtiyacımız var: "owns()" (ayırıcıya bellek parçasının sahibi olup olmadığını sorabilmemiz için).
Ana ayırıcı (yani, P) owns()'u ve deallocate()'i sunabilir ama ikincil ayırıcının (yani, F) owns()'u sunması gerekmiyor.
static if'i kullanarak bu tür davranışlara isim vermekten kurtulduğunu söylüyor. P ve F'nin ne sunduklarına bağlı olarak istediğimiz davranışı isimlendirme gereği duymadan elde ediyoruz.
Bu noktada üzerinde çalıştığı modülün belgesine gidiyor:
http://erdani.com/d/phobos-prerelease/std_experimental_allocator.html
Bundan sonra adım adım tasarım üzerinde duruyor. 'static if' çok yararlı, vs.
reallocate()'in işleyişi sırasında gereken crossAllocatorMove() üzerinde duruyor (yani, belleğin birincil ve ikincil ayırıcılar arasında geçirilmesi gereği).
Burada D ile övünüyor: Diğer dillerde bu işlemleri kaç satırda yapabilirsiniz?
Belirli büyüklüğe göre "küçük" veya "büyük" ayrımı yapan Segregator'ı tanıtıyor.
Saydam 26/32: İçgözleme dayanan tasarım alt parçalardan üst parçalar oluşturmaya yol açıyor.
-
Türden bağımsız programlama başarısız olmuştur.
-
Kavramlar (concepts) başarısız olmuştur.
-
İçgözlem kullanın
-
'static if' ile mantıksal ifadeler kurun
Concepts'in sorunu, herşeye ad vermenin gerekmesiymiş. Kendisi bu çalışma sırasında aydınlanmış ve mutlu. :)
Kod da şuradaymış:
https://github.com/andralex/phobos/tree/allocator/std/experimental/allocator
Saydam 29/32: Herkese soru: Farklı tür ayırıcılardan (Region, HeapBlock, vs.) oluşan diziyi nasıl tasarlardınız? Yeni ayırıcı nasıl eklenirdi? Güzel bir soru: Bu diziyi nerede tutardınız? (Yani, ayırıcı dizisini nerede ayırırdınız?)
Şöyle çözmüş (30/32):
-
Çağrı yığıtında bir ayırıcı kur
-
Onu kullanarak dizi için bellek ayır
-
İlk ayırıcıyı oraya taşı
-
vs.
Özet (31/32):
-
Türden bağımsız programlama yeterince esnek değildir
-
Onun yerine içgözleme dayanan tasarım öneriyor
-
Yalnızca gereken parçaları sunun, gerisini yeteneklere bağlı olarak sunun
-
İçgözlemi kullanarak küçük parçalardan büyük parçalar oluşturun
(32/32):
Derleme zamanındaki içgözlem + CTFE (derleme zamanında işlev işletme) + mantıksal ifadeler + static if = KAZANÇ.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]