Yazılımcıların Gerçek Ekmek Teknesi

Yazılımcılar kodu müşteri için yazıyoruz derler ya, bu doğru değil! Kod her zaman bir merkezi işlem birimi (CPU – Central Processing Unit) namı diğer mikroişlemci için yazılır. Mikroişlemci olmadan kod çalışmaz. Bu yüzden ilk etapta programcı olarak ekmek teknemiz mikroişlemcidir. Sanal makinelerde (VM – Virtual Machine) çalışan kodlar için bu geçerli değil diyebilirsiniz, çünkü sanal makine bir mikroişlemci değildir. Doğru, lakin sanal makineler de kodu mikroişlemcilerin anlayacağı şekle dönüştürürler. Java dünyasında örneğin bunu yapan JVM JIT Hotspot derleyicisidir. Kod eninde sonunda mikroişlemcinin hafıza alanlarından (register) birisine düşer ve işlem görür.

Modern bir mikroişlemcinin nasıl çalıştığını bir büyüteç altında inceleseydik, ne olup, bittiğini anlayamazdık, çünkü birkaç santimetre karelik bir kutucuk içinde kalbi saniyede birkaç milyar kez atan birden fazla canavar yatmakta.

Ana işimiz CPU için kod yazmak, ama nasıl çalıştığından bihaberiz. Modern mikroişlemcileri çok yüksek bir perspektiften anlatan birkaç kitap sayfası karıştırıp, mikroişlemcilerin nasıl çalıştıklarını anladığımızı düşünüyoruz. Eğer mikroişlemcilerin gerçek anlamda nasıl çalıştıklarını anlasaydık, yazılımcı olarak en büyük problemimiz paralel program yazmada dünya şampiyonu olurduk. Paralel program yazmayı bile doğru, dürüst beceremeyen, becerdiğini zannedip saniyede milyar kalp atışını musluktan akan su damlası misali frenleyip, paralel program yazdığını düşünen bizlerin, bu canavarı nasıl ehlileştirebileceğimiz bile aklına gelmiyor. Ama biz hep böyle değildik. Sonradan böyle olduk. Bizi terbiye edip, bu hale getirdiler. Kullandıkları tek argüman da, programcının mutlaka yüksek dilleri kullanarak, daha soyut düşünmeye çalışmak zorunda olması gerektiğiymiş. Her yeni yüksek dil ile mikroişlemciden bir adım daha uzaklaştık ve etrafımız günümüzde bir derleyicinin bile ne yaptığını anlamayan programcılarla doldu. Bunun en güzel örneğini kendisine full stack J2EE/JEE developer ismi veren programcılar teşkil etmekte.

Programcı olarak bir mikroişlemcinin nasıl çalışması gerektiğini bilmek zorunda değilim diyebilirsiniz. Sonuç itibariyle bir arabayı kullanırken, motorun da nasıl çalıştığını bilmiyorum ve bilmek zorunda değilim, öyle değil mi? Lakin arada çok ince bir fark var. Arabayı kullandığım sürece nasıl çalıştığını bilmek zorunda değilim. Lakin araba için bir şeyler üretiyorsam, o zaman arabanın nasıl çalıştığını tam olarak bilmem gerekir. Aynı şey yazdığım kodlar için de geçerli. Programcı olarak mikroişlemci için kod yazıyorsam, mikroişlemcinin nasıl çalıştığını tam olarak bilmem gerekiyor. Yüksek dillerde yazılan kodun %99 u sorunsuz herhangi bir mikroişlemci üzerinde çalışırken, %1 lik bölümü çalışmadığında, programcıların %99 u afallayıp, kalırlar, çünkü mikroişlemci bünyesinde olup, bitenlerden bihaberdirler. Bu işin gerçek ustaları bu yüzden bu kadar azdırlar, çünkü bu %1 kesimin içindedirler.

Buradan tek bir sonuç çıkarabiliriz: Yazılımcıların donanıma ve özellikle kodlarının üzerinde çalıştığı mikroişlemcilere hükmetmeleri gerekiyor. İyi bir yazılımcı olmak için bu bir şart. Yüksek seviyede soyutlama yetisini bu detay bilgisi ile kombine ettiğimizde, her yönüyle işine hakim yazılımcılar haline gelebiliriz.

Günümüzde 64 bit genişliğinde ve birden fazla çekirdeğe sahip mikroişlemciler kullanılmakta. Bu donanım mühendislerinin çabalarıyla gelinen bir nokta. Onlar da 4 ve 8 bit genişliğindeki mikroişlemcilerle başladılar. Elli sene önce ortaya çıkan bu mikroişlemciler günümüzün modern mikroişlemcileri ile hala birçok ortak özelliğe sahipler. Prensipte bir mikroişlemcinin çalışma tarzı elli sene öncesine kıyasla fazla değişmedi.

64 bitlik bir mikroişlemciyi tüm özellikleri ile anlamak kolay olmayabilir. Lakin 8 bitlik bir mikroişlemcinin nasıl çalıştığını görerek, bilgi seviyemizi 64 bite doğru yükseltebiliriz.

8 bitlik bir mikroişlemcinin nasıl çalıştığını tam anlamıyla kavrayabilmek için 8 bitlik bir mikroişlemciyi kendi çabalarımla oluşturmamız faydalı olacaktır. Böyle bir mikroişlemciyi TTL bazlı mantık kapıları ihtiva eden entegre devrelerle yapabiliriz.

ttl

Mikrodevre.com bünyesinde 8 bitlik bir mikroişlemcinin bu entegre devreler yardımı ile nasıl oluşturulabileceğini önümüzdeki blog yazılarım ve videolog kayıtlarımla göstermek istiyorum.

8 bitlik bir mikroişlemci oluşturma fikri sadece dijital elektronikle sınırlı değil. Eğer öyle olsaydı, büyük bir ihtimalle bir yazılımcı olarak bu konuya bu kadar derin bir ilgi duymazdım. Bir mikroişlemcinin anlamlı bir işlem yapabilmesi için bu mikroişlemci için program yazmak gerekir. Böyle bir projeyi benim için ilginç kılan, donamımla yazılımın bu kesişme noktası. Bu aslında bize yolculuğumuzun entegre devreler yardımı ile bir mikroişlemci oluşturmakla son bulmadığının müjdesini vermekte. Yolculuğumuz mikroişlemcimiz için bir komut kümesi oluşturup, bu komut kümesi yardımı ile assembler seviyesinde programlar yazarak devam edecek. Bu amaçla kendi derleyicimizi oluşturacağız.

Belki oluşturduğumuz mikroişlemci ilkel bir hesap makinesinden ileri gidemeyecek. İşletim sistemi kurulumu gibi daha sofistike işlemler için 16 bitlik bir mikroişlemciye ihtiyaç duyacağız. Lakin 8 bitlik bir mikroişlemci oluşturma projesi bize analog elektronik, dijital elektronik, mikroişlemci mimarileri ve kod derleyicileri alanlarında ihtisas yapma fırsatı verecektir. Çalışmalarımızın tatmin edici neticeler vermesi ümidiyle.


EOF (End Of Fun)
Özcan Acar

7,096 toplam, 5 bugün içinde gösterim

8 Bit CPU kategorisindeki diğer yazılar:

Share Button
1 Yıldız2 Yıldız3 Yıldız4 Yıldız5 Yıldız (2 değerlendirme, ortalama: 4.5, toplam oy 5)
Loading ... Loading ...

Yazılımcıların Gerçek Ekmek Teknesi” üzerine 8 düşünce

  1. c dili el terminallerine kod yazdıgım günler aklıma geldi. El terminalinden bir biiip sesi çıkarabilmek için registerlara erişmek ve interupt’ları çağırmamız gerekiyordu. Ayrıca text dosya üzerinde bir sayıyı karakter alanda saklayabilmek için her bir 4 bit’e bir rakam yazmak gibi garip algoritmalar bile kullanırdık. O zamanlardaki bu uğraşlar. işlemicinin ,nasıl çalıştıgını anlamada çok yardımcı oldu 🙂 Şimdi ise register ne desem cevap veremeyecek mühendisler var 🙂

  2. Bir yazılımın başarımını farklı seviyelerde iyileştirebilir:
    i. Donanım Seviyesinde
    Merkezi İşlem Birimi (CPU), Bellek, G/Ç, Grafik İşlem Birimi (GPU)
    Cep bellek ıskalama oranını azaltmak, speculative branching
    ii. İşletim Sistemi Seviyesinde
    iii. Sanal Makina Seviyesinde
    Java örneğinde Java Sanal Makinası (JSM)
    JSM’deki Çöp Toplayıcının ve JIT Derleyicinin başarımının iyileştirilmesi
    iv. Dil Seviyesinde
    v. API Seviyesinde
    Java örneğinde Concurrency API, Collection API gibi

    Yazılımcının (iv)’ü ve (v)’i çok iyi bilmelidir.
    Eğer derleyici ve JIT Derleyici gerçekliyor ise (i)’i çok iyi biliyor olması beklenmelidir. Derleyici ve diller ile ilgileniyorsanız LLVM Projesine (http://llvm.org/) bakabilirsiniz.
    Eğer işletim sistemi çekirdeği ya da cihaz sürücüsü yazıyor ise (ii)’yi (i)’i çok iyi biliyor olması beklenmelidir.
    Java uygulamalarını çalıştırmaktan sorumlu bir kişinin (örneğin Weblogic Yöneticisinin) JSM’yi çok iyi biliyor olması beklenmelidir.
    Bir yazılımcının yapabilecekleri (v)’den (i)’e doğru azalır. Örneğin bir Java geliştiricisinin (i)’de yapabileceği neredeyse hiçbir şey yoktur.

Yoruma kapalı.