Programlama Temelleri-II
Merhaba arkadaşlar bu yazı 2 parçadan oluşan "Programlama Temelleri" isimli yazı dizimin II numaralı dökümanıdır. Eğer daha önce I numaralı dökümanı okumadıysanız, öncelikle onu okumanızı tavsiye ediyorum.
İlk yazımda programlama ile ilgili kavramların üzerinden basitçe bahsettikten sonra örneklerle programlama dillerinin çeşitlerine geçebiliriz.
Sınıflandırmalar bittikden sonraysa ilk yazı da bahsetmiş olduğum derleme ve bağlama olaylarına deneysel bir bakış yapacağız.
Programlama dilleri için farklı biçimlerde sınıflandırmalar bulunuyor. En basit biçimdeki sınıflandırılma, programlama dillerinin makine diline olan yakınlıkları ile yapılan sınıflandırmadır. Bu sınıflandırmaya göre diller 4 e ayrılıyor.
1. Düşük seviye diller - Assembly Dilleri
2. Orta seviye diller - C
3. Yüksek seviye diller - Pascal/Python/Perl/Php/Java...
4. Uygulama Geliştime Ortamları - Visual Basic/Delphi ..
Dikkat edilirse 4. seviye diller aslında programlama dili değiller. Onlar HUO- Hızlı Uygulama geliştirme ortamları. (RAD 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ğlamak. Dikkat edin programcı demiyorum, Uygulama geliştirici, veya kullanıcı diyorum. Çünkü RAD ortamlar Programcılık kavramından biraz uzaklaştırma etkisine sahipler. Ancak bunu kimse yanlış anlamasın çok iyi anlamda programlama yapan uygulama geliştiricilerde bulunuyor.
Programlama dillerinin farklı bir sınıflandırılması da hedef programların çeşidine bağlı olarak yapılıyor. Bu sınıflandırmayı şu şekilde verebiliriz:
1. Derlenen diller (Compiled languages): C/Pascal ...
Doğrudan işletim sisteminin çalıştırabileceği şekle çevrilen diller
2. Yorumlanan diller (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. Bu diller ile üretilen programlar çalışmak için bir yorumlayıcı programa ihtiyaç duyarlar.
3. Bayt kodlanan diller (Managed/Byte Coded Languages): Java/Mono/dotNet...
Bir kaç yıl öncesine kadar çok da ön planda sayılmayan bu tür diller günümüzde neredeyse tek geçilen dillerdir denebilir. 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 ne önemli programlama dili sınıflandırma şeklide programlama dillerinin yapılarına göre oluşturulan sınıflandırmadır. Bu sınıflandırmayı yaparken bazı örnekler vererek konuyu güzelleştirmek istiyorum.
1. Mnemonic/Assembly Diller
Intel ASM/ AlphaASM ..
Kod:
Linux sistem çağrıları ve INTEL Assebly ile Merhaba Dünya [k3]
--------------------------------------------------------------------------
section .text
global _start;must be declared for linker (ld)
msg db 'Hello, world!',0xa;our dear string
len equ $ - msg;length of our dear string
_start:;tell linker entry point
mov edx,len;message length
mov ecx,msg;message to write
mov ebx,1;file descriptor (stdout)
mov eax,4;system call number (sys_write)
int 0x80;call kernel
mov eax,1;system call number (sys_exit)
int 0x80;call kernel
Bu programı linux altında gcc (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 (Structered Languages)
C/Pascal/Basic...
Kod:
C ile Yapısal Merhaba dünya
#include
void yaz(char *string) {
printf(string);
}
int main(int argc, char **argv) {
yaz("Merhaba, Dünya!");
return 0;
}
3. Nesneye Yönelimli Diller (Object Oriented languages)
C++/Java/Objective-C/Oject-Pascal...
Kod:
c++ ile OOP HelloWorld
#include
class clsHello {
static void sayHello() {
std::cout << "Hello, Word";
}
};
void main() {
clsHello helloObj
helloObj.sayHello();
}
4. Mantıksal Diller (logic Languages)
Prolog/Mercury/Oz/Mozart...
Mantıksal programlama dillerinin temeli adından da anlaşılacağı gibi Mantığa dayanır. Gerçekler ve kurallar ortaya konur ve sorulara yönelik cevaplar aranır. [k4]
Kod:
Prolog Hello World
hello :- display('Hello World!') , nl .
Kod:
Daha ilginç bir Prolog Örneği [k5]
--------------------------------------
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 bulunuyor olabilir ancak ana sınıflandırmalar bunlardır.
Şimdi Bunları geçtikten sonra C ile basitçe programlama dili kavramlarını geçelim.
Bunun için yazdığımız Helloworld programını biraz genişleteceğim.
Kod:
hello.c
int main(int argc, char *argv[]) {
sayhello();
}
-------------------------------
sayhello.c
#include
void sayhello() {
printf("Hello, World!");
}
burada gördüğünüz Hello World programımızı 2 ayrı dosya haline getirdik.
Burada size derleme ve bağlama işlemlerinin nasıl yapıldığı göstermek.
Dikkat ederseniz hello.c içinde tanımlanmamış olan sayhello() fonksiyonumuz var. Normal olarak derlemeya çalışırsak
Kod:
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 hata alıyoruz. Dikkat ederseniz 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. Ancak bağlama işlemi sırasında sayhello fonksiyonu için herhangi bir refereans bulunamadığı için hata alıyoruz.
Ancak 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. Bundan sonra ayrıca bağlama işlemini de yapmamız gerekiyor. 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. Burada sayhello.c dosyası derlenirken gcc nin derleme esnasında bağlama özelliğinden faydalanıldığıda görülebilir.
Kod:
fsniper@fsnipers:~/hello$ ls
hello.c sayhello.c
fsniper@fsnipers:~/hello$ gcc -c hello.c
fsniper@fsnipers:~/hello$ gcc hello.o -o hello sayhello.c
fsniper@fsnipers:~/hello$ ls
hello hello.c hello.o sayhello.c
fsniper@fsnipers:~/hello$ ./hello
Hello, World!
fsniper@fsnipers:~/hello$
Burada görüldüğü gibi hiç sorunsuz 1 nesne kodu ile yeni derlenen bir programı bağlamış bulunduk. Ancak derleme işlemi esnasında bağlamayı yapmak istemiyor olsaydık
Kod:
fsniper@fsnipers:~/hello$ gcc -c sayhello.c
fsniper@fsnipers:~/hello$ gcc -c hello.c
fsniper@fsnipers:~/hello$ gcc hello.o sayhello.o -o hello
fsniper@fsnipers:~/hello$ ./hello
Hello, World!
fsniper@fsnipers:~/hello$
şeklindeki komutları kullanıyor olacaktık. Görüldüğü gibi burada gcc bizim için iki adet nesne kodunu birleştiriyor ve çalıştırılabilir kodu ediniyoruz.
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çıklayacak kuvveti kendimde bulamadığımı söyleyeyim Görüldüğü gibi aslında programcılık yada gerçek adıyla kodculuk (coder) pek kolay bir iş olmadığı görülüyor. Bu dokümanda anlatamadığım veya bilmediğim daha pek çok konu bulunuyor. umarım "21 günde programcı" olmak istemeyen bu işi ciddi yapmak isteyen kişilere biraz yol gösterebilmişimdir.
Buraya kadar okuyup, bu işkenceye dayanabildiyseniz öncelikle sizi tebrik ediyorum ve ayrıca teşekkür ediyorum.
Yazar : Onur YALAZI
[k1]Von Neumann ->
[Bu Adresi (link) Görme Yetkiniz Yok BEDAVA'ya Üye Ol Sitemizden Faydalan....]
[k2]NetBSD ->
[Bu Adresi (link) Görme Yetkiniz Yok BEDAVA'ya Üye Ol Sitemizden Faydalan....]
[k3]Linux Sistem çağrıları ile Intel ASM hello world ->
[Bu Adresi (link) Görme Yetkiniz Yok BEDAVA'ya Üye Ol Sitemizden Faydalan....]
[k4]Wikipedia Logical Programming ->
[Bu Adresi (link) Görme Yetkiniz Yok BEDAVA'ya Üye Ol Sitemizden Faydalan....]