Bilgisayar Programlamaya Giriş

Bilgisayar programlama temelde Assembly diline dayanır. Bu dil doğrudan makine diline (sayılar) çevrilir ve bilgisayar işlemcisi bu makine diline karşılık gelen sayıları kullanarak işlemler yapar. Tüm elektronik cihazlar ikilik sayı sistemi ile çalışırlar ve bu sayılar üzerinde mantıksal işlemler gerçekleştirirler. Verileri sabit diske, usb belleğe veya hafıza kartlarına da bu şekilde kaydederler.

Günlük hayatta 10 tabanında sayılarla işlem yapıyoruz. Bunun nedeni bir rivayete göre ellerimizde toplam 10 parmağımızın olması. Bir sayı tabanındaki rakamlar tabandan büyük olamaz bu nedenle 0 ile 9 arasındaki rakamlar kullanarak işlemler yapıyoruz.
10 tabanında kullanılabilen rakamlar: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

8 tabanında kullanılabilen rakamlar: 0, 1, 2, 3, 4, 5, 6, 7

16 tabanında kullanılabilen rakamlar: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

2 tabanına kullanılabilen rakamlar ise: 0, 1

16 tabanı aynı zamanda Hexadecimal (HEX), 2 tabanı ise Binary (BIN) olarak adlandırılır.

Elektronik cihazların 2 tabanında sayılarla çalıştığını söylemiştik. Cihazlar bu sayıları voltajdaki değişmelere göre algılarlar. 0 Volt = 0 ve 5 Volt = 1 değerlerine karşılık gelir. Bazı cihazlarda 3,3 Volta kadar değerler 1 olarak kabul edilir. Bir kablodan, USB cihazın veya herhangi bir donanımın pinlerinden veri okunurken bu pinlerdeki voltaj değerleri ölçülür ve 5 volt (bazen 3,3 volt) eşiğinde ise değer 1, bu eşiğin altındaysa değer 0 kabul edilir.

Mantık işlemlerini biliyorsanız önermeler için 2 durum vardır DOĞRU veya YANLIŞ. Hatta Mantık işlemlerinde de kolaylık açısından DOĞRU için 1 ve YANLIŞ için 0 değerleri verilerek işlem yapılır. Bilgisayarınızın mantıksal işlemcisi de bu şekilde çalışır.

Programlama dillerinde de VE, VEYA, YADA mantıksal işlemleri oldukça sık kullanılır.

Mantıksal işlemler;

0 VE 0 = 0
1 VE 0 = 0
0 VE 1 = 0
1 VE 1 = 1
0 VEYA 0 = 0
1 VEYA 0 = 1
0 VEYA 1 = 1
1 VEYA 1 = 1
0 YADA 0 = 0
1 YADA 0 = 1
0 YADA 1 = 1
1 YADA 1 = 0

VE işleminde sadece iki değişkenin de DOĞRU olması durumunda sonuç DOĞRU, aksi durumlarda ise sonuç YANLIŞ olur.

VEYA işleminde değişkenlerden biri veya ikisi de doğru olunca sonuç DOĞRU, sadece iki değişkenin de YANLIŞ olması durumunda sonuç YANLIŞ olur.

YADA işleminde ise değişkenlerden biri doğru iken diğeri yanlış olursa sonuç DOĞRU diğer durumlarda ise sonuç YANLIŞ olur.

Elektronik devrelerde sensörlerden dijital (sayısal) veri okunurken okunan değer "0" (0V) veya "1" (5V) yani "DOĞRU" veya "YANLIŞ" olur. Örneğin ışık sensöründen veri okunurken ortamda ışık varsa 1 değeri, karanlıksa 0 değeri okunur. Okunan bu değere göre mantıksal bir sınama yapıp ortam karanlık ise bir lambayı yakabilirsiniz. Bunun için entegrenin lambaya bağlı pinine 1 (5V) değeri yazmanız yeterlidir.

Bu işlemlerin tümü bit düzeyinde işlemlerdir. Yani işlemcinin veya entegrenin sadece 1 pini üzerindeki veri ile yapılan işlemlerdir. Genellikle işlemler byte (bayt) düzeyinde yapılır ve 8 bit 1 baytı oluşturur. İşlemcilerin tek seferde kaç bit üzerinde işlem yapabildiği işlemci mimarisi olarak belirtilir örneğin; 8 bit, 16 bit, 32 bit veya 64 bit.

8 bit işlemciler tek seferde 1 bayt veriyi işleyebiliyorken 32 bitlik bir işlemci tek seferde 32/8 = 4 baytlık veriyi işleyebilir.

Bilgisayar işlemcisi üzerinde verileri geçici olarak saklayan bazı bölgeler vardır ve bunlara register denir. Bu registerlar 16 bit işlemci mimarisine göre AX, BX, CX, DX ... şeklindedir. Bu registerlerden her biri 16 bit uzunluğundadır (2 bayt). 32 bit işlemcilerde ise EAX, EBX, ECX.. olarak adlandırılırlar. İsteğe bağlı olarak 32 bit bir işlemcide sadece 16 bit ile çalışmak için EAX registeri AX şeklinde kullanılabilir. Hatta ilk ve son 8 biti ayrı ayrı kullanmak için AX registeri AL, AH, BX registeri BL, BH ve CX registeri CL, CH şeklinde kullanılabilir. L = LOW, H = HIGH anlamlarına gelir ve AL ilk (düşük değerli) 8 bit, AH ise diğer yüksek değerli 8 biti ifade eder.

AL (8 bit) + AH (8 bit) = AX (16 bit)
EAX (32 bit)

İşlemcinin bellek bölgeleri
Makine dili doğrudan işlemci üzerinde çalışır ve verileri ayrı bellek bölgelerine yazıp üzerinde mantıksal veya matematiksel işlemler yaparak işlem sonucuna göre farklı bir işlem yapabilir veya bunları BIOS kesmelerini kullanarak bilgisayarın diğer donanımlarına örneğin; RAM veya HDD gönderebilirsiniz.

Assembly dilinde bu bellek bölgelerine veriler MOV komutu ile yazılır ve şu şekilde kullanılır; örneğin EAX registerına 2016, EBX registerına 4 değerini yazalım ve bu sayıları toplayalım.

MOV EAX, 2016
MOV EBX, 4
ADD EAX, EBX

bu komut dizesinden sonra işlemcideki EAX değeri 2020 olur.

ADD komutu toplama işlemi yapar. Üstteki kodda EBX registerındaki değer EAX değişkenine eklenmişti. ADD EAX, 4 şeklinde EBX registerını kullanmadan da aynı işlemi yapabiliriz.

Assembly komutlarında değişkenler register (EAX, AH, CX vb.), sabit değer (3, 292, 22) veya bir bellek bölgesini işaret eden pointer olabilir ([EAX], [BX] gibi).

Assembly komutları işlemciye göre değişiklik gösterebilir ve her işlemci her komutu desteklemeyebilir. Bu nedenle Assembly dili ile yazılan programlar taşınabilir değildir ve yazıldığı donanıma bağlı kalmak zorundadır.

Bu kısıtlılığı aşmak için C, BASIC veya PASCAL gibi insan diline daha yakın ve işlemciden bağımsız olarak derlenebilen programlama dilleri geliştirilmiştir. Bu dillerle yazılan programlar insanlar tarafından daha kolay okunabilir ve farklı işlemciler için derlenebildiğinden taşınabilirdir.

Bir programı derlemek, yazdığımız kodları makine diline çevirmek anlamına gelir.

Programlama işleminin hızlandırılması ve kolaylaştırılması, daha fazla platform desteği için zamanla C++, Java, C#, Delphi, Visual Basic gibi  insan diline çok daha yakın üst seviye programlama dilleri geliştirilmiştir. Günümüzde ise makine diline yakın olan düşük seviyeli diller yerine bu yüksek seviyeli diller daha çok tercih edilmektedir. Bunun başlıca nedenleri; daha kolay yazılıp okunabilmesi, hatalar üzerinde daha fazla kontrol ve daha az kod yazarak daha fazla işlem yapabilme özellikleri olarak sıralanabilir.

Bilgisayar programcıları genellikle birden fazla programlama dilini bilir ve ihtiyaca göre en uygun programlama dilini seçerek bu dille kod yazarlar. Örneğin bir elektronik cihaz için sürücü yazılımı yazıyorsanız makine diline en yakın dilleri (Assembly, C vb.) seçmelisiniz. Bilgisayarda kullanıcı arayüzü ağırlıklı bir uygulama geliştiriyorsanız C# veya Java gibi programlama dillerini seçmeniz daha mantıklı olur. Hız ve performansın önemli olduğu oyun veya benzer uygulamalar yazacaksanız orta seviyeli bir dil olan C++ dilini tercih edebilirsiniz.

İster düşük seviyeli olsun, ister yüksek seviyeli olsun hangi dille yazdığınızdan bağımsız olarak yazdığınız kodlar en sonunda Assembly komutlarına dönüştürülür ve çalıştırılır. Programlama dilleri birbirlerinden çok farklı değillerdir ve çoğu aynı işlemleri farklı şekillerde yapabilir. Bir dilin avantajları ve dezavantajları daha çok çalıştığınız proje ile ilgilidir. Donanım ile ilgili işlemler yapacaksanız makine diline yaklaşırken, web programlama veya diğer uygulama yazılımları ile ilgileniyorsanız insan diline en yakın üst seviyeli programlama dillerini tercih edersiniz.

C# ve Java programlama dilleri C veya C++ ile yazdığınız uygulamalar gibi direkt işletim sistemine bağlı olarak çalışmazlar. Bunlar belirli bir formatta kaydedilip çalıştırıldığı anda C# için JIT (Just In Time Compiler) devreye girer ve kodlanmış işlemleri yapar. Java için de benzer bir durum vardır. C veya C++ ile derlenmiş uygulamalar ise herhangi harici bir uygulamaya gerek duymaksızın sadece işletim sistemine bağımlı olarak çalışırlar. Bu nedenle C ve C++ uygulamaları, C# veya Java uygulamalarından çok daha hızlı çalışır. Bu hız farkı oyun vb. uygulamalarda fark edilebilirken diğer küçük çaplı uygulamalarda pek fark edilmez.

Bu blogdaki popüler yayınlar

Almanca - Nomen-Verb-Verbindungen

CSS ile Yüksekliği 100% Olarak Ayarlamak