Thread overview
Dosya Yaz/Oku Deneme
May 23, 2012
Salih Dinçer
May 23, 2012
zafer
May 24, 2012
Salih Dinçer
May 25, 2012
Salih Dinçer
May 25, 2012
zafer
May 26, 2012
Salih Dinçer
May 23, 2012

Merhaba,

Belki gereksiz bir şey yaptım; Windows'un dosya yazma/okuma sınırlamalarını ve işin doğasını anlamak için std.file sınıfından iki işlevi çıkardım. Çünkü bana dosya listeleme, silme ve bilcümle yararlı/yarasız şey gerekmiyordu. Sonuçları şöyle oldu:

import std.file;
void main(){
	string deneme = "deneme.txt";
	write(deneme, "GÜNAYDIN");
	assert(read(deneme) == "GÜNAYDIN");
}

Yukarıdaki kodu DMD 2.59 sürümü ile derlediğimde 1.127 byte object kodu, 368.668 byte binary dosya boyutları meydana geldi. Aynı işlevi çalıştıran aşağıdaki kodu derlediğimde ise 14.727 byte object kodu, 181.788 byte binary dosya boyutları meydana geldi. Önemsiz bir ayrıntı gibi görünse de 10 kattan fazla object koda rağmen yarı yarıya binary dosya derlenmesi ilginç.

Alıntı (stf.file sınıfındaki write, read işlevleri):

>
> import core.sys.windows.windows, std.windows.syserror;
> import std.algorithm, std.array, std.conv, std.typetuple;
>
> class FileException : Exception {
>     immutable uint errno;
>     this(in char[] name, in char[] msg, string file = __FILE__,
>                                         size_t line = __LINE__)
>     {
>         if(msg.empty) super(name.idup, file, line);
>         else super(text(name, ": ", msg), file, line);
>         errno = 0;
>     }
> 	this(in char[] name, uint errno = .GetLastError(),
>                          string file = __FILE__,
>                          size_t line = __LINE__)
>     {
>         this(name, sysErrorString(errno), file, line);
>         this.errno = errno;
>     }
> }
>
> T cenforce(T)(T condition, lazy const(char)[] name, string file = __FILE__,
>                                                     size_t line = __LINE__)
> {
>     if (!condition) throw new FileException(name, .GetLastError(), file, line);
>     return condition;
> }
>
> void[] read(in char[] name, size_t upTo = size_t.max) {
>     alias TypeTuple!(GENERIC_READ,FILE_SHARE_READ,(SECURITY_ATTRIBUTES*).init,
>                      OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL |
>                      FILE_FLAG_SEQUENTIAL_SCAN,HANDLE.init) defaults;
>
>     auto h = CreateFileW(std.utf.toUTF16z(name), defaults);
>     cenforce(h != INVALID_HANDLE_VALUE, name);
>     scope(exit) cenforce(CloseHandle(h), name);
>
>     auto size = GetFileSize(h, null);
>     cenforce(size != INVALID_FILE_SIZE, name);
>     size = min(upTo, size);
>
>     auto buf = uninitializedArray!(ubyte[])(size);
>     scope(failure) delete buf;
>
>     DWORD numread = void;
>     cenforce(ReadFile(h,buf.ptr,size,&numread,null)
>              == 1 && numread == size,name);
>     return buf[0 .. size];
> }
>
> void write(in char[] name, const void[] buffer) {
>     alias TypeTuple!(GENERIC_WRITE,0,null,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL |
>                      FILE_FLAG_SEQUENTIAL_SCAN,HANDLE.init) defaults;
>
>     auto h = CreateFileW(std.utf.toUTF16z(name), defaults);
>     cenforce(h != INVALID_HANDLE_VALUE, name);
>     scope(exit) cenforce(CloseHandle(h), name);
>
>     DWORD numwritten;
>     cenforce(WriteFile(h,buffer.ptr,to!DWORD(buffer.length),&numwritten,null)
>              == 1 && buffer.length == numwritten,name);
> }
> ```

>
Bu vesileyle (std.file sınıfı üzerinden) bir GÜNAYDIN demiş ve yeni girdiğimiz İngilizce kod serbestliğini denemiş oldum. Tabi Boost License 1.0'ı çiğnemiş oldum mu emin değilim...:)

Sevgiler, saygılar...

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

Alıntı (Salih Dinçer):

>

Önemsiz bir ayrıntı gibi görünse de 10 kattan fazla object koda rağmen yarı yarıya binary dosya derlenmesi ilginç.

Peki testi gerçekleştiren olarak bu sonuca senin yorumun nedir Salih?

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

May 24, 2012

Şöyle bir yorum yapılabilir:

Aslında std.file gibi sınıflar aslında yardımcı sınıflar. Yazma/okuma işlemlerini çekirdekteki 'CreateFileW(') ve 'ReadFile()' işlevleri yapmakta. Ayrıca bir şey dikkatimi çekti 'unittest{}''lerden birinde, okuduktan sonra 'scope(exit)' içinde remove gibi bir komut hatırlıyorum. Oysa buna o an ihtiyaç duyulmuyor (en azından Windows'da) çünkü dosyayı yeniden oluşturuyorsunuz. Dolayısıyla zaten var olan siliniyor.

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

May 25, 2012

Ben de Ali hocamın yorumunu bekliyordum ama bakalım ne zaman gelecek...:)

Altını çizmek isterim; küçük bir yazılım yazsak dahi belki arka plandan tüm kütüphane üzerinde gezen bir kodumuz var. Sanırım object code oluşturulurken gerekli nesneler kütüphanenin ilgili sınıflarından süzülüyor. Ama neden benim amatörce yaptığım süzme girişimim sırasında object code büyüdü ona anlam veremiyorum.

Ayrıca belli boyutun altında (bu sanırım Windows için ~150 KB.) binary code oluşamıyor. Bu herhalde linker'ın bağladığı runtime dosyaları olsa gerek. MS'in MCLR (yoksa CLI mıydı?) olayını seviyorum. Ayrınca DotNET kütüphanesini de. Aklın yolu birdir ve en sonunda MS, kuşkusuz ve kusursuz güzel bir şey yaptı. Ortak bir assembly olması, dil farklılıkları ve ortak kütüphane çok sevimli görünüyor. Düşünsenize bir geliştiricinin, meydana getirdiği binary kod başlarda 10 KB. altında...:)

Tamam, arkada bir sürü kütüphaneye bağlanıyor ama VS'yi de çok seviyorum. Bir gün D'ye uyarlanırsa o platforma geçebilirim.

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

May 26, 2012

Dosya boyutu konusunda bende Ali ile aynı fikirdeyim. Günümüzde artık donanımlar bu derece ileri bir seviyeye gelmişken afaki bir fark olmadıktan sonra dosya boyutu veya bellek kullanımı konularına çok zaman ayırmanın gerekmediğini düşünüyorum.

Özellikle servis bazlı ve bir biri ile bulutlar üzerinden konuşan sistemlerin gittikçe arttığı günümüzde bu tür yapılar üzerine incelemelerde bulunmak daha iyi olabilir diye düşünüyorum.

Ancak tabi ki bir geliştirici önce aklına takılanları araştırıp soru işaretlerini gidermeli.

Alıntı (Salih Dinçer):

>

Tamam, arkada bir sürü kütüphaneye bağlanıyor ama VS'yi de çok seviyorum. Bir gün D'ye uyarlanırsa o platforma geçebilirim.

Ben önceki yazılarımda da Microsoft'un gerçekten güzel işler çıkardığını yazmıştım. Neticede Visual Studio bence tartışmasız günümüzdeki en iyi ve konforlu IDE'lerde birisi, Tabi ki bunda Microsoft'un oluşturduğu ekosistemin yadsınamaz bir payı var. Özellikle Windows platformu tüm bu ekosistemin en güçlü temelini oluşturuyor.

Diğer taraftan D'yi .NET dünyasının içindeki bir dil olarak kullanmak istemem. Böyle bir özelliği olabilir, isteyen kullanabilir de ama .NET ile çalışıyorsam C# her zaman tek tercihimdir.

Bence D kendi yolunda yürümeli ve kendi ekosistemini kurmalı. Aksi takdirde çok fazla ilerleyeceğini düşünmüyorum. Çünkü günümüzde durum böyle, sadece bir dil olarak yaşama şansı pek yok, çevresine kendi ekosistemini kurmalı. Neyse bu derin bir konu...kısaca böyle :)

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

May 26, 2012

Aslında D.NET diye bir proje vardı diye hatırlıyorum da şimdi baktım geliştiricisinin adresi şuymuş: http://www.dejaaugustine.com

Ama devamı gelmemiş! Ben de bir ara, kurmayı denemiştin ama başarı olamamıştım. Sanırım bu çatıda (framework) D kodu yazsaydık sanırım her yerde 'cast()' kullanmamızı isteyecekti. C# bundan dolayı biraz hassas bir dil. İşte bundan dolayı D'yi seviyorum çünkü esnek...

Bu esnekli kararlılığı azaltıyor olabilir mi? Olabilir ama kodlar istediğim gibi çalışıyor. Tür çıkarsama mükemmel derecede. Hatta derlerken bile yazım hatalarından dolayı bana önerdiği nesne isimleri de %90 tutuyor. Belki bir gün yapay zekanın ağırlıklı olduğu diller geliştirilir de bize sadece ne istediğimizi ifade (derdimizi belli) etmemiz düşecek ve gerisini derleyici kendi başına halledecek.

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

May 25, 2012

Alıntı (Salih Dinçer):

>

Ama neden benim amatörce yaptığım süzme girişimim sırasında object code büyüdü ona anlam veremiyorum.

Ben de bilmiyorum. Program büyüklüğü hep konu edilmiştir. C++ forumlarında C ile karşılaştırıldığını hatırlıyorum. Bir itirafım var: ben nedense bu konularla hiç ilgilenemedim. Herhalde bellek darlığı bulunan ortamlara program yazmadığım için olsa gerek. :)

Alıntı:

>

Ortak bir assembly olması, dil farklılıkları ve ortak kütüphane çok sevimli görünüyor.

Doğru. Çok var öyle ortak dil kullanan ortamlar. Ben ilk olarak Java ile öğrenmiştim.

Ali

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