Bilgisayar Bilimleri -6- Bilgisayar Yazılımlarının Tarihi

Bilgisayarları daha öncesinde donanım ve yazılım olmak üzere iki kısma ayırmıştık. Az önce  bilgisayar tarihinden bahsederken aslında bir bakıma bilgisayar donanımının tarihinden bahsettiğimizi söyleyebiliriz. Çünkü bilgisayar donanımı ile bilgisayar yazılımı bir bakımdan da birbirinden ayrı kollardır ve ikisinin çalışma alanları farklıdır. Bilgisayar donanımı elle tutulur ve gözle görülür bir sistemin tasarımı iken o sistem üzerinde o sistemin tahmin edemeyeceği, bilemeyeceği ve hesaplayamadığı yazılımları ve yazılım metodlarını geliştirmek yazılımın alanıdır. Örneğin sıralama algoritmaları ve programları yazılıma dahil iken donanımla herhangi bir alakası yoktur. Donanım bu algoritmaları değil dört işlemi, mantık işlemleri ve veri okuyup yazmayı bilir. Kısacası bilgisayar yazılımı ve programcılık o yüzden özellikle bir seviyeden sonra donanımdan bağımsız bir disiplin haline gelmiştir.

İlk Nesil Yazılım (1951-1959)

İlk bilgisayar programları makine dili ile yazılıyordu ve komut setinden meydana gelmekteydi. Her bir komut kendisi için ayrılmış devreyi çalıştırmaktan ibarettir. İlk bilgisayarlarda devreler vakum tüpleri ile meydana geldiği için her bir komutun çalışması için mantık devreleri kurulmaktaydı. Bu devrelerin yanı sıra programlama için tuş takımından öte bir aygıt yoktu. Bilgisayar programı doğrudan derlenmiş haliyle yazılır ve sıralanmış makine komutlarından oluşurdu. Makine kodu ile programlamak 1 ve 0’ları temsil eden anahtarlar veya soketler vasıtasıyla olabildiği gibi dekoder devreler vasıtasıyla tuş takımı veya onaltılık sayı biçimde olabilir. Binary yerine onaltılık sayı sisteminde program yazmak her zaman daha anlaşılır olmaktadır. Makine kodunda makinenin mimarisini bilmek çok önemli olup her makinenin mimarisi farklı olduğu için farklı bir makineye geçişte her şeyi baştan öğrenmek gerekecektir.

Makine dili ile program yazmak oldukça zahmetli olduğu gibi bu yazılan programda hata ayıklamak, değişiklik yapmak veya yazılan programı başkasının okuması da oldukça zahmetli olmaktadır. Bu yüzden programcılar programlamayı kolaylaştırma adına geliştirme araçları tasarlamaya çalışmışlardır. Bu çalışmanın ilk ürününe “Assembly dilleri” adı verilmektedir. Assembly dilleri dememizin sebebi tek bir Assembly programlama dili olmayışındandır. O dönem her makinenin ve mimarinin kendine has makine komutu olduğu gibi kendine has Assembly dili bulunmaktaydı. Assembly dili basit olarak makine kodunun mnemonik adı verilen alfanümerik kısaltmalarla temsil edilmesinden ibarettir. Örneğin bir makinede toplama işlemini yapan komut 0x56 ise bunu alfanümerik olarak temsil etmek istersek “ADD” veya Türkçe olmasını istersek “TOPLA” adını veririz. Bu tamamen temsilden ibarettir ve Assembler adı verilen çevirici program “ADD” gördüğü yere 0x56 değerini yapıştırmaktan öte gitmez.

Komutlarla verinin mnemonikler vasıtasıyla programda birbirinden ayrı gözükmesi Assembly dillerinin makine diline göre üstünlüklerinden biridir. Makine dilinde program yazarken komutlar da veriler de sayısal biçimde yazıldığından birbirine karışmış halde gözükmektedir. Örneğin onaltılık tabanda bir toplama komutunu makine dilinde gerçekleştirdiğimizi varsayalım. Bunun için şöyle bir komut yazmamız gerekir.

56 01 55 
Burada 01 numaralı adrese 55 değeri ile 56 işlemini uygulaması yönünde bir talimat verdik. Elbette bu talimat bir varsayım ve hiçbir mimari ile alakası yok. Fakat burada tek bir komutu bile anlamak zor görünürken komutların birbiri ardınca sıralandığı programı çözümleyebilmenin nasıl zor olduğunu hayal edebilirsiniz. Aynı programı Assembly dilinde yazmak istesek şöyle olacaktı.

ADD R1 0x55

Burada “ADD” derken toplama işlemi yaptığımız, adresin R1 yazmacı olduğu ve değerin on altılık tabanda 55 olduğu açıkça karşımıza çıkmaktadır. Makine dili ile ararsında sadece söyleniş farkı bulunan bu dil elbette ilk çıktığı zamanlar günümüzdeki kadar gelişmiş değildi. Örneğin değer tanımları (EQU direktifi) veya etiketler mevcut değildi. Assembly dili ilkel hali ile sadece makine komutlarının birer “çevirisi” iken eklenen özellikler ile belli başlı özelliklere kavuşmuştur. Aşağıda x86 assembly diline ait örnek bir kodu görebilirsiniz.

 

İkinci Nesil Yazılım (1959-1965)

Bu noktada artık gerçek programlama dillerinin ortaya çıkışını görürüz. Assembly dilinin yukarıda aslında bir programlama dili olmaktan ziyade makine dilinin insan diline çevirisinden ibaret olduğunu anlatmıştık. Makine dilindeki komutları insan diline çevirmekle yine makinenin dilinde program yazmaktan kurtulmuyoruz. Makine bizim dilimizde veya bizim oluşturduğumuz dilde programı asla anlamamaktadır. O yüzden makinenin kurallarına boyun eğmek durumunda kalırız. İnsan dili ve makine dili ile arasında da büyük bir uçurum olduğu için bu bir sorun teşkil etmektedir. Biz matematikte toplama işlemi için iki değer arasında “+” ifadesini kullanırken Assembly’de “ADD” komutunu kullanmak zorunda kalırız. O yüzden programlama dilini tasarlayanlar programlama dillerinin İngiliz diline, dil mantığına, matematik diline ve mantık diline benzerliklerini göz önünde bulundurmuş ve bunlara benzetmeye çalışmışlardır. İkinci nesil programlama dillerinin bir özelliği de amaca yönelik tasarlanmalarıdır. FORTRAN bilimsel ve matematik hesapları için COBOL ise iş uygulamaları için tasarlanmıştır. FORTRAN günümüzde dahi kullanılan etkin bir programlama dilidir. Lisp ise o günlerde tasarlanan ve günümüzde dahi kullanılan pek bilinmeyen bir programlama dilidir. Yapay zeka ve araştırmalarda kullanılmaktadır. Yüksek seviye programlama dillerinin gelmesi ile o dilde yazılan program pek çok makinede kullanılabilir hale gelmiştir. Böylelikle aynı işi yapan yani aynı algoritmayı yürüten programı tekrar tekrar yazma zorunluluğu ortadan kalkmıştır. Eski dönemlere ait bir FORTRAN kodunu aşağıda görebilirsiniz. Unutmayın bu dilin yeni sürümü ile eskisi arasında bir fark bulunmaktadır.

Görüldüğü gibi Assembly dilinde olduğu gibi makine komutlarının bir listesi halinde değil daha çok matematik formüllerine benzetilen bir dil karşımıza çıkmaktadır. İkinci nesilden itibaren artık programcılar “Sistem Programcısı” ve “Uygulama Programcısı” olarak ikiye ayrılmış ve görevleri iyice belirginleşmiştir. Sistem programcıları yukarıda örneğini verdiğimiz programlama dillerini yürütecek derleyici ve yorumlayıcı programları yazarken uygulama programcıları ise bu programlama dillerini kullanarak uygulama geliştirmektedir. Böylelikle uygulama programcıları donanımdan soyutlanmış olmakta ve donanımla uğraşma işi ise sistem programcılarına bırakılmış olmaktadır.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

 

 

 

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.