Temel C Programlama -5- Makine Dili, Assembly Dili ve Yüksek Seviye Diller

Programlama dilleri arasında C dili özel ve önemli bir yere sahiptir. Bunu anlamak için öncelikle dil seviyelerini bilmek gereklidir. Dilleri makine dili, assembly dili ve yüksek seviye diller olarak ayırabiliriz. Makine dili tamamen sayısal biçimde kodları işler ve herhangi bir insan diline benzerliği yoktur. Örneğin 0x2525, 0x5542 gibi komutların yan yana sıralanmasıyla makine programı meydana gelir. Burada 0x onaltılık değer önekidir. Bu değerler onaltılık sayı olarak da ikilik sayı olarak da hatta onluk sayı olarak da temsil edilebilir. Fakat işin temelinde 1 ve 0’lardan oluşan ikilik sayılar vardır.

Makine Dili

Makine dilinde program yazmak çoğu programcıya göre imkansız görünse de biz gömülü sistem geliştiricileri için imkansız değildir. Fakat etkili bir çözüm de değildir. Biz makine dilini mikroişlemcinin komut seti kılavuzundaki opcode açıklamalarından öğrenebiliriz. Aynı zamanda Assembly dilinde yazdığımız programı makine koduyla karşılaştırabileceğimiz yazılımlar mevcuttur. Bütün bunlara rağmen alt seviye programlamada çalışmak oldukça zordur ve yüksek seviye donanım bilgisi gerektirmektedir. İlk zamanlarda bilgisayar programları makine dili ile yazılmaktaydı.

:10010000214601360121470136007EFE09D2190140 
:100110002146017E17C20001FF5F16002148011928 
:10012000194E79234623965778239EDA3F01B2CAA7 
:100130003F0156702B5E712B722B732146013421C7

Yukarıda makine dilini görmekteyiz. Yüksek seviye programcılar için anlamsız harf ve sayı topluluğu gibi görünse de işinde ilerlemiş bir alt seviye programcı için anlaşılmaz değildir.

Assembly Dili

Assembly makine dilinin alfanümerik olarak temsil edilmesine denir. O yüzden tek başına bir dil değildir. Ne kadar makine ve donanım varsa o kadar fazla Assembly dili bulunmaktadır. O yüzden PIC Assembly, AVR Assembly, 6502 Assembly diyerek farklı farklı Assembly dillerinden bahsederiz. Tek bir Assembly dili öğrenip bütün makineleri Assembly’de programlamak imkansızdır. Şu vardır ki makinelerin mimarisi prensipte birbirine benzemektedir. Bunu daha önce mikroişlemci mimarisini anlattığımız makalelerde ayrıntısıyla sizlere açıkladık. Assembly dili makine dilinin harf ve rakamlarla temsil edilmesi olmasına karşın bu seçilen harfler insan dilinde anlamlı kelimeler veya onların kısaltmaları olmaktadır. Örneğin makine dilinde toplama işleminin komutu 0x25 ise bu Assembly dilinde İngilizce ekle anlamına gelen ADD komutu olur. Böyle böyle makine dilindeki komutlar İngilizce anlamlarına göre harf olarak temsil edilmektedir. Aynı zamanda girilen sayısal değerler ve yazmaçlar yine insanın anlayacağı şekilde düzenlenmektedir. Örneğin 0x0002 adresindeki yazmaç R2 yani Register 2 olarak adlandırılmaktadır. Opcode içerisinde dağılmış ve sıkışmış sayı değerlerini anlamak için çoğu zaman 1 ve 0 ları saymak lazımdır. Assembly dilinde ise 0x55 diye bu sayı değerini yazma imkanımız olur. Yine de donanım bilmeyen yüksek seviye programcı için Assembly dili oldukça anlaşılmaz olmaktadır. Alt seviye programcılar için de zor olsa da alıştıktan sonra fazla sıkıntı olmamaktadır. Şimdi bir Assembly örneği verelim ve bunu inceleyelim.

            ADD     R16, R17      
            DEC     R17            
            MOV     R18, R16       
END:        JMP     END

Burada komutların ve operandların satır satır yazıldığını görüyoruz. Bu BASIC dili ile benzerlik göstermektedir. Örneğin toplama işlemi yapacaksak ADD komutunu kullanmalıyız. Fakat toplama yani ADD komutu neyi toplamalıdır?, sorusunun cevabını operandları yani işlem yapılacak parçaları yazarak veririz. ADD R16, R17 komutunun anlamı R17 yazmacındaki değeri R16 yazmacına EKLE anlamı taşımaktadır. Burada insan dilinden farklı olarak soldan sağa değil sağdan sola bir okuma vardır. İngiliz dil mantığında bile R16’yı R17’ye eklemesi gerekirken burada bu böyle gerçekleşmemektedir. Önceki yazıda bahsettiğimiz gibi programlama dillerinin İngilizce’ye benzerliği burada R16(R Register’in kısaltması), ADD (Ekle) gibi çeviriden ibaretttir. Üzerinde çalışdığımız dil ise AVR Assembly dilidir. Başka bir donanım üzerinde yazılmış Assembly diline baksaydık benzer kelimeleri görsek bile bambaşka komutlarla karşı karşıya kalacaktık. DEC (Decrement) yani azalt anlamına gelmektedir. DEC R17 komutunun işleyişini buradan tahmin edebiliriz. R17 yazmacındaki değeri BİR AZALT anlamı taşımaktadır. Burada yine sağdan sola okunduğuna dikkat edin. MOV ise İngilizce çoğumuzun bildiği “Move” yani taşı anlamına gelmektedir. Burada da “Move” kelimesinin anlamında bir işi gerçekleştirmektedir. MOV R18, R16 komutunun anlamı R16 yazmacındaki değeri R18 yazmacına TAŞI anlamına gelir. JMP ise “Jump” yani ATLA komutudur. Program akışını belirlenen etikete götürmek için kullanılır.

Şimdi Assembly diline baktığımızda aslında çok zor olmadığını görmekteyiz. Zor olan bir diğer nokta makine dilinin işleyişinde yatmaktadır. Makine bizim yazdığımız matematik, mantık ve fonksiyonları bizim gibi işlememektedir. Yani toplama işlemi yapmak istediğimizde A + B = Sonuç yazma imkanımız yoktur veya mantık işlemi yapmak istediğimizde boolean operatörlerini kullanamayız. Bu durumda bizim matematik, mantık ve dile dair bilgilerimiz burada işimize pek yaramamaktadır. Yüksek seviye dillerin insan diline yakınlığı sadece İngilizce tabirlerden ve söz diziminden ibaret değildir. Görüldüğü gibi toplama işlemi için ADD A, B yazmak bile A + B yazmaktan bize daha yabancı gelmektedir.

Yüksek Seviye Diller

Yüksek seviye diller Assembly dilinden başka donanım soyutlamasını artırmış hemen her dil için kullanılmaktadır. Burada bütün dillere yüksek seviye dil demek aslında pek doğru olmamaktadır. Orta seviye, yüksek seviye ve çok yüksek seviye programlama dillerinden bahsedebiliriz. Burası tartışılan bir konu olsa da bu seviye adlandırma konusunda değişik kaynaklar değişik bilgiler vermektedir. Örneğin Python, Visual Basic, Perl, Ruby gibi diller çok yüksek seviye programlama dilleri arasındadır. Bu dillerde programlama yapmak için bilgisayarın inceliklerinden değil uygulamanın inceliklerinden haberdar olmak yeterlidir. Daha önce “buton altı programcılık” için kullanılan Visual Basic’den bahsettiğim gibi düğmenin altına bir kaç fonksiyon yazmanız program yazmak için yeterli oluyordu. Bu fonksiyonları ise o yazılımı öğrenmekle öğrenebiliyordunuz. Hatta ezberlediğiniz komutları ve fonksiyonları anlamadan da olsa kullanmanız mümkündü. Çünkü çok yüksek seviye diller az bilgi çok iş gücü esasına göre çalışmaktadır. Bazen bizim alt seviyede 1 saatte yaptığımız aynı işi yapan kodu yüksek seviyede 1 dakikada yazmak mümkündür. Gömülü sistemlerde Arduino’dan ileri PARSIC, Mblok gibi sadece kutucukları lego gibi birleştirip program yazdığımız ortamlar vardır. Bunların çok yüksek seviye programlama sunması donanımın özelliklerini tam anlamıyla kullanamama gibi bir dezavantaj doğurmaktadır. Yazılımın bize verdiği 10-20 fonksiyonla avunup kendi fonksiyonlarımızı, kütüphanelerimizi yazamama gibi bir durumda kalmamak için işin derinini öğrenmek şarttır. Genelde çok yüksek seviye diller kendilerine ait programlama arayüzleri ile beraber gelmektedir. Python gibi diller ise bu konuda oldukça iyi bir konuma gelmiştir çünkü genel maksatlı ve her alanda kullanıma uygun bir noktadadır. Hatta programlamayı öğrenmek için Python ile başlamak iyi bir seçenek olabilir. Belki biz de ileride bu dili inceleriz.

Yüksek seviye diller arasında ise günümüzde C#, Java, C++ gibi diller bulunmaktadır. C dilini içerdiği alt seviye özelliklerden ve gömülü sistemlerde kullanılmasından dolayı orta seviye olarak da nitelendirmek mümkündür. Bazı kaynaklarda C dili orta seviye bir dil olarak nitelendirilmektedir. Çünkü C dili C# veya Java gibi yüksek seviye dillerden oldukça farklı bir yapıya sahiptir ve C dilinden bir aşağısı Assembly dili olmaktadır. C dili Assembly dili ile aramızda olan bir köprü olduğu için bunu orta seviye dil olarak değerlendirmek C dilinin programlama dilleri arasındaki seçkin konumuna vurgu yapmak demektir. Ama literatüre baktığımızda low-level, Assembly ve high-level olmak üzere üç ayrı terim mevcuttur. Yani Visual Basic ile C dili aynı kefeye konup yüksek seviye dil olarak tanımlanmaktadır.

Last updated