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...

Haftanın Şarkısı

Adam And Eve
[Paul Anka]
45'lik - 1960

Birkaç kuşak üzerinde derin etkiler bırakan Paul Anka pop müziğin en tanıdık simalardan biri şüphesiz. 1960’ta 45’lik olarak piyasaya sürülmüş olan Adam And Eve şarkısı Adem ile Havva’nın bilinen hikayesini konu alıyor...

Seneler önce Ottawa’da yürürken Paul Anka caddesiyle karşılaşıncaya kadar ben onu hep Amerikalı sandım. 2006’daki İstanbul konserine gidemediğim için ise hala yanarım…


Eski Haftalar

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 Sistemlerinde Proseslerin Yaratılması ve Sonlandırılması

    Hemen her işletim sistemi bir proses yaratıldığında o prosese özgü bilgileri bir veri yapısında saklar. Çalışmakta olan proseslere ilişkin bilgilerin saklandığı veri yapısına proses kontrol bloğu denilmektedir.[1] UNIX türevi sistemlerde prosesin gerçek ve etkin (effective), kullanıcı ve grup id’leri, prosesin çalışma dizini, açmış olduğu dosyalar gibi prosese özgü önemli bilgilerin hepsi proses kontrol bloğunda tutulmaktadır. Proses kontrol bloğunun nasıl düzenlendiği ve tam olarak hangi elemanlara sahip olduğu sistemden sisteme, hatta aynı sistemlerde versiyondan versiyona değişebilmektedir. Örneğin Linux sistemlerinde proses kontrol bloğu oldukça fazla elemana sahip olan task_struct yapısı ile temsil edilmiştir.  Bu yapının bir bölümünü aşağıda veriyoruz (Version:2.6.35, include/linux/sched.h):

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.

C ismi B'den geliyor. Peki B ismi nereden geliyor?

Ben de eskiden Bell Lab'ın B'sinden ya da BCPL'in B'sinden geldiğini sanırdım. Fakat Ken Thompson bir röportajda karısı Bonnie'nin B'sinden geldiğini şaka yollu söylüyor. Nasıl, romantik değil mi?

C/C++'ta main neden anahtar sözcük değil?

Teknik olarak bir atomun anahtar sözcük olması için derleyicinin ona diğer değişken atomlardan farklı bir işlem uygulaması gerekir. Yani anahtar sözcükler parse işlemi sırasında diğer değişkenlerden (identifiers) ayrılmaktadır. Halbuki C ve C++'ta her ne kadar main fonksiyonunun diğer fonksiyonlardan farklı bir özelliği varsa da derleyici bu bu ismi gördüğünde buna diğer değişkenlerden farklı bir işlem uygulamamaktadır. main derleyici tarafından değil, bağlayıcı (linker) tarafından aranır. Ayrıca main anahtar sözcük olmadığı için bu isimde başka değişkenler bildirilebilir.

Derleyici ve işletim sistemi gibi temel sistem programlarını yazmaya çalışmanın ne anlamı var? Bunların zaten yazılmışı yok mu, bunların bir bölümü zaten açık kaynaklı değil mi?

Olanı incelemek ya da değiştirmek hiçbir zaman sizi onları yazanların düzeyine getirmez. Bu kafayla da bir yere varılmaz. Zaten dediğiniz yazılımları yazanlar da sizin kafada olsalardı bu yazılımlar asla gerçekleştirilemezdi.Şunu unutmamak gerekir ki bu tür projeler gerçekleştirilirken pek çok kişi yetişmekte ve önemli deneyimsel kazanımlar elde edilmektedir. Belli aşamalardan geçmemiş olan bizim gibi ülkelerin bu kazanımları kestirmeden elde edebilmeleri mümkün değildir. Zaten teknolojiyi dışarıdan alarak onların önüne geçmiş olan bir ülke modeli de yoktur.

En iyi IDE hangisidir?

En iyi olduğunu sandığınızdır. Bu konuda sizi ikna edemem.

Hiç kart deldiniz mi?

Evet, IBM main frame'leri için kart delmiştim.

Klavyedeki en sevdiğiniz tuş?

F1

Neden bazı okullarda hala Fortran öğretiliyor?

Dersi verenlerin yalnızca Fortran bilmeleri nedeniyle.

Okulda hocamız goto kullanmayın diyordu. Şimdi kullanalım mı, kullanmayalım mı?

Gerektiğinde kullanın. Acaba hocanız "yahu madem kullanmayacaktık o halde bunu dile neden koymuşlar" gibi bir soruya nasıl yanıt verirdi?..

Pardus hakkında ne düşünüyorsunuz?

Linux için Türkçe bir dağıtım hazırlanmasını olumlu karşılıyorum ve destekliyorum. Ancak "Ulusal İşletim Sistemi" tanımlamasını komik buluyorum. Ulusal İşletim Sistemi diyebilmek için ciddi bir mühendislik katkı gerekir. Bu katkı da özellikle çekirdek düzeyinde olmalıdır.

Programcılıktan emekli olunur mu?

Mevzuata göre evet fakat pratikte hayır. Şirketler belli yaşı geçmiş programcıları ya müdür yapıyorlar ya da işten atıyorlar. Gençleri daha az parayla çalıştırabiliyorlar. Ayrıca "doktorun yaşlısı, programcının genci makbuldür" biçiminde toplumda yaygın ve yanlış bir inanış da var.

Programların son versiyonları hakkında ne düşünüyorsunuz?

Elde bulunmasında fayda var. Ama takıntı haline getirmemek lazım.

Sistem programcılığında para var mı?

Dünya ölçeğinde evet. Fakat ülkemizde pek yok. Tabi bir sistem programcısı asla aç kalmaz.

Tab aralığı kaç olmalıdır?

Algılama konusunda yapılan pek çok araştırmaya göre 2 ile 4 arasında. Fakat neden hala bazı editörlerde default 8, ben de anlamış değilim...

Yaşlanan programcılara ne olacak?

Yaşlı programcıyı şirketler çalıştırırmak ister mi bilmiyorum. Kanımca bunlardan bir kısmı kendi şirketlerini kurup patron olur, bir kısmı müdür olur. İşte kalan kısmının ne olacağını önümüzdeki yıllarda hep birlikte göreceğiz.  Fakat "kurt kocayınca köpeklere maskara olur" biçiminde bir halk deyişi hiç aklımdan çıkmaz. Umarım böyle dramatik bir sonla karşılaşmayız.

İyi bir C/C++ programcısı nasıl olmalıdır?

1) Dilin kurallarını eksiksiz bilmeli ve bu konuda hiçbir tereddütü olmamalıdır.
2) Farklı konularda uygulamalı çalışmalar yapmış olmalıdır.
3) Düşündüklerini hızlı bir biçimde koda dönüştürebilecek beceriye sahip olmalıdır.
4) Sistem programlama konusunda temel düzeyde de olsa uygulamalı çalışma yapmış olmalıdır.
5) Üzerinde çalıştığı projeyi bitirebilecek motivasyona ve enerjiye sahip olmalıdır. 

Not: iyi bir C/C++ programcısının temiz ahlaklı olması gerekmiyor. Fakat olsa iyi olur...


Haftanın Böceği Yukarı