(PcWorld Dergisi, Ağustos 2006)
Heyecan Uyandıran Giriş: Evet… Artık hazırız. 7 aylık bir algoritma girişinden sonra ufaktan ufaktan program kodlamaya başlayabiliriz! Biliyorsunuz ki hesap makinesi, stok takip programları, muhasebe programları vs. yazabilmek için “program yazma programları”na ihtiyacımız var. Bunlar Pascal, Basic, Delphi, Visual Basic, VB.NET vs… Her bir programlama dilinin kendine ait “grameri” var ve biz bu gramere göre önceden tespit ettiğimiz ALGORİTMAları KODLUYORUZ.
Bekleyişin Sona Erdiğini Sanan Öğrenci Tepkisi: Heytt be! Şükürler olsun. Hangi dil ile başlayacağız muhteremöğretmenim?
Afallatıcı Cevap: Makine Dili ile?
Afallama Ünlemleri: ?!?!...
Girişe Devam: Basit bir hesap makinesi yapalım. Mesela öncelikle bize iki sayı verilsin. Biz de onları toplayalım. Bunun algoritmasını hemen tasavvur edebiliyoruz. Sayıları öğreneceğiz ve toplayıp sonucu söyleyeceğiz, değil mi?
Girişe Katkı: Evet, aynen öyle. Kodları görelim…
Rakam Gibi Görünen Şaşırtıcı Kodlar: 1001010010010110110…
Beklenen Bıçak Gibi Kesme: Abi bu ne?
Beklenen Kesmeye Önceden Hazırlanmış Hazır Cevap: Makine Dili kodları…
Ağlama Girişimleri: Abi gözünü seveyim, ne diyorsun sen, ne makinesi ne dili… Pascal, C, VBasic, Php, Asp… bunlar yok mu bunlar?
Teskin Etme ve Açıklama: Üzülme, bu da geçecek. Şimdi biz olayları çoook detaylı olarak inceliyoruz ya. O bakımdan, aslında “programlama” ve bahsi geçen “dillerin” aslında ne yaptıklarını anlatmak için böyle bir girişi uygun gördüm.
Yetersiz Açıklama Mesajı: Nasıl yani tam anlayamadım, makine dili öğrenmeyeceğiz öyle mi?
Geniş Bir Açıklamaya Önsöz: Tabi ki hayır. Makine dilini öğrenmek gerekmiyor. Çünkü sağ olsunlar, bilgisayarcı amcalar bizim için daha anlaşılır diller üretmişler. Eğer ileride programlama sana dar gelir de yeni bir programlama dili üretmek istersen belki o zaman lazım olur.
Rahatlama Belirtisi ve Bir Soru: Şükürler olsun, rahatladım. Çok korkmuştum. Kabus gibiydi. Peki nedir bu makine dili ve bu bilgisayarcı amcaların faydası ne olmuş?
Beklenen Geniş Açıklama: Çoook eskinden (ki bir çok BT’nin deyimiyle tarih henüz başlarken) atom bombası ile ilgili hesaplamaları daha çabuk yapabilmek amacıyla üretilen ilk bilgisayar icat edildiğinde (1940) bilgisayarcı amcalar, hesap yaptırmak için 1 ve 0 lardan oluşan makine dilini kullanıyorlardı. Çünkü bilgisayar denen makine netice itibari ile elektrikle çalışıyordu ve akımın VAR (1) yada YOK (0) olduğunu belirtmek için Boole cebrinden daha verimli bir yöntem yok idi. Bu yüzden tüm program kodlarının aslı makinenin anlaması için 10101010101… biçimindedir.
Geniş Açıklamanın Yönünü Tayin Edecek Bir Soru: Peki 10011… biçimindeki kodları makine nasıl anlıyor?
Açıklamanın Seyrinde Hafif Bir Değişiklik: Tam olarak bu konumuz değil. Kısaca ve kabaca değinelim. Örneğin, diyelim ki biz bir programlama dilinde şu komutları yazmış olalım:
İlk sayıyı öğren.
İkinci sayıyı öğren.
İlk ve İkinci sayıyı topla.
Bu ifadeler haliyle kelimelerden oluşuyor. Bunu elektrikle çalışan bilgisayarın anlaması beklenemez. İşte biz algoritmayı herhangi bir programlama dilinde (pascal, vbasic…) o dilin kurallarına göre kodladıktan sonra, o programlama dilinin DERLEYİCİSİnden kodları DERLEMEsini isteriz. Derleme yapması demek, aslında, bizim o dilin gramerine uygun olarak yazdığımız kodları bilgisayarın anlayacağı 100011101… biçimine getir, demektir. Örneğimize dönersek, programlama dilinin derleyicisi yukarıdaki üç satırı şu hale getirecektir:
10010010
10001001
10001000
10010101
… (Rakamları tamamen atıyoruz tabi ki)
Derlenen kodlar da bilgisayarın hard diskinde EXE halinde (adresi de belli edilmek üzere) depolanır. Bu depolama manyetiktir. 1 ve 0 sembolleri, bu manyetik sahada “işaretli” veya “işaretsiz” olarak belirlenir. (Eh, hard disk çalışma sistemine girmesek iyi olur )
Anlayacağınız üzere EXE biçiminde bir dosyanın içeriği makinenin algılayacağı 10001011.. biçimindeki bir dizilimdir.
Manyetik olarak depolanan bu EXE dosyayı (programı) çalıştırmak istediğimizde (mouse ile tıkladığımızda), yapılacak işlerin belli edildiği 1 ve 0 diziminden oluşan dosya içeriği, hard diskin kafası vasıtası ile okunarak elektrik akımına çevrilir ve bu sinyaller paketler halinde RAM’e aktarılır. RAM’i kontrol eden işlemci (CPU) gelen bu paket akımları kapılarından geçirerek sonuçları bize verir.
Açıklamanın Yönünü Tekrar Değiştiren Başka Bir Soru: Kapı mı? Ne kapası? İşlemcinin içinde kapı mı var? Aman menteşelerin yağı eksik olmasın. Tam kapanıyor mu bari…
Sinirlenme ve Azarlama: Niye dalga geçiyorsun? Çok mu garip geldi kapı? Çok biliyorsan bir işlemci yapsaydın…
Özür İfadesi: Kusura bakma, tamam tamam sustum.
Konuya Kaldığı Yerden Devam: Evet! İşlemcinin içinde kapı var. Hem de say say bitmez! Ve bu kapılardan akımlar geçer… Ya da geçmez
Kapı İle İlgili İkinci Soru: Ne kapısı bunlar muhterem öğretmenim? Gerçekten böyle bir geçip geçememe muhabbeti mi var?
Kapı Açıklamaları: Evet! Derleyici, makine diline çevirme işlemi esnasında, program kodlarında belirttiğimiz aritmetik (toplama, vs.) veya mantıksal (eşitse, değilse, ve, veya…) operatörlerin hangilerinin kullanacağını da belli eder. Makine dilindeki ifadeler şşlemcideki kapılarda çalışır ve çıktılara dönüşür. Belli başlı kapılar AND, OR, NAND, NOT ‘dır. Başka kapılar da mevcuttur.
Kapı İle İlgili Üçüncü Soru: Nasıl çalışırlar peki?
Kapılarla İlgili Bitmek Tükenmek Bilmeyen Açıklamalara Devam: Burada tüm kapılardan bahsedemeyiz. Mesela AND kapısını ele alalım. AND kapısı çarpma işlemi gibi yada SERİ olarak bağlanmış bir devre gibi düşünülebilir. Girdileri A ve B anahtarının değerleri olarak düşünelim. Herhangi bir anahtarın kapalı olmasını 1 ile (yani akım geçer), açık olmasını 0 ile (akım geçmez) değerlendirelim. Buna göre lambanın yanabilmesi dolayısıyla devrenin tamamlanabilmesi için mutlaka A ve B anahtarları 1 olmalıdır. Yani AND kapısının çıktısının 1 olması için gelen her iki değerin de 1 olması gerekir. Aksi halde sonuç 0’dır yani akım geçmez.
Benzer şekilde, OR kapısı da toplama işlemi gibi yada PARALEL bağlı bir devre gibi düşünülür. (Bu durumda çıktının 1 olması için ne olması gerekir dersiniz?)
İşlemcide cereyan eden tüm işlemler, işte bu kapıların birbirlerine değişik biçimlerde ve sıralarda bağlanması ile oluşturulur.
Yine Yön Değiştirici Ama Geç Kalmış Bir Soru: Tamam, teşekkür ederim. Pek bilgilendim. Artık programlama dilinin derleyicisinin de ne yaptığını biliyorum. Artık Hesap Makinesine geçsek mi…
Neden Geç Kalmış Soru Olduğunu Açıklayan Cevap: Evet yahu, eğer soruların bizi bu noktalara getirmese idi, ben sana programlama dillerinden, seviyelerinden, çeşitlerinden bahsedip örnekler verecektim… Ama yine yerimiz dar geldi :P
GEÇEN AYIN ÇÖZÜMLERİ
Çıkarma; toplamanın tersidir. O halde, toplama işlemi aslında bir sayıya ekleneceksayı kadar 1 eklemek olduğuna göre, çıkarma da çıkarılacak sayıyı, çıkan sayı adedince 1 eksiltmektir. Bölme işlemi ise, bir sayıdan bölen sayının kaç defa çıkarılabileceğini bize söyler.
“Parmak Hesabı” bir toplama işlemi:
Adım 1: EklemeSayısı=0 olarak belirle.
Adım 2: Ekleme yapılacak “ToplananSayı”yı öğren.
Adım 3: Eklenecek “Sayı”yı öğren.
Adım 4: Sayı=0 ise Adım 8’e git.
Adım 5: EklemeSayısı=EklemeSayısı+1
Adım 6: ToplananSayı=ToplananSayı+1
Adım 7: EklemeSayısı=Sayı ise devam et, değilse Adım 5’e git.
Adım 8: Sonuç: ToplananSayı
Aslında Yerinde ama Cevabını Kendimizin de Kolaylıkla Bulabileceği Dolayısıyla Gereksiz Sıfatı da Olabilecek Bir Soru: Adım 4’e niye ihtiyaç var abi?
Gereksiz Soruya Ani Cevap: Eğer eklenecek olan sayı sıfır olsaydı ve biz bu kontrolü yapmasaydık, program hiçbir zaman durmazdı ve haliyle yanlış bir iş yapmış olurduk.
“Parmak Hesabı” bir bölme işlemi:
Adım 1 : Bölüm=0 olarak belirle.
Adım 2: “BölünenSayı”yı öğren.
Adım 3: “BölenSayı”yı öğren.
Adım 4: BölünenSayı<BölenSayı ise Adım 8’e git.
Adım 5: BölünenSayı=BölünenSayı-BölenSayı
Adım 6: Bölüm=Bölüm+1
Adım 7: BölünenSayı>=BölenSayı ise Adım 5’e git değilse devam et.
Adım 8: Sonuç: Bölüm
Yine Yerinde Olabilecek Bir Soruyu Sormadan Yorum Yapma: Eğer Adım4’te bölünen sayının bölenden küçük olamayacağını denetlemese idik ve bu koşula uygun bir ikili verilmiş olsaydı, o zaman bir defaya mahsus negatiflere ulaşan bir bölünen sayı ile karşılaşacaktık ve bölüm değeri yanlış olacaktı.
Kutlama ve Daha Nice Yorumlar : Tebrik ederim. Biz bu örnekleri aslında geyik olsun diye yazmıyoruz. Bu örneklerden birkaç sonuç çıkarabiliriz. Mesela farkına varabiliriz ki, programlama esnasında karşımıza çıkacak olan “komutunu” bilmediğimiz veya program kütüphanesinde yer almayan işlemlerin “programını” yazmak işten bile değil. Örneğin yukarıdaki bölme işleminde ufak bir satırla, KALANI da tespit edebiliriz. (Nasıl? :P)