Bilgisayar programlama dilleri, genel bir sınıflandırma

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,547
Aslında en başta şunu açıkça ortaya koymak lazım: Bilgisayarların içinde bulunan işlemcinin (CPU) anladığı tek programlama dili, makina dilidir. İşlemci, bilgisayar hafızasında bulunan makina dili komutunu okur, gereğini yapar, sonraki komutu okur, onun gereğini yapar ve bu süreç, bilgisayar açık olduğu sürece devam eder. Ama biz insanlar, bilgisayar programı yazarken makina dili ile yazmayız, çünkü makina dili ile program yazmak SON DERECE ZORDUR ve çok basit bir programı yazmak için sarfedilmesi gereken süre, kabul edilemeyecek kadar uzundur.

Hayali bir "RoadRunner" işlemcisi için hayali bir makina kodu programına bakalım. Burada, en soldaki sütun, bilgisayar hafızasındaki adresi göstermektedir (heksadesimal olarak), soltaki sütün ise, o adreste bulunan veriyi göstermektedir (gene hex olarak):

Kod:
Adres   Data

7F8C:   3A
7F8D:   47
7F8E:   1F
7F8F:   00
7F90:   0C
7F91:   00
7F92:   12
7F93:   F3
7F94:   AB
7F95:   6C

Burada sağ sütundaki her sayı, ya bir komut, yada bir komut ile ilgili parametre olabilir. Komutlara ve olası parametrelerine karşılık gelen sayılar da, ilgili işlemcinin dokümanlarında anlatılmaktadır.

Her işlemci ailesinin komut yapısı, komutlara karşılık gelen rakamlar diğerinden tamamen farklıdır. Örneğin ARM için hazırlanmış bir makina dili programı, MIPS işlemcisinde doğru çalışmaz, çünkü örneğin 3A komutunun ARM'daki anlamı, MIPS'teki anlamı ile hiçbir alakası yoktur. Yani makina dilinde program yazma işine girsek, çalışacağımız her işlemci ailesi için tamamen farklı komut setleriyle çalışmamız gerekecek. Bir işlemcinin sağladığı komut, başka işlemcide olmayabilir, bu durumda alternatif bir programcık kullanmamız gerekecek veya o işi belki de hiç yapamayacağız.
 
  • Beğen
Reactions: nt
Peki bu makina dili ile biz "normal" programcılar muhatap olmayacaksak, kim muhatap olacak? O işlemcinin makina dili referans dokümanları kimin için yazılıyor?

Makina dili ile program yazmak neredeyse imkansız denecek kadar zor olduğu için, bu işi kolaylaştırmak adına "daha yüksek seviyeli programlama dilleri" kullanılır. Bu daha yüksek seviyeli programlama dillerinde yazılan programlar, özel "derleyici" (assembler, compiler) denen yazılımlar ile makina diline çevrilir. İşte makina dili referans dokümanları, bu derleyici programları yazan kişilere hitap ediyor.

Şimdi daha yüksek seviyeli programları kategorilere ayırıp sınıflandırabiliriz.
 
Son düzenleme:
Makina dilinin bir üst seviyesi olan programlama diline "Assembly" denir. Assembly dili, halen belirli bir işlemci ailesine özgüdür. Örneğin ARM assembly dilinde yazılmış bir program, x86 işlemcide doğru çalışmaz, çünkü komutlar tamamen birbirinden alakasızdır. "Assembly" dilinin makina diline göre sağladığı şu avantajlar var:

=== Komutlar, hex sayılar yerine, akılda kalması daha kolay olan sembollerle girilir. Örnek:

Kod:
3A yerine XOR


=== Bir komut için kullanılacak parametreler de gene sembollerle ifade edilir, derleyici gerekli makina dili dönüşümü yapar. Örnek:

Kod:
İşlemcinin R3 registeri ile R7 registerini toplamak, sonucun da R6'ya yazılmasını istiyorsak:

ADD R3, R7, R6


=== Programın farklı bir adrese atlayıp oradan devam etmesini istiyorsak, hedef adresi sayısal olarak yazmak zorunda değiliz. Oraya bir "etiket" koyarak, hedef adresini derleyicinin otomatik olarak hesaplamasını sağlayabilirz. Örneğin makina dilinde yazılmış aşağıdaki program parçasını düşünelim:

Kod:
; Makina dilinde "12 FE adresine git" anlamına gelen komut dizisi
1100:    58
1101:    12
1102:    FE
*
*
*
12FE:   6A
12FF:   37
*
*
*


Şimdi diyelim programı 1102'den itibaren kodlamaya devam ettik, program büyüdü ve artık yer yok. Mecbur 12FE deki program parçasını ileri alıp yer açmamız lazım. İşte bu noktada, bu program parçasına atlayan bütün komutları güncellememiz gerekecek! Ama assembly'de şunu yapabiliyoruz:

Kod:
; Assembly dilinde "Etiketlenen yerden devam et" anlamına gelen komut dizisi
JMP   PROG_EXIT
*
*
PROG_EXIT:
LD      R3, 0
RET


İşte şimdi burada JMP'den sonra istediğimiz kadar kod ekleyebiliriz, hiç sorun değil. PROG_EXIT'in adres değerini bilmek zorunda değiliz, derleyici onu takip ediyor ve nihai programa da doğru değeri yerleştiriyor. Bu çok, ama çok büyük bir avantaj!

=== Programa açıklamalar yazabiliriz. Programı ayrı ayrı kaynak dosyalarına bölüp, sonra da istediğimiz şekilde ve sırada birleştirebiliriz.

Bunun dışında birçok avantaj daha vardır, ama en önemlileri bunlar diyelim ve burada bırakalım. Peki bir programcı olarak assembly ile sık sık uğraşmamız gerekir mi? Assembly programlama dili, makina diline göre çok büyük bir kolaylık sağlamasına rağmen, program yazabilmek için gene de son derece zor bir programlama dilidir.

Ama neyseki, çoğu zaman assembly ile uğraşmamız gerekmez. Bir işlemciden, verebileceği performansı, son kırıntısına kadar almamız gerekiyorsa, o zaman assembly kullanmamız gerekir. Veya bir işlemcinin reset sonrası en temel yapılandırma işlemlerini yerine getirmek için de assembly kullanırız.
 
Son düzenleme:
  • Beğen
Reactions: nt
Programlama dillerinde bir sonraki seviye, sistem programlama dili olan C diyebiliriz. Birçok başka adı duyulmamış değişik sistem programlama dilleri olsa da, en yaygın olan ve neredeyse her alanda kullanılan, C dilidir. Ama özellikle kritik görev yazılımlarda yaygın kullanılan ADA dilini de belirtmekte fayda var. Kritik yazılım ne demek? Bir bug olduğunda birileri ölecekse, veya çok geniş çaplı maddi hasar meydana gelecekse, bu tip uygulamalarda kullanılan yazılımlara kritik görev yazılımın (mission critical software) deniyor.

C dili, assembly diline göre çok büyük kolaylıklar sağlamaktadır. İşlemcinin bit genişliği, işlemci register'ları, hafızanın erişim yapısı, alt rutinlerde registerleri muhafaza edilmesi gibi son derece külfetli, detaylı ve hata yapma olasılığı yüksek olan işleri C derleyicisi bizim için otomatik olarak yapar. Ayrıca döngüler, şartlı komut işletme gibi algoritmik yapıları son derece basit hale getirir. Bizim sadece programın algoritmik yapısına odaklanmamız yeterlidir.

Peki bir programcı olarak C dilini ne zaman kullanırız? Bir bilgisayarın elektronik donanımına yakın çalışan programların geliştirilmesinde C dili neredeyse de fakto standarttır. Gömülü sistemlerdeki mikrokotroller'larda, tost makinanızdaki AVR işlemcide, buzdolabınızdaki PIC işlemcisinde, akıllı televizyonunuzdaki ARM işlemcisinde muhtemelen C ile yazılmış bir program çalışıyordur.

Modern işletim sistemlerinin çekirdeğini oluşturan "kernel" yazılımı da genelde C ile yazılmıştır. Örneğin Linux kernel, Windows kernel, MacOS kernel, birer C programıdır (bir miktar assembly de içerir).

Aynı şekilde iyi performans gerektiren birçok grafik kütüphanesi, şifreleme kütüphanesi, sunucularda çalışan servis yazılımları (web sunucular, eposta sunucular vs) büyük çoğunlukla C dilinde yazılırlar.
 
Son düzenleme:
  • Beğen
Reactions: nt
C dilinden sonraki seviye, C++ dilidir. C dili ile birçok ortak yanı olmasına rağmen, C diline göre büyük avantajları vardır. Bu avantajları anlamak için, öncelikle C nin problemi nedir, onu anlamamız lazım.

Assembly ile ilgili birçok işi kolaylaştırmasına rağmen, C dilinin hatalı program yapılarına karşı koruması neredeyse hiç yoktur. C dili, kuralları en az olan dillerden birisidir, programlama dünyasının Teksas'ıdır :D

C dilinde göz göre yanlış birşey yapsanız, dilin yapı kurallarına uyduğu müddetçe, derleyici size hiç ses çıkarmaz. Örneğin 1 byte'lık bir değişkene, 4 byte'lık bir değişkenin değerini atayabilirsiniz. C bunu seve seve yapar ve siz veriyi kaybettiğinizle kalırsınız. 100 byte'lık bir tabloya 1000 byte veri yazmanıza hiç ses çıkarmaz :oops: Bilgisayar güvenlik açıkları, işte hep bu dikkatsiz yazılmış C sistem yazılımlarından kaynaklanmıştır ve halen sorun olmaya devam etmektedir!

C++, bazı konularda kullanıcının hata yapma ihtimalini biraz azaltıyor. Ama gene de dikkatsiz ve dağınık bir programcı, C++ ile de C'de yazdığı programlar kadar soruna sebep olabilir. C++ ayrıca ilave veri yapıları, ilave program akış yapıları ve ilave kolaylıklar sağlıyor.

C öğrendikten sonra C++ dilinin getiridiği ilave özellikleri de öğrenmek gerekir, çünkü sistem programlama ile uğraşacaksak, ikisi de piyasada sık rastlayacağımız dillerdir. O yüzden zaten C/C++ biliyor musun diye sorulur. "C++ biliyorum, C bilmiyorum" derseniz çok ayıp olur. Bu "koşmayı biliyorum ama yürümeyi bilmiyorum abi" demek gibi birşey olur :D. "C biliyorum, C++ bilmiyorum" deyince de gene birşeyler eksik kalmış olur.
 
Son düzenleme:
Şimdi buraya kadar saydığımız programlama dillerinde, her zaman bir derleyici var, ve bu derleyici, bizim yazdığımız programı alıyor ve bunu en sonunda makina dili haline getiriyor.

Bundan sonra gelen üst seviye dillerde ama durum böyle değil. Bu dillerde, yazılan program, ya bir ara dil yapısına dönüştürülüyor ve bu ara dili çalıştıran bir "çalıştırıcı" programla kullanılıyor (Örneğin Java derleyicisi byte code üretiyor ve Java Runtime, bu byte code'u çalıştırıyor), yada program direkt olarak kaynak kodu üzerinden çalıştırılıyor (Python, Perl, Javascript vs).

Sayı olarak çok çeşit üst seviye dil vardır ve sürekli yenileri de piyasaya çıkıyor. Ama en çok bilinirliği olanları listeleyelim:

- Java
- Javascript
- PHP
- Perl
- Shell Script
- Ruby
- Go
- Python

Ve tahmin edebileceğiniz gibi, bu dillerin yorumlayıcılar ve çalıştırıcıları, hep C ve C++ dilinde yazılmış programlardır :)
 
Son düzenleme:
  • Sevgi
Reactions: nt
Evet programlama dilleri sınıflandırmamızı şimdilik burada bitirelim. Yalnız, konuyu eksik bırakmamak için şunu da belirtelim:

Daha önce "makina dili ile sadece derleyici yazılımını geliştirenler muhatap olur. Biz normal programcılar, makina dili ile muhatap olmayız" demiştim. Aslında makina dili ile direkt iştigal eden başka bir grup daha var: Bilgisayar korsanları. Eğer uygun bir açık tespit ettiklerinde, saldırdıkları sunucuya bir makina dili programcığı gönderip o programın çalıştırılmasını sağlayabilirler. Ama artık günümüzde bu tip saldırıların yapılması neredeyse imkansız hale gelmiştir. Modern işlemciler, kendi donanımsal özellikler gereği artık bir veri paketi olarak gelen byte'ları program olarak çalıştırmazlar.
 
Son düzenleme:
  • Beğen
Reactions: nt
Makina dili ile uğraşması gereken birkaç alan daha sayabiliriz. Debugger yazılımı geliştiren firmalar, belli bir hafıza bölgesinde bulunan dataları, mevcut işlemci mimarisine göre yorumlar ve assembly dilinde bir çıktı üretirler. Bu işleme disassembly denir, ve bu işi yapan yazılım parçasına da disassembler denir.

Disassembler'lar sadece debugger'larda da kullanılmaz. Bir çalıştırılabilir binary program üzerinde reverse engineering yapılırken de özel disassembler yazılımları kullanılır. Bu disassembler, binary programın assembly dilinde kaynak dosyasını üretir. Bu kaynak dosyasından programın nasıl çalıştığının anlaşılması çok zor ve sabır gerektiren bir iştir. Amaç ise programın davranışını değiştirmek. Örneğin lisanslama nedeniyle kısıtlı çalışan bir programdan kısıtlamaları kaldırmak, veya örneğin 3 denemeye izin veren oyun programlarında çok daha fazla denemeye izin vermek. Veya buna benzer başka davranış değişiklikleri. En yaygın bilinen ve profesyonel kalitede disassembler programı "IDA Pro" dur.
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,656
Mesajlar
97,309
Üyeler
2,438
Son üye
İbrahimSönmez

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top