Teknolojik ilerleme, patolojik bir suçlunun elindeki balta gibidir.

Albert Einstein

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

Proseslerin Kod, Data, BSS, Stack ve Heap Alanları

Prosesler işletim sistemlerinin sundukları sistem fonksiyonlarıyla yaratılırlar. Örneğin, Windows sistemlerindeki CreateProcess, UNIX/Linux sistemlerindeki fork proses yaratan fonksiyonlardır. Windows ve UNIX/Linux sistemlerindeki proses yaratımları arasında önemli bir fark vardır. Windows sistemlerindeki CreateProcess fonksiyonu çalıştırılabilen (executable) bir dosyadan hareketle prosesi oluşturur. (Yani yaratılacak proses yol ifadesini argüman olarak verdiğimiz programın kodlarını çalıştıracaktır.) Halbuki UNIX/Linux sistemlerindeki fork fonksiyonu prosesin özdeş bir kopyasını oluşturmaktadır. Bu sistemlerde başka bir programın kodları ancak exec türevi fonksiyonlarla çalıştırılabilir. Fakat programcı bu sistemlerde doğrudan exec fonksiyonunu kullanırsa çalışmakta olan mevcut programın bellek alanı değiştirilerek proses yaşamına başka bir kodla devam eder. Bu nedenle UNIX/Linux sisteminde hem mevcut programı sürdürmek hem de yeni bir programı çalıştırmak istiyorsak fork ve exec fonksiyonlarını beraber kullanmamız gerekir. Bu sağlamak için de, tipik olarak, önce bir kez fork yaparız, alt proseste exec uygularız. Windows sistemlerindeki CreateProces fonksiyonu UNIX/Linux sistemlerindeki fork ve exec fonksiyonlarının bileşimine benzetilebilir.

Portable Executable Dosya Formatı

Microsoft, DOS işletim sisteminde çalıştırılabilen dosya formatı olarak MZ formatını kullanıyordu.[1] MZ formatı koruma mekanizması olmayan 8086 mimarisi için tasarlanmıştı ve korumalı modun gereksinim duyduğu özelliklere sahip değildi.  Bu nedenle Microsoft 16 bit Windows sistemleriyle birlikte çalıştırılabilir dosya formatını NE (New Executable) ismiyle, 32 bit Windows sistemleriyle de PE (Portable Executable) ismiyle yenilemiştir. Bugün 32 bit ve 64 bit Windows sistemlerinde çalıştırılabilen dosya formatı olarak PE formatı kullanılmaktadır. PE formatı UNIX türevi sistemlerde kullanılan ELF (Executable and Linkable Format) formatı gibi, işlemciden bağımsız olan ve bölümlerden (sections) oluşan bir formattır. Microsoft .NET ortamıyla birlikte PE formatı üzerinde bu ortamın gereksinimlerinin karşılanması için çeşitli eklentiler de yapmıştır. PE formatının orijinali 32 bittir. Fakat daha sonraları 64 bit sistemler için bu formatın 64 bit versiyonu da oluşturulmuştur. PE formatının 64 bitlik bu versiyonuna PE+ da denilmektedir.

Dinamik Diziler (Veri Yapıları 2. Bölüm)

Programlama dillerinin çoğunda diziler bir kere yaratıldıktan sonra artık büyütülemezler ve küçültülemezler. Oysa bazı durumlarda açacağımız dizinin uzunluğunu işin başında bilemeyiz. Programın çalışma zamanı sırasında onların dinamik bir biçimde büyütülmesini ya da küçültülmesini isteyebiliriz. Programın çalışma zamanı sırasında büyütülebilen ya da küçültülebilen dizilere dinamik diziler (dynamic arrays) denilmektedir.[1]  Dinamik diziler C, C++, Java ve C# gibi dillerde temel bir veri yapısı değildir. Yani bu dillerde dinamik diziler dilin sentaksı tarafından doğrudan desteklenmezler. Bunların fonksiyonlar ya da sınıflar kullanılarak gerçekleştirilmeleri gerekir. Ancak Perl ve Ruby gibi dinamik dizilerin dilin sentaksı tarafından temel bir veri türü olarak desteklendiği diller de vardır.

Önbellek (Cache) Sistemleri

Bilgisayar sistemlerinde pek çok durumda erişim hızı bakımından iki tür belleğin söz konusu olduğunu söyleyebiliriz: Yavaş bellek ve hızlı bellek. Yavaş bellek ucuz ve boldur, hızlı bellek ise pahalı ve kıttır. Tabi buradaki yavaş ve hızlı kavramları görelidir.  Sistemden sisteme yavaş ve hızlı bellekler farklılaşabilir. Örneğin bir sistemde RAM hızlı belleği temsil ederken disk yavaş belleği temsil ediyor olabilir. Başka bir sistemde ise RAM yavaş belleği temsil ederken işlemci içerisinde bulunan bellek hızlı belleği temsil ediyor olabilir. Ya da bir web sayfasının sunucuda saklandığı yer yavaş belleği temsil ederken onun istemcide bir dosyada saklanmış hali yavaş belleği temsil ediyor olabilir. Önbellek (cache) yavaş belleğin belli bölümlerinin hızlı bellekte tutularak yavaş belleğe erişim oranını azaltmak için kullanılan bir bellek yönetim tekniğidir. Önbellek sistemleri donanımsal ya da yazılımsal bir biçimde ya da karma bir biçimde gerçekleştirilebilmektedir.

UNIX/Linux Sistemlerinde Boru Haberleşmeleri

Boru haberleşmeleri yalınlığından dolayı en çok tercih edilen prosesler arası haberleşme yöntemlerindendir. Yöntem kendi içerisinde eşzamanlılığı da barındırdığından programcının ayrıca eşzamanlılık sorunuyla uğraşmasına gerek kalmaz. Boru haberleşmeleri ilk UNIX sistemlerinden beri neredeyse tüm UNIX türevi sistemlerce desteklenmiştir. Yöntem başta Windows olmak üzere pek çok işletim sisteminde de benzer biçimde uygulanmaktadır.

Temel Veri Yapıları (Veri Yapıları 1. Bölüm)

Programlarımızda tanımladığımız nesneler ya tek parçadan ya da birden fazla parçadan oluşurlar. Tek parçadan oluşan nesnelerin türlerine tekil türler, birden fazla parçadan oluşan nesnelerin türlerine ise bileşik türler denilmektedir. Örneğin, int türü tekil bir türdür. Çünkü int türden bir nesne tek parçadan oluşmaktadır. Halbuki diziler bileşik türlerdir. Bir dizi türünden nesne tanımladığımızda o nesne kendi içerisinde birden fazla parçadan oluşmaktadır. Örneğin:

C'de Bağlanım (Linkage) Nedir, Ne Değildir?

C'de kullanılan her değişken (identifier) için bir bildirimin yapılmış olması gerekir. Bağlanım (linkage) farklı bildirimlerdeki aynı isimli değişkenlerin aynı nesneyi ya da fonksiyonu belirtip belirtmediğini anlatan bir özelliktir. C'de değişkenlere ilişkin üç  bağlanım durumu söz konusudur:

Ocak
26
2010

Bilgisayar Bilimleri İçin İki Kategorizasyon Sistemi

    Bir nesne ya da olgunun bütün içerisindeki yerinin belirlenmesi ve diğer nesne ya da olgularla ilişkilerinin betimlenmesi sürecine kategorizasyon deniyor. Kategorizasyonun sentezlemeyi artırarak öğrenmeye katkıda bulunduğunu söyleyebiliriz. Sentezleme süreci de anlamsal bellek (semantic memory) içeriğindeki ilişkileri sağlamlaştırıyor olabilir.

    İngilizce'de categorization, taxonomy ve classification terimleri birbirleri yerine kullanılabiliyor olsa da bunların etimolojileri ve kavramsal vurgulamaları arasında bazı farklılıklar göze çarpıyor. Örneğin taxonomy terimi daha çok (etimolojisi biyoloji ile ilgili) nesneleri ve olguları altlık üstlük ilişkisi içerisinde sınıflandırmak için kullanılırken, categorization daha genel sınıflandırmalar için kullanılan bir terim. Yani taxonomy bir ağaç yapısını çağrıştırırken categorization bir graf yapısını çağrıştırıyor. Classification
teriminin ise  daha genel anlamda kullanıldığını görüyoruz. Fakat ne olursa olsun bu üç terimin aralarındaki farklar çok belirgin değil ve bu terimler birbirlerinin yerine kullanılabiliyor.

    Bir konu hangi konunun içindedir? O konunun alt konuları nelerdir? Diğer yakın konularla ilişkileri nasıldır?.. Kategorizasyon bu sorulara yanıt oluşturuyor. Örneğin:

- C
nedir?   
    - Bir programlama dilidir.
- Programlama dili nedir?
    - Bir bilgisayar dilidir.
- Bilgisayar dili nedir?
    - Kurgusal bir dildir.
- Kurgusal dil nedir?
 ....
Pekiyi C yalnızca bir programlama dili midir?..

    Ben bu yazıda bilgisayar bilimleri için çokça karşılaşılan iki kategorizasyon sisteminden bahsedeceğim. Birincisi ACM’nin (Association for Computing Machinery) sistemi. ACM bilimsel makaleleri bu sisteme göre sınıflandırıyor. (Ben de ACM üyesi olarak ACM’in dijital kütüphanesinden ve buradaki makalelerden uzunca bir süredir faydalanıyorum:
www.acm.org) Diğeri ise Wikipedia’nın kullandığı sistem. Wikipedia oldukça zengin bir ansiklopedik kaynak. Günbegün daha da zenginleşiyor.[1]

   
ACM kategorizasyon sistemi 4 düzeyli (yani yüksekliği 4 olan) bir ağaç yapısı biçiminde. ACM bu ağaç yapısını birkaç kez yeniledi.  Ağacın son uyarlaması 98 yılında yapıldı (http://www.acm.org/about/class/). ACM sınıflama ağacının ilk üç düzeyi kodlanmış elemanlardan, son düzeyi ise kodlanmamış elemanlardan oluşuyor. İlk düzeydeki elemanlar harflerle temsil edilmiş. Aşağıda ilk düzey elemanları görüyorsunuz:

A. General Literature
B. Hardware
C. Computer Systems Organization
D. Software
E. Data
F. Theory of Computation
G. Mathematics of Computing
H. Information Systems
I. Computing Methodologies
J. Computer Applications
K. Computing Milieux


İkinci düzey elemanlar numara içeriyor. Örneğin, "D (Software)"
düğümünün alt düğümleri şöyle:
   
D. Software    
    D.0 GENERAL    
    D.1 PROGRAMMING TECHNIQUES    
    D.2 SOFTWARE ENGINEERING    
    D.3 PROGRAMMING LANGUAGES    
    D.4 OPERATING SYSTEMS    
    D.m MISCELLANEOUS
   

İlk düzey dışındaki her düzeyin sonunda “m" kodlu bir "Miscellaneous” bölümü bulunuyor. Diğer konuların içerisine girmeyen konular bu bölüme yerleştiriliyor. Üçüncü düzey de yine numara içeren elemanlardan oluşmakta. Örneğin, "D.3 PROGRAMMING LANGUAGES
"   düğümünün üçüncü düzey alt düğümleri şöyle:

D. Software    
    D.3 PROGRAMMING LANGUAGES    
        D.3.0 General    
        D.3.1 Formal Definitions and Theory    
        D.3.2 Language Classifications    
        D.3.3 Language Constructs and Features    
        D.3.4 Processors    
        D.3.m Miscellaneous   

Ağacın dördüncü düzey elemanları kodlanmamış biçimde bulunuyor. Bu düzeydeki elemanlara “Implicit Subject Descriptors” ya da “Proper Noun Subject Descriptors
deniyor ve bu elemanların güncellemesi sıkça yapılıyor. Örneğin, “D.3.2 Language Classifications” düğümünün kodlanmamış elemanlarının bir bölümü şöyle:
   
D. Software    
    D.3 PROGRAMMING LANGUAGES    
        D.3.0 General    
        D.3.1 Formal Definitions and Theory    
        D.3.2 Language Classifications  
           
...
            BRL   
            Bertrand   
            Borland C++   
            C   
            C#   
            C++   
            CADLAN   
            CDL*   
            CHILL   
            CIL   
            CIP   
            CLEAR   
            CLIST   
            CLIX   
            CLOS   
            ...

Bu durumda “C Programlama Dili”nin kategorizasyonu ACM
’in sistemine göre aşağıdaki gibidir:

D. Software 
    D.3 PROGRAMMING LANGUAGES    
        D.3.2 Language Classifications    
            C 

    Şimdi gelelim Wikipedia’ya. Wikipedia’nın kategorizasyon sistemi yönlü (directed) ve döngüsellik içerebilen bir graf (cyclic graph) biçiminde. Graf kategorilerden ve makalelerden oluşuyor. Bir kategorinin birden fazla üst kategorisi (parent category) olabiliyor. Başka bir deyişle bir kategori birden fazla kategorinin içerisinde bulunabiliyor. Makaleler (ya da Wikipedia terimiyle sayfalar) ise kategorilerin içerisinde. Ayrıca, makalelerin de tek bir kategori içerisinde bulunması zorunlu değil. Bir makale birden fazla kategori içerisinde bulunabiliyor. O halde şöyle özetleyebiliriz: Wikipedia’da bir makale bir ya da birden fazla kategori içerisindedir. O makalenin içinde bulunduğu kategoriler de bir ya da birden fazla kategori içerisinde bulunabilirler. Örneğin Wikipedia kategori grafının "C Programlama Dili"
ile ilgili bölümü şöyle:



Algısal karmaşıklığı engellemek için grafın büyük kısmını kırptım. Gördüğünüz gibi "C Programalama Dili" kategorisi hem "C Programlama Dili Ailesi" hem de "Sistem Programlama Dilleri" kategorilerinde bulunuyor. Grafın şu kısmına dikkat ediniz:

Languages
    Constructed languages
        Computer languages
            Programming languages
                Procedural programming languages
                    C programming language

Wikipedia’da bir makaleyi açtığınızda o makalenin hangi kategoriler içerisinde bulunduğu sayfanın en altında veriliyor. Ayrıca belli bir kategorideki alt kategorilerin ve makalelerin listesi de yardımcı yazılımlarla elde edilebiliyor. Örneğin, Wikipedia’daki makale ve kategorilerin graflarını
http://toolserver.org/~dapete/catgraph/ sitesinden faydalanarak çizdirebilirsiniz. Ben de yukarıdaki grafı bu siteyi kullanarak oluşturdum.



[1]
Wikipedia'nın akademik bir kaynak olarak kullanılamayacağını belirtmeliyim. Bunun pek çok nedeni var. Fakat burada ben bunlardan söz etmeyeceğim. 

Haftanın Böceği Yukarı