Bilim, organize edilmiş bilgidir.

Herbert Spencer

Bana Atılan E-Postaların Yanıtları

Sevgili Arkadaşlar...

Bu site aracılığıyla -bazıları sorulardan oluşan- pek çok e-posta alıyorum. Ancak yoğunluk nedeniyle bazılarına yanıt yazamadım.  Sakın unuttum sanmayın ve "adam bir yanıt bile yazmadı" diye düşünmeyin :-). Bundan sonra atacağınız e-postalara da daha kısa bir süre içinde yanıt vermeye çalışacağım. Gecikme için özür diliyorum...

 

Lütfen Alıntılarda Kaynak Belirtiniz

Çeşitli Internet sitelerinde yazmış olduğum makalelerden, ders notlarından, çizimlerden, kaynak kodlardan vs. bire bir alıntı yapıldığını, ancak kaynak belirtlmediğini görüyorum. Lütfen bu gibi alıntlarda kaynak belirtiniz.

Kitap Eleştirisi

Artık her hafta sitede bilgisayar alanında basılmış bir kitabın eleştirisini göreceksiniz. Umarım beğenirsiniz...

Tarihe Göre

Yeni İçerik

C’nin Standart Dosya Fonksiyonlarının Uyguladığı Tamponlama Mekanizması

    Standart C fonksiyonlarını kullanmadan bir dosyanın her byte’ı üzerinde sırasıyla işlem yapmak isteyelim. Herhalde ilk akla gelecek yöntem doğrudan işletim sisteminin sistem fonksiyonlarını çağırmak olacaktır. Örneğin UNIX/Linux sistemlerinde dosyayı read fonksiyonuyla (Windows sistemlerinde ReadFile fonksiyonuyla) byte byte aşağıdaki gibi okuyabiliriz:
 
int fd;
ssize_t result;
unsigned char ch;

if ((fd = open("test", O_RDONLY)) < 0) {
    perror("open");
    exit(EXIT_FAILURE);
}

while ((result = read(fd, &ch, 1)) > 0) {
    /* Okunan byte işleniyor */
}   

if (result < 0) {
    perror("read");
    exit(EXIT_FAILURE);
}   

close(fd);

Programların Komut Satırı Argümanları

    İşletim sistemi tarafından prosese geçirilen komut satırı argümanları program içerisinden çeşitli biçimlerde elde edilebilmektedir. En yaygın yöntem komut satırı argümanlarının programın başlangıç fonksiyonunun parametrelerinden elde edilmesidir. Örneğin, C ve C++’ta komut satırı argümanları main fonksiyonuna parametre olarak geçirilirler. Bu dillerin standartlarına göre programın başlangıç noktasını (entry point) belirten main fonksiyonunun parametrik yapısı ve geri dönüş değeri aşağıdaki iki durumdan biri biçiminde olmalıdır:

int main(void)  { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }

UNIX/Linux ve Windows Sistemlerinde Stdin, Stdout ve Stderr Dosyaları

    Yalnızca UNIX/Linux sistemlerinde değil modern işletim sistemlerinin çoğunda aygıtlar birer dosyaymış gibi ele alınmaktadır. Örneğin klavye ve ekran -aslında birer dosya olmadığı halde- işletim sistemi tarafından sanki birer dosyaymış gibi işleme sokulurlar. Aygıtlara ilişkin bu tür dosyalar için de birer dosya betimleyicisi ve dosya nesnesi vardır. Bu betimleyicilerle işlem yapıldığında işletim sisteminin dosya alt sistemi aslında bu dosyaların birer aygıta ilişkin olduğunu anlar ve okuma/yazma amacıyla o aygıtlara yönelir. UNIX türevi sistemlerdeki çokbiçimliliği (polymophism) andıran bu tasarıma Sanal Dosya Sistemi (Virtual File System) denilmektedir.  

C#'taki Yapı ve Sınıf Nesneleri Nerede Yaratılıyor?

Pek çok C# programcısının sınıf ve yapı kavramlarıyla stack ve heap kavramlarını yanlış bir biçimde ilişkilendirdiğini görüyorum. Örneğin, “yapı nesneleri stack’te sınıf nesneleri heap’te tutulur” biçiminde yanlış anlaşılmaya yol açacak bilgiler veren yerli ve yabancı çok sayıda yazı ve makaleyle karşılaştım. Konuya biraz açıklık getirmek istiyorum.

UNIX/Linux Sistemlerinde Dosya Betimleyicilerinin Anlamı

    UNIX/Linux sistemlerinde her prosesin proses tablosu yoluyla erişilen bir dosya betimleyici tablosu (file descriptor table) vardır. Dosya betimleyici tablosu bir gösterici dizisi biçimindedir. Betimleyci tablo içersindeki her gösterici açılmış bir dosyanın bilgilerinin tutulduğu ve ismine dosya nesnesi (file object) denilen bir veri yapısını gösterir. open fonksiyonundan elde edilen dosya betimleyicisi (file descriptor) prosesin dosya betimleyici tablosunda bir indeks belirtmektedir.

Proseslerin Çevre Değişkenleri

    Modern işletim sistemlerinde her prosesin bir çevre değişken bloğu vardır. Prosesin çevre değişken bloğu çevre değişkenlerinden ve onların değerlerinden oluşmaktadır. Örneğin, MESAJ bir çevre değişkeninin ismi olabilir, “Merhaba Dunya” ise onun değeri olabilir. Çevre değişkenleri pek çok işletim sisteminde proses yaratılırken belirlenebilmekte  ya da üst prosesten (parent process) aktarılabilmektedir. Çevre değişkenlerinin üst prosesten aktarılması en çok karşılaşılan tipik durumdur.

Ağustos
20
2009

i, j, k, l, m, n İsimleri Nereden Geliyor?

    i, j, k, l, m, n döngü değişkeni olarak en çok tercih edilen isimler. Nerede bir for döngüsü görseniz döngü değişkeninin ismi büyük olasılıkla ya i’dir ya j’dir ya da k’dır. Hiç düşündünüz mü neden a değil, b değil, c değil de i, j, k? Eski kuşak programcılar (yani bayağı bir eskiler) bunun nedenini iyi bilirler. Dolayısıyla bu açıklamayı onlar için değil yeni kuşak yazılımcılar için yapacağım.
 
     i, j, k isimlerinin döngülerde kullanılması FORTRAN kaynaklı bir gelenek. FORTRAN’da isminin ilk harfi i, j, k, l, m, n ile başlayan değişkenler INTEGER türünden diğerleri ise REAL türünden kabul ediliyordu. (FORTRAN’ın büyük harf küçük harf duyarlılığı olmayan bir dil olduğunu da anımsatayım) Her ne kadar FORTRAN’a 66 versiyonu ile birlikte bildirim kavramı eklendiyse de yine klasik BASIC’te olduğu gibi otomatik bildirim (implicit declaration) kuralı korundu. i, j, k, l, m, n bu dilde yazılabilecek en kısa tamsayı değişken isimleridir. Bu nedenle programcılar bu isimleri döngülerde çokça kullandılar. Sonra diğer diller ortaya çıktıkça bu gelenek sürdürüldü. Tabi siz de sorabilirsiniz şimdi “peki FORTRAN tasarımcıları bu i, j, k, l, m, n harflerini nereden kafaya takmışlar?” diye. Bunu kesin olarak bilmiyorum. Fakat matematikte bu sembollerin indis belirleyicisi olarak kullanılmasının etkili olduğunu sanıyorum.

     FORTRAN dünyanın ilk yüksek seviyeli programlama dilidir. Ben bilgisayara başladığımda FORTRAN IV’ün biraz daha geliştirilmiş ve yapısal biçimi olan FORTRAN 77 kullanılıyordu. Bunu FORTRAN 90, FORTRAN 95, FORTRAN 2003 ve nihayet FORTRAN 2008 izledi. İnsanlığın ilk göz ağrısı olan FORTRAN’a kol bacak takarak yeni özellikler eklediler ve hatta nesne yönelimli yaptılar. Bir programlama diline ekleme yapıla yapıla zamanla ortaya bir şaheser mi, ucube mi çıkar? Acaba o dili son yıllarında rahat bırakıp gereksinimleri yetmeyenleri başka dillere yönlendirmek daha mı doğrudur? Sonraki günlerde bu sorulara yanıt niteliğinde bazı şeyler yazmayı planlıyorum.
 
     FORTRAN uygulama yazılımcılarının gereksinimlerini karşılayacak bir dil değil. Fakat Üniversitelerde ve araştırma kurumlarında hala kullanılıyor. Sanıyorum bunun bir nedeni de pek çok bilgi kolunda yazılmış çok miktarda FORTRAN kodunun bulunuyor olması...

Haftanın Böceği Yukarı