Tekrar merhaba arkadaşlar.Hatırladığınız üzere ilk olarak Programlama Temelleri hakkında bir yazı paylaşmıştım.Onun devamı niteliğinde olan bu yazım ise Programlama Dillerinin Sınıflandırılması konusunu içeriyor...
Öncelikle bahsetmiş olduğum diğer yazıyı okumadı iseniz okumanıızı tavsiye ediyorum!
İlk yazımızda programlama ile ilgili kavramlar ve bu kavramların basit örneklendirilmesinden sonra şimdi dillerin sınıflandırılmasına geçebiliriz.
Programlama dilleri için farklı biçimlerde sınıflandırmalar bulunmaktadır.En basit biçimdeki sınıflandırılma ise programlama dillerinin makine diline olan yakınlıkları ile yapılan sınıflandırılmalardır.Bu sınıflandırmaya göre diller 3 4 dala ayrılır.Bunlar;
1. Düşük seviye diller - Assembly Dilleri olarak geçer
2. Orta seviye diller - C
3. Yüksek seviye diller - Pascal/Python/Perl/Php/Java...
4. Uygulama Geliştime Ortamları - Visual Basic/Delphi ..
Dikkat ederseniz 4. seviyede olan diller aslında programlama dili değillerdir!Onlar daha çok Hızlı Uygulama geliştirme ortamlarıdır.RAD yani Rapid Application Development Environment bu ortamların özellikleri farklı programlama dillerini, grafik kütüphanelerine bağlayarak, kullanıcıların uygulamalarını programlama geliştirme temellerine hiç bulaşmadan geliştirmelerini sağlamaktır.Dikkat ettiyseniz programcı demiyorum.Çünkü uygulama geliştirici, veya kullanıcı diyorum.Ve nedeni ise RAD ortamlarda Programcılık kavramından biraz uzaklaştırma etkisine sahip olmaları.Fakat çok iyi derecede programlama yapan uygulama geliştiricilerde yok değil...
Programlama dillerinin farklı bir sınıflandırılması da hedef programların çeşidine bağlı olarak yapılmaktadır.Bu sınıflandırmayı şu şekilde vererirsem yanlış olmaz sanırım..:
1. Derlenen diller yani Compiled Languages: C/Pascal ...
Doğrudan işletim sisteminin çalıştırabileceği şekle çevrilen diller
2. Yorumlanan diller yani Interpreted Languages: Basic/PHP/Perl...
Yazıldıktan sonra özel bir derleme işlemi geçirmeyen çalışma esnasında satır satır veya tümü birden derlenip çalıştırılan diller olarak yorumlanırlar.Bu diller ile üretilen programlar çalışmak için bir yorumlayıcı programa ihtiyaç duyarlar!
3. Bayt kodlanan diller yani Managed/Byte Coded Languages: Java/Mono/dotNet...
Bir kaç yıl öncesine kadar çok da ön planda sayılmayan bu tür diller ise günümüzde oldukça çok kullanılan ve artık hali hatırı sayılan bir dil konumuna gelmiş durumdadır.Bu diller ile yazılan programlar bir kez derlenerek özel bir bayt koda çevirilirler daha sonra da çalıştırılabilmek için özel bir sanal makine yazılımına ihtiyaç duyarlar.
Bir başka ve önemli olan programlama dili sınıflandırma şeklide programlama dillerinin yapılarına göre oluşturulan sınıflandırmalardır.Bu sınıflandırmayı yaparken bazı örnekler vererek konumuzun daha iyi kavranabilmesini sağlayabiliriz.
1. Mnemonic/Assembly Diller
Intel ASM/ AlphaASM ..
Linux sistem çağrıları ve INTEL Assebly ile Merhaba Dünya!
--------------------------------------------------------------------------

Bu kodu sadece üyeler görüntüleyebilir! Üye olmak için
tıklayın Üye iseniz
giriş yapın.
Bu programı linux altında gcc yani Gnu Compiler Collection ile derleyebilirsiniz.Bunun için öncelikle bu kodu hello.S gibi sonu .S ile biten bir biçimde kaydedin ve daha sonra gcc -o hello hello.S komutuyla derleyebilirsiniz...
2. Yapısal Diller yani Structered Languages
C/Pascal/Basic...
C ile Yapısal Merhaba dünya diyelim

Bu kodu sadece üyeler görüntüleyebilir! Üye olmak için
tıklayın Üye iseniz
giriş yapın.
3. Nesneye Yönelimli Diller yani Object Oriented Languages
C++/Java/Objective-C/Oject-Pascal...
c++ ile OOP HelloWorld diyoruz...

Bu kodu sadece üyeler görüntüleyebilir! Üye olmak için
tıklayın Üye iseniz
giriş yapın.
4. Mantıksal Diller yani Logic Languages
Prolog/Mercury/Oz/Mozart...
Mantıksal programlama dillerinin temeli adından da anlaşılacağı gibi Mantığa dayanır.Gerçeklerle beraber kurallar da ortaya konur ve sorulara yönelik cevaplar aranır.
Prolog Hello World

Bu kodu sadece üyeler görüntüleyebilir! Üye olmak için
tıklayın Üye iseniz
giriş yapın.
Daha ilginç bir Prolog Örneği ise ;
--------------------------------------
Simple Prolog L.A. Monash Comp Sci 2/8/89
1: born(charles, elizabeth2, philip).
2: born(anne, elizabeth2, philip).
3: born(andrew, elizabeth2, philip).
4: born(edward, elizabeth2, philip).
5:
6: born(diana, frances, edwardSpencer).
7:
8: born(william, diana, charles).
9: born(henry, diana, charles).
10:
11: ? born(S, elizabeth2, Y) and born(G, M, S).
12:
13:
--- end of parsing ---
born(charles, elizabeth2, philip).
, born(anne, elizabeth2, philip).
, born(andrew, elizabeth2, philip).
, born(edward, elizabeth2, philip).
, born(diana, frances, edwardSpen).
, born(william, diana, charles).
, born(henry, diana, charles).
?born(S, elizabeth2, Y), born(G, M, S)
--- running ---
born(charles, elizabeth2, philip), born(william, diana, charles) yes
born(charles, elizabeth2, philip), born(henry, diana, charles) yes
Bunlardan başka türlerde de programlama dilleri bulunmuyo değil..Ancak ana sınıflandırma olarak bunlar vardır.
Şimdi buraları geçtikten sonra C ile basitçe programlama dili kavramlarına geçelim istiyorum...
Bunun için yazdığımız Helloworld programını biraz genişletelim.
hello.c

Bu kodu sadece üyeler görüntüleyebilir! Üye olmak için
tıklayın Üye iseniz
giriş yapın.
-------------------------------
sayhello.c

Bu kodu sadece üyeler görüntüleyebilir! Üye olmak için
tıklayın Üye iseniz
giriş yapın.
Burada gördüğünüz Hello World programımızı 2 ayrı dosya haline getirmiş bulunuyoruz.
Amacımız ise derleme ve bağlama işlemlerinin nasıl yapıldığı göstermekti...
Dikkat ederseniz hello.c içinde tanımlanmamış olan sayhello() fonksiyonumuz var!Normal olarak derlemeye çalışırsak karşmıza ;
fsniper@fsnipers:~/hello$ gcc hello.c
/tmp/ccmYQrnf.o(.text+0x11): `main' İşlevinde:
: undefined reference to `sayhello'
collect2: ld çıkış durumu 1 ile döndü
fsniper@fsnipers:~/hello$
şeklinde bir hata çıkacaktır.Dikkat edersek burada hatayı ld yani dinamik bağlayıcıdan alıyoruz.Gcc bu işlemi yaparken derleme ve bağlama işlemlerini transparan olarak yerine getiriyor.Ama bağlama işlemi sırasında sayhello fonksiyonu için herhangi bir refereans bulunamadığı için biz bu hatayı alıyoruz...
Ancak biz burada sadece derleme işlemi yapsaydık ve bağlama işlemini sonraya bıraksaydık hiçbir hata almayacaktık!!!
Gcc nin yardımına baktığımızda bağlama işlemini dışarıda bırakmak için -c parametresini vermemiz gerektiğini görüyoruz sanırım.Bundan sonra ayrıca bağlama işlemini de yapmamız gerekiyor demekki.Aşağdaki komutları takip ederseniz öncelikle hello.c yi derliyoruz.Görüldüğü gibi derleme işleminden sonra nesne koduna ulaşıyoruz!Bu nesne kodu ile diğer nesne kodları ve kütüphaneler bağlandıktan sonra hedef programa ulaşabiliyoruz.Aslında burada sayhello.c dosyası derlenirken gcc nin derleme esnasında bağlama özelliğinden faydalanıldığıda görülebilir.

Bu kodu sadece üyeler görüntüleyebilir! Üye olmak için
tıklayın Üye iseniz
giriş yapın.
Burada görüldüğü gibi hiç sorunsuz bir nesne kodu ile yeni derlenen bir programı bağlamış bulunduk (:
Ancak derleme işlemi esnasında bağlamayı yapmak istemiyor olsaydık şöyle olurdu

Bu kodu sadece üyeler görüntüleyebilir! Üye olmak için
tıklayın Üye iseniz
giriş yapın.
İşte yukarıdaki gibi komutları kullanıyor olacaktık.Görüldüğü gibi burada gcc bizim için iki tane nesne kodunu birleştiriyor vede çalıştırılabilir kodu edinebilmemizi sağlıyor.
Aslına bakılırsa gcc burada bizim için hello.o ve sayhello.o yu statik olarak bağlarken bu programın tam olarak çalışabilmesi için statik olarak libgcc yi dinamik olarak da libc yi bağlıyor...Ancak bunlar transparan olarak yapılıyor!
Eğer yapılan işlemleri gcc nin basmasını ve neler yapıldığını görmek istersek
gcc nin -v parameresi ile
fsniper@fsnipers:~/hello$ gcc hello.o sayhello.o -o hello -v
Özellikler /usr/lib/gcc-lib/i486-linux/3.3.4/specs'den okunuyor
../src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --enable-__cxa_atexit --enable-clocale=gnu --enable-debug --enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i486-linux
seçenekleriyle yapılandırıldı.
Evre modeli: posix
gcc 3.3.4 (Debian 1:3.3.4-13) sürümü
/usr/lib/gcc-lib/i486-linux/3.3.4/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/gcc-lib/i486-linux/3.3.4/../../../crt1.o /usr/lib/gcc-lib/i486-linux/3.3.4/../../../crti.o /usr/lib/gcc-lib/i486-linux/3.3.4/crtbegin.o -L/usr/lib/gcc-lib/i486-linux/3.3.4 -L/usr/lib/gcc-lib/i486-linux/3.3.4/../../.. hello.o sayhello.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc-lib/i486-linux/3.3.4/crtend.o /usr/lib/gcc-lib/i486-linux/3.3.4/../../../crtn.o
fsniper@fsnipers:~/hello$
şeklinde bir sonuç alıyoruz.Bu çıktıyı açıkçası yorumlamayı pek gözüme kestiremiyorum şu anda :(
Elimden geldiğince bildiğim ve araştırdığımca bu konuyu sizlere açıklamaya anlatmaya çalıştım.Yanlış bişey dedi veya hata yaptıysam kusuruma bakmayın.Ayrıca yazımı okuduğunuz için teşekkür ediyorum..
İyi günler TheCoders.net kullanıcıları...
Çok Yoğun !