Önsöz: Aslında bu yazıyı yazalı bir ayı geçti ama bu aralar başımdaki aşırı, aşırı ötesi yoğunluktan dolayı bir kaç görsel oluşturupda bir türlü yayınlayamadım. Raflarda iyice toz kapmaması için görselsiz halini yayınlıyorum. En kısa sürede görselleri ekleyeceğim. | Yoğunluğun ana kaynağı bir süre önce değindiğim açık kaynak proje. Birinci fazın %80 i bitti sayılır. Sonrasında kodları açacağım. Bu vesile; bir süre daha buralarda olamayacağımı belirmek isterim. | Bu projeyi tamamen bitirdikten sonra yarı emeklilik moduna geçmeyi planlıyorum. O zaman sosyal okuyucu için bol bol içerik üreteceğim. Yani umarım.

Merhaba değerli okuyucu. Bu yazının -temel seviyede yazılım ve lojik bilen- herkese hitap eden bir teknik yazı olmasını amaçlıyorum. Bu vesile şimdiden “yok yae gerçekte tam olarak öyle çalışmıyo…” diyecek arkadaşları şuraya alalım.

Çok sevgili Saldıray abinin de dediği gibi: geçen arkadaşın birinnen konuşuyoz. Öncesinde “Bilgisayarlar aslında aynı anda sadece bir işi yapar abi. Ama çok hızlı olduğu için biz aynı anda bir sürü işi yapıyormuş gibi görürüz.” klişesi ile başlayan muhabbet; 1 lere, 0 lara kadar geldi. Ben her ne kadar bu sıfır bir muhabbetini Adana mutabakatı ‘na bağlamaya çalışıp dikkati dağıtmaya çalışsam da çok muvaffak olamadım.

Ana soru şuydu; şimdi, tamam bilgisayarlar 1 ve 0 dan anlar. 1 elektrik var; 0 yok demektir. Kabul. Ama nasıl yani? Nasıl yorumluyor alet bunu. Tam olarak bilgisayarın 1 ve 0 dan anlaması nedir? Koyuldum yazmaya çizmeye.

Dedim, bak! Önce en üstten başlayalım. Yüksek seviyeli bir dilde yazılmış koddan. Mesela aşağıdaki gibi olsun.

int a = 1;
a++;
a += 3;

Sonra bunu asssembly denilen düşük seviyeli koda dönüştürelim. Hatta bu asm kodlarını da biz uyduralım nasılsa biz tasarlıyoruz sistemi. 4 tane kodumuz olsun. Bir standart olması için hepsini de 3 harfli yapalım

  • HFZ: Çeşitli işlemler için bir hafızamız olsun (akü). Bu hafızaya yazma kodu.
  • KPY: Hafızadaki veriyi ram ‘e kopyalama kodu.
  • ART: Ram ‘deki veriyi bir artırma kodu
  • EKL: Ram ‘deki veriyi hafizadaki sayi kadar artırma kodu

Hemen akla gelmesi muhtemel bir soruyu cevaplayıp öyle geçelim. Ram ve Hafıza aynı anda neden var. Farkları ne. Ram yeterli değil mi? Aslında ramler disklere göre çok hızlıdır. Ama işlemci içinde bir işlem yapıyorsanız gerekli olan datanın ram ‘den okunup gelmesi bile yavaş kalır. Bu ve bir kaç sebeple işlemciler üzerinde yazmaç (register) denilen çok küçük ram ‘ler vardır. Ram ‘i büyük depo, yazmaç ‘ı da -hızlı- küçük depo olarak kullanır.

Yüksek seviyeli kodumuzu yukarıdaki asm kodlarını kullanarak tekrar yazalım. Burada şu notu düşelim. Değişkenler ram üzerinde saklanır. Tam olarak hangi adreste saklanacağı da işletim sistemi seviyesinde bir karardır. Biz “a” değişkenimizi 2 numaralı adreste saklayacağımızı kabul edelim.

HFZ 1    #hafizada 1 değerini tut
KPY 2    #hafizadaki değeri ram in 2 numarali adresine kopyala
ART 2    #2 numarali adresteki veriyi 1 artir
HFZ 3    #hafizada 3 değerini tut   
EKL 2    #2 numarali adresteki veriyi hafizadaki değer kadar artir

Evet yavaş yavaş derinleşiyoruz. Sonra bunu tamamen 1 ve sıfırlara çevirmek istiyorum. Bunun sebebini yazının sonunda anlayacağız.

Şimdi şöyle düşünüyorum. Her satır aslında 2 parçadan oluşuyor. 1. parça komut ikinci parça değer. Değerlerime bakıyorum: 1, 2 ve 3. Bunların tamamını 2 bit ile ifade edebilirim(1 -> 01, 2-> 10, 3 -> 11). Satırların ikinci kısmı için iki bit kullanacağım.

Sonra ilk kısma bakıyorum. İlk kısımda da 4 tane komutum var. Bunları da iki bit ile ifade edebilirim(HFZ -> 00, KPY -> 01, ART -> 10, EKL -> 11). Böylelikle her satırı toplamda 4 bit ile yazabiliyorum.

00 01
01 10
10 10
00 11
11 10

Kimse anlamasın daha esrarengiz dursun isterseniz bunları da yanyana yazabilirsiniz “000101101010…” 🙂 Ama biz bu haliyle işleyeceğiz. Derleyici dediğimiz mekanizma da aslında hemen hemen bunu yapar. Yüksek seviyeli dilde yazılmış olan kodu alır, sizin işletim sisteminizin anlayacağı seviyede 1 ve 0 lara çevirir.

Bu yazı da bu kadardı. Okuduğunuz için teşekkür ederim.

Tamam kandıramadım 🙂 Esas sorumuz aslında başkaydı. Ona dönersek; tamam, kodumuzu 1 ve 0 yaptık ama bilgisayar bunu nasıl anlıyor? Burada yine bir parantez açalım. Sonra hepsini birleştireceğiz.

İlk olarak komutlarımız için birer lojik devre tasarlayalım. HFZ komutu sadece “hafıza” dediğimiz şeye bağlı. Kendisine gelen datayı ona yazıyor. KPY dediğimiz komut da ram ve hafızaya bağlı. Hafızadan alıp ram ‘e kopyalıyor. ART sadece ram ‘e bağlı, ramdeki değeri bir artırıyor. EKL ‘de hem ram ‘e hem hafızaya bağlı. Hafızadan alıp ram ‘dekinin üzerine ekliyor.

Bunların hepsinin birer tane izin pini olsun. İzin pininden 1 gelirse işlem yapsın değilse yapmasın.

Bir de son olarak 2*4 decoder diye birşey var. 2 girişi ve 4 çıkışı olan bir lojik devre bu. Bu devreye girişinden 2 bitlik bir data gönderiyoruz, o da çıkışından bizim datamızı açarak yazıyor. Yani şöyle;
-girişten 00 verirsem; çıkışları 0001
-girişten 01 verirsem; çıkışları 0010
-girişten 10 verirsem; çıkışları 0100
-girişten 11 verirsem; çıkışları 1000
oluyor.

Bu da tamam, haydi toplayalım. Şimdi program sayacı diye bir mekanizma var. Bu mekanizma bizim demin 1 ve sıfırlara çevirdiğimiz kodları satır satır işlemciye gönderir. Gelen komutumuzu yine iki parçaya bölelim. İlk baştaki 2 bit direk decoderimize girsin. Decoderimizin çıkışlarını da tasarladığımız lojik devrelerin (HFZ, KPY, ART ve EKL) izin bacaklarına bağlayalım.

Asm kodlarını 2 bitlik koda çeviriken; HFZ için 0, KPY için 1, ART için 2 ve EKL için 3 demiştik. Decoder çıkışlarını da bu sıra ile bağlayalım. Böylelikle şunu yaptık. Program sayacı sıra ile bize kodları gönderecek biz de decoder aracılığıyla ilgili satırda hangi lojik devre çalışmalı ise sadece ona izin vereceğiz. Bunu piyano tuşları gibi düşünebilirsiniz. Piyano içinde tüm notalar var ama piyanist o an hangi tuş doğru ise sadece ona basıyor. Bizim piyanistimiz de decoder. Sadece ilgiliyi çalıştırıyor.

Sonra satırımızın ikinci parçası olan -2 bitlik- veri kısmı da tüm lojik devrelere paralel olarak bağlıyoruz. Bu şekilde yapmamızın mahsuru yok çünkü decoder her satırda sadece bir devreyi çalıştıracak.

Böylece program sayacı her satır kodu adım adım bu devreye gönderdikçe sadece ilgili lojik devre çalışıp tam olarak istediğimizi yapıyor. İşte bilgisayar bir ve sıfırlardan bu şekilde anlar.

Bu konuştuğumuz şeyin adı “Aritmetik Mantık Birimi” orjinal adıyla “Arithmetic Logic Unit”. Daha da derinleşmek isteyen arkadaşlar internette bolca kaynak bulabilir. Bizim yazımız bu kadar. Umarım yazının başındaki sorulara cevap verebilmişimdir. Tekrar görüşene kadar, olaylara garışmayın. Sağlıcakla…