Kod Dünyası

ALGOL etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
ALGOL etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

13 Ocak 2015 Salı

 Sistemlerin  çoğu  gerçek  sayıları  IEEE  754 standardına  göre  tutarlar.  (Institute  of  Electrical  and
Electronics Engineers)Bu standarda göre gerçek sayılar için iki ayrı format belirlenmiştir:
single precision format (tek hassasiyetli gerçek sayı formatı)
Bu formatta gerçek sayı 32 bit (8 byte) ile ifade edilir.
32 bit üç ayrı kısma ayrılmıştır.
1. İşaret biti (sign bit) (1 bit)
Aşağıda S harfi ile gösterilmiştir.
İşaret biti 1 ise sayı negatif, işaret biti 0 ise sayı pozitiftir.
2. Üstel kısım (exponent) (8 bit)
Aşağıda E harfleriyle gösterilmiştir.
3. Ondalık kısım (fraction) (23 bit)
Aşağıda F harfleriyle gösterilmiştir.
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
31 30-----------23 22-------------------------------------0
Aşağıdaki formüle göre sayının değeri hesaplanabilir :
V sayının değeri olmak üzere:
E = 255 ise ve F 0 dışı bir değer ise V = NaN (Not a number) bir gerçek sayı olarak kabul edilmez. Örnek :
0 11111111 00001000000100000000000 = Sayı değil
1 11111111 00010101010001001010101 = Sayı değil
E = 255 ise ve F = 0 ise ve S = 1 ise V = -sonsuz
E = 255 ise ve F = 0 ise ve S = 1 ise V = +sonsuz
0 < E < 255 ise
V = (-1)
S
* 2
(E -127)
* (1.F)
Önce sayının fraction kısmının başına 1. eklenir. Daha sonra bu sayı 2
(E-127)
ile çarpılarak noktanın yeri
ayarlanır. Noktadan sonraki kısım 2'nin artan negatif kuvvetleriyle çarpılarak elde edilecektir. Örnekler :
0 10000000 00000000000000000000000 = +1 * 2
(128 - 127)
* 1.0
= 2 * 1.0
= 10.00
= 2
0 10000001 10100000000000000000000 = +1 * 2
(129 - 127)
* 1.101
= 2
2
* 1.101
= 110.100000
= 6.5
1 10000001 10100000000000000000000 = -1 * 2
(129 - 127)
* 1.101
= -2
2
* 1.101
= 110.100000
= -6.5
0 00000001 00000000000000000000000 = +1 * 2
(1 - 127)
* 1.0
= 2
-126
E = 0 ve F sıfır dışı bir değer ise
V = (-1)
S
* 2
(-126)
* (0.F)
Örnekler :
0 00000000 10000000000000000000000 = +1 * 2
-126
* 0.1
=
0 00000000 00000000000000000000001 = +1 * 2
-126
0. 00000000000000000000001
E = 0 ve F = 0 ve S = 1 ise V = -0
E = 0 ve F = 0 ve S = 0 ise V = 0
double precision format (çift hassasiyetli gerçek sayı formatı)
Bu formatta gerçek sayı 64 bit (8 byte) ile ifade edilir.
64 bit üç ayrı kısıma ayrılmıştır.
1. İşaret biti (sign bit) (1 bit)
Aşağıda S harfi ile gösterilmiştir.
İşaret biti 1 ise sayı negatif, işaret biti 0 ise sayı pozitiftir.
2. Üstel kısım (exponent) (11 bit)
Aşağıda E harfleriyle gösterilmiştir.
3. Ondalık kısım (fraction) (52 bit)
Aşağıda F harfleriyle gösterilmiştir.
S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
63 62------------------52 51-----------------------------------------------------------------------------0
Aşağıdaki formüle göre sayının değeri hesaplanabilir :
Aşağıdaki formüle göre sayının değeri hesaplanabilir :
V sayının değeri olmak üzere:
E = 2047 ise ve F 0 dışı bir değer ise V = NaN (Not a number) bir gerçek sayı olarak kabul edilmez.
E = 2047 ise ve F = 0 ise ve S = 1 ise V = -sonsuz
E = 2047 ise ve F = 0 ise ve S = 1 ise V = +sonsuz
0 < E < 2047 ise
V = (-1)
S
* 2
(E -1023)
* (1.F)
Önce sayının fraction kısmının başına 1. eklenir. Daha sonra bu sayı 2
(E-1023)
ile çarpılarak noktanın yeri
ayarlanır. Noktadan sonraki kısım 2'nin artan negatif kuvvetleriyle çarpılarak elde edilecektir.
E = 0 ve F sıfır dışı bir değer ise
V = (-1)
S
* 2
(-126)
* (0.F)
E = 0 ve F = 0 ve S = 1 ise V = -0
E = 0 ve F = 0 ve S = 0 ise V = 0

Günlük hayatta 10’luk sayı sistemini kullanıyoruz. 10 luk sistemde bir sayının değeri aslında her bir basamak
değerinin 10 sayısının ilgili kuvvetiyle çarpımlarının toplanmasıyla elde edilir.
Örneğin 1273 = (3 * 1) + (7 * 10 ) + (2 * 100) + (1 * 1000)
Ancak bilgisayar sistemlerinde bütün bilgiler ikilik sistemde(binary system) ifade edilir.
Genel olarak sayı sistemi kaçlıksa o sayı sisteminde o kadar sembol bulunur.
Örneğin 10’luk sistemde 10 adet sembol vardır ve bu semboller 0, 1, 2, 3, 4, 5, 6, 7, 8, 9’dur.
Aynı şekilde ikilik sayı sisteminde yalnızca iki adet sembol bulunur. Yani yalnızca 0 ve 1.
Bir sayıyı başka bir sayı sisteminde ifade etmek o sayının değerini değiştirmez. Yalnızca sayının gösteriliş
biçimi değişir. Örneğin onluk sayı sisteminde sayısal değeri 32 olan büyüklüğü çeşitli farklı sayı sistemlerinde
farklı biçimlerde gösterebiliriz ama sayının büyüklüğünü değiştirmiş olmayız.
İkilik  sistemde  her  bir  basamağa  1  bit  denir.  Bit  kelimesi  binary  digit sözcüklerinden
türetilmiştir.

Örneğin 1011 sayısı 4 bittir. (Ya da 4 bit uzunluğundadır).
11011001 sayısı 8 bittir.
8 bitlik bir büyüklük bir byte olarak isimlendirilir.
1 kilobyte 1K = 1024 byte dır. (yani 2
10
byte)
1 mega byte 1 MB = 1024 Kilo byte dır. (yani 2
20
byte)
1 gigabyte 1 GB = 1024 MB dır. (yani 2
30
byte)
1 terabyte 1 TB = 1024 GB dır. (yani 2
40
byte)
1 petabyte 1PB = 1024 TB dır. (yani 2
50
byte)
1 exabyte 1EB = 1024 PB dır. (yani 2
60
byte)
1 zettabyte 1ZB = 1024 EB dir.( yani 2
70
byte)
1 yottabyte 1YB = 1024 ZB dır.( yani 2
80
byte)
Kilo büyüklük olarak 1000 kat anlamına gelmektedir, ancak bilgisayar alanında Kilo 2'nin 1000'e en yakın
kuvveti olan 2
10
yani 1024 kat olarak kullanılır.
4 bit  1 Nybble (Nibble şeklinde de yazılır)
8 bit  1 byte
16 bit  1 word
32 bit  1 double word
64 bit  1 quadro word
olarak da isimlendirilmektedir.
ikilik sisteme ilişkin genel işlemler
i. İkilik sistemdeki bir sayının 10 luk sistemde ifade edilmesi:
ikilik  sayı  sisteminde  ifade  edilen  bir  sayının  10’luk  sistemdeki  karşılığını  hesaplamak  için  en  sağdan
başlayarak bütün basamakları tek tek 2’nin artan kuvvetleriyle çarpılır.

Bu arada sık kullanılan iki terimi de açıklayalım. İkilik sayı sisteminde yazılan bir sayının en solundaki bit,
yukarıdaki örnekten de görüldüğü gibi en yüksek sayısal değeri katıyor. Bu bite en yüksek anlamlı bit (most
significant digit) diyeceğiz ve bu bit için bundan sonra MSD kısaltmasını kullanacağız.
İkilik sayı sisteminde yazılan bir sayının en sağındaki bit, yine yukarıdaki örnekten de görüldüğü gibi en
düşük sayısal değeri katıyor. Bu bite en düşük anlamlı bit (least significant digit) diyeceğiz ve bu bit için
bundan sonra LSD kısaltmasını kullanacağız.
Örnek :
0101 1101 sayısı için
MSD = 0
LSD = 1
11
2
İkilik sayı sisteminde yazılan bir sayının belirli bir basamağından (bitinden) söz ettiğimizde, hangi bitten söz
edildiğinin doğru bir şekilde anlaşılması için basamaklar numaralandırılır.
8 bitlik bir sayı için, sayının en sağındaki bit (yani (LSD) sayının 0. bitidir. Sayının en solundaki bit (yani
MSD) sayının 7. bitidir.
ii. 10’luk sistemdeki bir sayının 2’lik sistemde ifadesi :
Sayı sürekli olarak 2 ye bölünür. Her bölümden kalan değer( yani 1 ya da 0) oluşturulacak sayının 0. bitinden
başlayarak, basamaklarını oluşturacaktır. Bu işleme 0 sayısı elde edilinceye kadar devam edilir. Örnek:
87 sayısını ikilik sayı sisteminde ifade etmek isteyelim:
87 / 2 = 43 (kalan 1) Sayının 0. biti 1
43 / 2 = 21 (kalan 1) Sayının 1. biti 1
21 / 2 = 10 (kalan 1) Sayının 2. biti 1
10 / 2 = 5 (kalan 0) Sayının 3. biti 0
5 / 2 = 2 (kalan 1) Sayının 4. biti 1
2 / 2 = 1 (kalan 0) Sayının 5. biti 0
1 / 2 = 0 (kalan 1) Sayının 6. biti 1
87 = 0101 0111
İkinci bir yöntem ise 10 luk sistemde ifade edilen sayıdan sürekli olarak 2'nin en büyük kuvvetini çıkarmaktır.
2’nin çıkarılan her bir kuvveti için ilgili basamağa 1 değeri yazılır. Bu işleme 0 sayısı elde edilene kadar
devam edilir. Örnek:
Yine 87 sayısını ikilik sayı sisteminde ifade etmek isteyelim:
87'den çıkarılabilecek, yani 87'den büyük olmayan ikinin en büyük kuvveti nedir? Cevap 64. O zaman 64 = 2
6
olduğuna göre 6.bit 1 değerini alacak.
87 - 64 = 23. Şimdi 23'den çıkarılabilecek ikinin en büyük kuvvetini bulalım. Bu say1 16'dır. Yani 2
4
'dür. O
zaman sayımızın 4. biti de 1 olacak.
23 - 16 = 7. 7'den çıkarılabilecek ikinin en büyük kuvveti 4'dür ve 4 = 2
2
'dir. Sayımızınj 2. biti de 1 olacak.
7 - 4 = 3.
3 - 2 = 1 (2 = 2
1
) Sayımızın 1. biti 1 olacak.
1 - 1 = 0 (1 = 2
0
) Sayımızın 0. biti 1 olacak.
1 değeri olmayan tüm bitleri 0 bitiyle doldurarak sayımızı ikilik sistemde ifade edelim:
87 = 0101 0111
iii.  İkilik  sistemde  ifade  edilen  bir  sayının  1’e  tümleyeni.  Sayının  tüm  bitlerinin  tersinin
alınmasıyla elde edilir. Yani sayıdaki 1’ler 0 ve 0’lar 1 yapılır.
Bir sayının 1’e tümleyeninin 1’e tümleyeni sayının yine kendisidir.
iv. İkilik sistemde ifade edilen bir sayının 2’ye tümleyeninin bulunması:
Önce sayının 1’e tümleyeni yukarıdaki gibi bulunur. Daha sonra elde edilen sayıya 1 eklenirse sayının 2’ye
tümleyeni bulunmuş olur. 2'ye tümleyeni bulmak için daha daha pratik bir yol daha vardır : Sayının en
solundan başlayarak ilk defa 1 biti görene kadar (ilk görülen 1 dahil) sayının aynısı yazılır, daha sonraki tüm
basamaklar için basamağın tersi yazılır. (Yani 1 için 0 ve 0 için 1) Örneğin :
1110 0100 sayısının ikiye tümleyeni 0001 1100 dır.
0101 1000 sayısının ikiye tümleyeni 1010 1000 dır.
Bir sayının ikiye tümleyeninin ikiye tümleyeni sayının kendisidir. (Deneyiniz)
8 bitlik bir alana yazılacak en büyük tam sayı kaçtır?
1111 1111 = 255 dir. (1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255)
8 bitlik bir alana yazılacak en küçük tam sayı kaçtır?
0000 0000 = 0’dır.
Negatif bir tamsayı ikilik sistemde nasıl gösterilir?


SAYI SİSTEMLERİ

Negatif tamsayıların da ifade edildiği ikilik sayı sistemine işaretli ikilik sayı sistemi (signed binary system)
denir. İşaretli ikilik sayı siteminde, negatif sayıları göstermek için hemen hemen tüm bilgisayar sistemlerinde
aşağıdaki yol izlenir:
Sayının en yüksek anlamlı biti işaret biti (sign bit) olarak kabul edilir. Ve bu bit 1ise sayı negatif, bu bit 0ise
sayı  pozitif  olarak  değerlendirilir.  İkilik  sistemde  bir  negatif  sayı  aynı  değerdeki  pozitif  sayının  ikiye
tümleyenidir. Örnek olarak, ikilik sistemde yazacağımız –27 sayısı yine ikilik sistemde yazılan 27 sayısının
ikiye tümleyenidir.
Pozitif olan sayıların değerini tıpkı işaretsiz sayı sisteminde olduğu gibi elde ederiz:
0001 1110 işaretli sistemde pozitif bir sayıdır. (Decimal olarak 29 sayısına eşittir.)
Ancak negatif olan sayıların değerini ancak bir dönüşümle elde edebiliriz:
1001 1101 işaretli sistemde negatif bir sayıdır. (Çünkü işaret biti 1)
2lik sistemde ifade edilen negatif bir sayının 10’luk sistemde hangi negatif sayıya eşit olduğunu nasıl
bulunur?
Sayının en yüksek anlamlı biti (MSD) işaret bitidir. Bu bit 1 ise sayı negatifdir. Sayının kaça eşit olduğunu
hesaplamak için ilk önce sayının 2’ye tümleyeni bulunur. Ve bu sayının hangi pozitif sayıya karşılık geldiğini
hesap edilir. Elde etmek istenen sayı, bulunan pozitif sayı ile aynı değerdeki negatif sayı olacaktır.
Örneğin 1001 1101 sayısının 10’luk sistemde hangi sayıya karşılık geldiği bulunmak istenirse:
Sayının en soldaki biti 1 olduğuna göre bu sayı negatif bir sayı olacaktır. Hangi negatif sayı olduğunu bulmak
için sayının 2’ye tümleyenini alınır.

1001 1101 sayısının ikiye tümleyeni 0110 0011 sayısıdır.

Bu sayının 10'luk sistemde hangi sayıya denk olduğu hesaplanırsa :
(1 * 1 + 1 * 2 + 0 * 4 + 0 * 8 + 0 * 16 + 1 * 32 + 1 * 64 = 99)
ilk yazılan sayının -99 olduğu anlaşılmış olur.
10'luk sistemde ifade edilen negatif sayıların işaretli ikilik sistemde yazılması :
Önce sayının aynı değerli fakat pozitif olanı ikilik sistemde ifade edilir : Daha sonra yazılan sayının ikiye
tümleyenini alınarak, yazmak istenilen sayı elde edilir.
Örnek : İkilik sistemde –17 yazmak istenirse;
önce 17 yazılır.   0001 0001
bu sayının 2'ye tümleyeni alınırsa 1110 1111 sayısı elde edilir.
Sayı değeri aynı olan Negatif ve Pozitif sayılar birbirlerinin ikiye tümleyenleridir.
İkilik  sistemde  gösterilmiş  olsa  da  aynı  sayının  negatifiyle  pozitifinin  toplamı  0  değerini  verecektir.
(Deneyiniz!)
Bir byte’lık (8 bitlik) bir alana yazabileceğimiz (işaret bitini dikkate almadan) en büyük sayı 255 (1111 1111)
ve en küçük sayı ise 0’dır.(0000 0000). Peki işaret biti dikkate alındığında 1 byte’lık alana yazılabilecek en
büyük ve en küçük sayılar ne olabilir?
En büyük sayı kolayca hesaplanabilir. işaret biti 0 olacak (yani sayı pozitif olacak) ve sayı değerini en büyük
hale getirmek için diğer bütün bit değerleri 1 olacak, bu sayı 0111 1111 sayısıdır. Bu sayıyı desimal sisteme
dönüştürürsek 127 olduğunu görürüz. Peki ya en küçük negatif sayı kaçtır ve nasıl ifade edilir?
0111 1111 sayısının ikiye tümleyenini alındığında –127 sayısını elde edilir.
1000 0001 (127) Bu sayıdan hala 1 çıkartabilir.
1000 0000 (-128) 1 byte alana yazılabilecek en küçük negatif sayıdır.


Burada dikkat edilmesi gereken iki önemli nokta vardır :
1 byte alana yazılabilecek en büyük sayı sınırı aşıldığında negatif bölgeye geçilir.
0111 1111 (en büyük pozitif tamsayı)
1 (1 toplarsak)
1000 0000 (-128 yani en küçük tamsayı)
yani 1 byte alana yazılabilecek en büyük tamsayıya 1 eklendiğinde  1 byte alana yazılabilecek en küçük
tamsayıyı elde ederiz.
1 byte alana yazılabilecek en küçük tamsayıdan 1 çıkardığımızda da 1 byte alana yazılabilecek en büyük
tamsayıyı elde ederiz.
Yukarıda anlattıklarımıza göre -1 sayısının işaretli ikilik sayı sisteminde 8 bitlik bir alanda aşağıdaki şekilde
ifade edilecektir.
-1 = 1111 1111
Yani işaretli ikilik sayı sisteminde tüm bitleri 1 olan sayı -1'dir. İleride bu sayıyla çok işimiz olacak!
16’lık  sayı  sistemi  (hexadecimal  numbering  system)  ve  8’lik  sayı
sistemi (octal system)
Bilgisayarların tamamen 2’lik sistemde çalıştığını söylemiştik, ama yukarıda görüldüğü gibi 2’lik sistemde
sayıların ifade edilmesi hem çok uzun hem de zahmetli. Bu yüzden, yazım ve algılama kolaylığı sağlamak
için 16’lık ve 8’lik sayı sistemleri de kullanılmaktadır.
16'lık ve 8’lik sayı sistemlerinde sayılar daha yoğun olarak kodlanıp kullanabilir.
Başta da söz edildiği gibi 10 luk sistemde 10, 2’lik sistemde ise 2 sembol bulunmaktadır. Bu durumda 16’lık
sayı sisteminde de 16 sembol bulunur.
ilk 10 sembol 10'luk sistemde kullanılan sembollerle tamamen aynıdır :
1, 2, 3, 4, 5, 6, 7, 8, 9,
Daha sonraki semboller
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
16’lık sayı sisteminde yazılmış bir sayıyı 10’luk sisteme çevirmek için, en sağdan başlayarak basamak
değerleri 16’nın artan kuvvetleriyle çarpılır :
01AF = (15 * 1) + (10 * 16) + (1 * 256) + (0 * 4096) = 431
10’luk sistemde yazılmış bir sayıyı 16’lık sisteme çevirmek için 10 luk sistemden 2’lik sisteme yapılan
dönüşümlerdekine benzer şekilde sayı sürekli 16 ya bölünerek, kalanlar soldan sağa doğru yazılır.
Pratikte 16 lık sayı sistemlerinin getirdiği önemli bir avantaj vardır. Bu avantaj 16 lık sayı sistemi ile 2’lik sayı
sistemi arasındaki dönüşümlerin kolay bir şekilde yapılmasıdır.
16’lık sistemdeki her digit 2’lik sistemdeki 4 bit (1 Nibble) alan ile ifade edilebilir :
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
14
SAYI SİSTEMLERİ
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F
Örnek : 2ADFH sayısının (en sondaki H sayının hexadecimal olarak gösterildiğini anlatır yani sayıya ilişkin
bir sembol değildir) 16'lık sistemde ifadesi :
2 = 0010
A = 1010
D = 1101
F = 1111
Bu durumda 2ADFH = 0010 1010 1101 1111
2’lik sistemden 16’lık sisteme yapılacak dönüşümler de benzer şekilde yapılabilir :
Önce sayıları sağdan başlayarak dörder dörder ayırırız (en son dört eksik kalırsa sıfır ile tamamlarız.) Sonra
her bir dörtlük grup için doğrudan 16'lık sayı sistemindeki karşılığını yazarız.
1010 1110 1011 0001 = AEB1H
0010 1101 0011 1110 = 2D3EH
soru : 16'lık sayı sisteminde 2 byte'lık bir alanda yazılmış olan 81AC H sayısı pozitif mi negatif midir?
cevap : Sayının yüksek anlamlı biti 1 olduğu için, işaretli sayı sistemlerinde sayı negatif olarak
değerlendirilecektir. (1001 0001 1010 1100)
16 bitlik bir alanda ve işaretli sayı sisteminde -1 sayısını nasıl ifade edebiliriz :
Cevap : FFFF
8’lik sayı sistemi (octal numbering system)
Daha az kullanılan bir sayı sistemidir.
8 adet sembol vardır. (0 1 2 3 4 5 6 7)
8’lik sayı sisteminin her bir digiti 2’lik sistemde 3 bit ile ifade edilir.
001 1
010 2
011 3
100 4
101 5
110 6
111 7
8'lik sayı sisteminin de kullanılma nedeni, 2'lik sayı sistemine göre daha yogun bir ifade tarzı olması, ve ikilik
sayı sistemiyle, 8'lik sayı sistemi arasında yapılacak dönüşümlerin çok kolay bir biçimde yapılabilmesidir.

Kaynaklar şu an halen kullanımda olan yaklaşık 1000 - 1500 programlama dilinin varlığından

söz  ediyor.  Neden  bu  kadar  fazla  programlama  dili  var?  Bu  kadar  fazla  programlama  dili
olmasına  karşın  neden  halen  yeni  programlama  dilleri  tasarlanıyor?  Bir  programlama  dilini
diğerine ya da diğerlerine göre daha farklı kılan özellikler neler olabilir? Bir programlama dilini
tanımlamak  istesek  hangi  sıfatları  kullanabiliriz?  Programlama  dilleri  hakkındaki  bu  sorulara
yanıt  verebilmemiz  için  elimizde  değerlendirme  yapmamıza  olanak  sağlayacak  ölçütler
olmalıdır. Bu ölçütleri kısaca inceleyelim:

Verimlilik (efficiency)

Bu özelliğe programın hızlı çalışma özelliği diyebiliriz. Programın çalışma hızı pek çok faktöre
bağlıdır. Algoritmanın da hız üzerinde etkisi vardır. Çalışmanın yapıldığı bilgisayarın da doğal
olarak hız üzerinde etkisi vardır. Verimliliği bir programlama dilinde yazılmış bir programın hızlı
çalışması ile ilgili bir kavram olarak düşünebiliriz. Bu açıdan bakıldığında C verimli bir dildir.
Veri türleri ve yapıları (data types and structures)
Çeşitli  veri  türlerini  (tamsayı,  gerçek  sayı,  karakter...)  ve  veri  yapılarını  (diziler,  yapılar  vs.)
destekleme yeteneğidir. Veri yapıları, veri türlerinin oluşturduğu mantıksal birliklerdir. Örneğin
C ve Pascal dilleri veri yapıları bakımından zengin dillerdir.
Alt programlama yeteneği (Modularity)
Bir bütün olarak çözülmesi zor olan problemlerin parçalara ayrılması ve bu parçaların ayrı ayrı
çözümlenmesinden  sonra  parçalar  arasındaki  koordinasyonun  sağlanması  programada  sık
başvurulan bir  yöntemdir.  Bir  programlama  dili  buna  olanak sağlayacak araçlara  sahipse  alp
programlama  yeteneği  vardır  diyebilirriz.  Alt  programlama  yeteneği  bir  programlama  dilinin,
programı parçalar halinde yazmayı desteklemesi anlamına gelir. (C modülaritesi çok yüksek bir
dildir)
Alt  programlama  Yapısal  Programlama  tekniği'nin  de  ayrılmaz  bir  parçasıdır.  Alt
programlamanın   getirdiği  bazı  önemli  avantajlar  vardır.  Alt  programlar  kodu  küçültür.  Çok
tekrarlanan  işlemlerin  alt  programlar  kullanılarak  yazılması  çalışabilir  programın  kodunu
küçültür.  Çünkü  alt programlar  yalnızca  bir  kere  çalışabilir kod içine yazılırlar.  Ama program
kodu alt programın olduğu yere atlatılarak bu bölgenin defalarca çalıştırılması sağlanabilir.
Alt programlama algılamayı kolaylaştırır, okunabilirliği artırır. Alt programlama kaynak kodun
test edilebilirliğini artırır. Kaynak kodun daha kolay güncelleştirilmesi ve yeniden kullanılabilme
olanağını  artırır.  Alt  programlamanın  en  önemli  avantajlarından  biri  de   genel  amaçlı  kodlar
yazarak bu yazılan kodları birden fazla projede kullanabilmektir. (reusability)
C  alt  programlama  yeteneği  yüksek  bir  dildir.  C'de  alt  programlara  fonksiyon  denir.
Fonksiyonlar C Dili'nin yapıtaşlarıdır.
Yapısallık (structural programming support)
Yapısallık  bir  programlama  tekniğidir.  Bugün  artık  hemen  hemen  bütün  programlama  dilleri
yapısal  programlamayı  az  çok  destekleyecek  bir  şekilde  geliştirilmiştir.  Yapısal  Programlama
fikri  1960'lı  yıllarda  geliştirilmiştir.  Yapısal  programlama  tekniği  dört  ana  ilke  üzerine
kurulmuştur :

1. Böl ve üstesinden gel (divide and conquer)

Yapısal programlama tekniğinde, tek bir bütün olarak çözüm getirmek zor olan programlar,
daha  küçük  ve  üstesinden  daha  kolay  gelinebilecek  parçalara  bölünürler.  Bu  parçalar
fonksiyon, prosedür, subroutine, alt program vs. olarak isimlendiriler. Alt program yapısının
getirdiği avantajlar modularite konusunda yukarıda açıklanmıştır.

2. Veri gizleme (Data hiding)

Yapısal programlama tekniğinde, programın diğer parçalarından ulaşılamayan, yalnızca belli
bir faaliyet alanı olan, yani kodun yalnızca belli bir kısmında faaliyet gösterecek değişkenler
tanımlanabilir. Bu tür değişkenler genel olarak "yerel değişkenler" (local variables) olarak
isimlendirilirler.  Değişkenlerin  faaliyet  alanlarının  kısıtlanabilmesi  hata  yapma  riskini
azalttığı gibi, programların daha kolay değiştirilebilmesini  ve program parçalarının  başka
programlarda  tekrar  kullanabilmesini  de  sağlar.  Alt  programların,  ve  daha  geniş  şekliyle
modüllerin,  bir  işi  nasıl  yaptığı  bilgisi,  o  alt  programın  ya  da  modülün  kullanıcısından
gizlenir.  Kullanıcı  için  (client)  alt  programın  ya  da  modülün  işi  nasıl  yaptığı  değil,  ne  iş
yaptığı önemlidir.
3. Tek giriş ve Tek çıkış (single entry single exit)
Yapısal programlama tekniğini destekleyen dillerde her bir altprogram parçasına girmek için
tek bir giriş ve tek bir çıkış mekanizması vardır. Bu mekanizma programın yukarıdan aşağı
olarak akışı ile uyum halindedir. Program parçalarına ancak tek bir noktadan girilebilir.
4. Döngüler ve diğer kontrol yapıları.
Artık  hemen  hemen  kullanımda  olan  bütün  programlama  dilleri  az  ya  da  çok  Yapısal
Programlama  tekniğini  desteklemektedir.  Zira  bu  teknik  60'lı  yıllar  için  devrim
niteliğindeydi.

Esneklik (flexibility)

Esneklik  programlama  dilinin  programcıyı  kısıtlamaması  anlamına  gelir.Esnek  dillerde  birçok
işlem, hata yapma riski artmasına karşın rağmen kullanıcı için serbest bırakılmıştır. Programcı
bu  serbestlikten  ancak  yetkin  bir  programcıysa  bir  fayda  sağlayabilir.  Fakat  programcı
deneyimsiz ise bu esneklikten zarar görebilir.
Öğrenme ve öğretme kolaylığı (pedagogy)
Her  programlama  dilini  öğrenmenin  ve  öğrenilen  programlama  dilinde  uygulama
geliştirebilmenin   zorluğu  aynı  değildir.  Genel  olarak  programlama  dillerinin  seviyesi
yükseldikçe, öğrenme ve bu programlama dilini başkalarına öğretme kolaylaşır, öğrenme için
harcanacak  çaba  ve  zaman  azalır.  Bugün  yaygın  olarak  kullanılan  yüksek  seviyeli  programlı
dillerinin  bu  derece  popüler  olmasının  önemli  bir  nedeni  de  bu  dillerin  çok  kolay
öğrenilebilmesidir. Ne yazık ki C öğrenimi zor ve zahmetli bir dildir.

Genellik (generality)

Programlama  dillerinin  çok  çeşitli  uygulamalarda  etkin  olarak  kullanılabilmesidir.  Örneğin
COBOL mühendislik uygulamalarında tercih edilmez zaten ticari uygulamalar için tasarlanmıştır,
Clipper ya da FOXPRO veri tabanı dilleridir. Oysa PASCAL, BASIC daha genel amaçlı dillerdir. C
dili de bir sistem programlama dili olarak doğmasına karşın, güçlü yapısından dolayı, kısa bir
süre içinde, genel amaçlı bir dil haline gelmiştir.
Giriş / Çıkış (input / output, I / O facility) kolaylığı
Sıralı, indeksli ve rasgele dosyalara erişme, veritabanı kayıtlarını geri alma, güncelleştirme ve
sorgulama  yeteneğidir.  Veritabanı  programlama  dillerinin  (DBASE,  PARADOX  vs.)  bu
yetenekleri diğerlerinden daha üstündür ve bu dillerin en tipik özelliklerini oluşturur. Fakat C
giriş  çıkış  kolaylığı  kuvvetli  olmayan  bir  dildir.  C'de  veri  tabanlarının  yönetimi  için  özel
kütüphanelerin kullanılması gerekir.
Okunabilirlik (readability)
Okunabilirlik,  kaynak  kodun  çabuk  ve  iyi  bir  biçimde  algılanabilmesi  anlamına  gelen  bir
terimdir.  Kaynak  kodun  okunabilirliğinde  sorumluluk  büyük  ölçüde  programı  yazan  kişidedir.
Fakat  yine  verimlilik  de  olduğu  gibi  dillerin  bir  kısmında  okunabilirliği  güçlendiren  yapı  ve
mekanizmalar bulunduğu için bu özellik bir ölçüde dilin tasarımına da bağlıdır. En iyi program
kodu, sanıldığı gibi "en zekice yazılmış fakat kimsenin anlayamayacağı" kod değildir.
Birçok  durumda  iyi  programcılar  okunabilirliği  hiçbirşeye  feda  etmek  istemezler.  Çünkü
okunabilir  bir  program  kolay  algılanabilme  özelliğinden  dolayı  seneler  sonra  bile güncelleştirmeye olanak  sağlar.  Birçok  kişinin  ortak  kodlar  üzerinde  çalıştığı  geniş  kapsamlı
projelerde okunabilirlik daha da önem kazanmaktadır.
C  de  okunabilirlik  en  fazla  vurgulanan  kavramlardan  biridir.  Biz  de  kursumuz  boyunca
okunabilirlik  konusuna  sık  sık  değineceğiz  ve  C  programlarının  okunabilirliği  konusunda  bazı
temel prensipleri benimseyeceğiz.

Taşınabilirlik (portability)

Bir  sistem  için  yazılmış  olan  kaynak  kodun  başka  bir  sisteme  götürüldüğünde,  hatasız  bir
biçimde derlenerek, doğru bir şekilde çalıştırılabilmesi demektir.
Taşınabilirlik  standardizasyon  anlamına  da  gelir.  Programlama  dilleri  (ISO  International
Standard Organization) ve ANSI (American National Standard Institute) tarafından standardize
edilirler. 1989 yılında standartlaştırma çalışmaları biten C Dili, diğer programlama dillerinden
daha taşınabilir bir programlama dilidir.

Nesne Yönelimlilik (object orientation)

Nesne yönelimlilik de bir programlama tekniğidir.
Yapısal  programlama  Tekniği  1960  yılarında  gündeme  gelmişken,  Nesne  Yönelimli
Programlama Tekniği 1980'li yıllarda popüler olmuştur.
Bu  teknik  kaynak  kodların  çok  büyümesi  sonucunda  ortaya  çıkan  gereksinim  yüzünden
geliştirilmiştir. C dilinin geliştirildiği yıllarda, akla gelebilecek en büyük programlar ancak onbin
satırlar mertebesindeydi, ancak kullanıcıların bilgisayar programlarından beklentilerinin artması
ve grafik  arayüzünün  artık  etkin olarak kullanılmasıyla, bilgisayar  programlarının  boyutu  çok
büyümüş, yüzbin satırlarla hatta milyon satırlarla ölçülebilir hale gelmiştir.
Nesne  yönelimli  programlama  Tekniği,  herşeyden  önce  büyük  programların  yazılması  için
tasarlanmış  bir  tekniktir.  C  dilinin  yaratıldığı  yıllarda  böyle  bir  tekniğin  ortaya  çıkması  söz
konusu değildi, çünkü zaten programlar bugünkü ölçülere göre çok küçüktü.
Nesne yönelimli programlama Tekniğinin yaygın olarak kullanılmaya başlanmasıyla birlikte bir
çok  programlama  dilinin  bünyesine  bu  tekniğin  uygulanmasını  kolaylaştırıcı  araçlar  eklenek,
yeni  versiyonları  oluşturulmuştur.  Örneğin  C'nin   nesne  yönelimli  programlama  tekniğini
uygulayabilmek  için  Bjarne  Stroustrup  tarafından  geliştirilmiş  haline  C++  denmektedir.  C++
dili C dili baz olarak alınıp, geliştirilmiş yeni bir programlama dilidir. C++ dilini iyi öğrenebilmek
için öncelikle C dilini çok iyi öğrenmek gerekir.
Pascal diline eklemeler yapılarak Delphi dili, Cobol dilinden yenilemesiyle OOCobol, Ada dilinin
yenilenmesiyle ise ADA 95 dilleri geliştirilmiştir.
Bazı  programlama  dilleri  ise  doğrudan  N.Y.P.T'ni  destekleyecek  şekilde  tasarlanarak
geliştirilmiştir.  Örneğin  JAVA  dili  C++  dilinin  basitleştirilmiş  biçimi  olup  daha  çok  Internet
uygulamalarında kullanılmaktadır. Başka bir örnek olarak da Eiffel dili verilebilir


Uygulama Alanlarına Göre Sınıflandırma

1. Bilimsel ve mühendislik uygulama dilleri:
Pascal,  C  (C  programlama  dili  üniversitelerdeki  akademik  çalışmalarda  da  yoğun  olarak
kullanılıyor.), FORTRAN
2. Veri tabanı dilleri:
XBASE, (Foxpro, Dbase, CA-Clipper), Oracle Forms, Visual Foxpro.
3. Genel amaçlı programlama dilleri:
Pascal, C, Basic.
4. Yapay zeka dilleri:
Prolog, Lisp.
5. Simulasyon dilleri
GPSS, Simula 67
6. Makro Dilleri (Scripting languages)
awk, Perl, Python, Tcl, JavaScript.
7. Sistem programlama dilleri:
Sembolik makine dilleri, BCPL, C, C++, occam.
Günümüzde sistem yazılımların neredeyse tamamının C dili ile yazıldığını söyleyebiliriz.
Örnek vermek gerekirse UNIX işletim sisteminin % 80'i C dili ile geri kalanı ise sembolik
makine  dili  ile  yazılmıştır.  Bu  işletim  sistemi  ilk  olarak  BELL  labaratuarlarında
oluşturulmuştur.  Kaynak  kodları  gizli  tutulmamış,  böylece  çeşitli  kollardan  geliştirilmesi
mümkün olmuştur. Daha sonra geliştirilen UNIX bazlı işletim sistemi uygulamalarına değişik
isimler verilmiştir. 4C bilimsel ve mühendislik alanlarına kullanılabilen genel amaçlı bir sistem programlama dilidir.




FORTRAN dili  (FORmula  TRANslator)  kompleks  matematiksel  hesaplamalar  gerektiren
mühendislik  ve  bilimsel  uygulamalarda  kullanılmak  üzere  1954  -  1957  yılları  arasında  IBM
firması  için  John  Backus  tarafından  geliştirilmiştir.  FORTRAN  dili,  yoğun  matematik
hesaplamaların  gerektiği  bilimsel  uygulamalarda  halen  yaygın  olarak  kullanılmaktadır.
FORTRAN dilinin FORTRAN IV ve FORTRAN 77 olmak üzere iki önemli versiyonu bulunmaktadır.
Doksanlı yılların başlarında FORTRAN - 90 isimli bir versiyon için ISO ve ANSI standartları kabul
edilmiştir. FORTRAN dili 3. seviye dillerin en eskisi kabul edilmektedir.

COBOL (COmmon  Business  Oriented  Language)  1959  yılında,  Amerika'daki  bilgisayar
üreticileri,  özel  sektör  ve  devlet  sektöründeki  bilgisayar  kullanıcılarından  oluşan  bir  grup
tarafından  geliştirilmiştir.  COBOL'un  geliştirilme  amacı  veri  yönetimi  ve  işlemenin  gerektiği
ticari  uygulamalarda  kullanılacak  taşınabilir  bir programlama  dili  kullanmaktır. COBOL  dili  de
halen yaygın olarak kullanılmaktadır.

ALGOL (The  ALGOritmick  Language)  1958  yılında  Avrupa'da  bir  konsorsiyum  tarafından
geliştirilmeye başlanmıştır. IBM Firması FORTRAN dilini kendi donanımlarında kullanılacak ortak
programlama  dili  olarak  benimsediğinden,  Avrupa'lılar  da  alternatif  bir  dil  geliştirmek
istemişlerdi. ALGOL dilinde geliştirilen bir çok prensip modern programlama dillerinin hepsinde
kullanılmaktadır.
60'lı  yılların  başlarında  programlama  dilleri  üzerinde  yapılan  çalışmalar  yapısal  programlama
kavramını gündeme getirmiştir. Bu dillerden bazılarına kısaca göz atalım:

PASCAL dili  1971  yılında  akademik  çevrelere  yapısal  programlama  kavramını  tanıtmak  için
Profesör Niclaus Wirth tarafından geliştirilmiş (Dilin yaratıcısı, dile matematikçi ve filozof Blaise
Pascal'ın ismini vermiştir.) ve bu dil kısa zaman içinde üniversitelerde kullanılan programlama
dili haline gelmiştir.
Pascal  dilinin  ticari  ve  endüstriyel  uygulamaları  desteklemek  için  sahip  olması  gereken  bir
takım  özelliklerden  yoksun  olması  bu  dilin  bu  uygulamalarda  fazla  kullanılmamasına  yol
açmıştır. Modula ve Modula-2 dilleri Pascal dili baz alınarak geliştirilmiştir.


BASICdili 1960'lı yılların ortalarında John Kemeney ve Thomas Kurtz tarafından geliştirilmiştir.
Her ne kadar BASIC isminin "Beginner's All_purpose Symbolic Instruction Code" sözcüklerinin
baş harflerinden oluşturulduğu söylense de, bu sözcüklerin daha sonradan uydurulduğu açıktır.
Yüksek seviyeli dillerin en eski ve en basit olanlarından biridir.Tüm basitliğine karşın, bir çok
ticari  uygulamada  kullanılmıştır.  BASIC  dili  de  ANSI  tarafından  standartlaştırılmıştır.  Ancak
BASIC  dilinin  ilave  özellikler  içeren  bir  sürü  versiyonu  söz  konusudur.  Örneğin  Microsoft
firmasının  çıkarttığı Visual Basic  diline   Nesne  Yönelimli Programlamaya ilişkin  birçok özellik
eklenmiştir. Ayrıca BASIC dilinin bazı versiyonları uygulama programlarında (Örneğin MS Excel
ve  MS  Word'de)  kullanıcının  özelleştirme  ve  otomatikleştirme  amacıyla  yazacağı  makroların
yazılmasında kullanılan programlama dili olarak da genel kabul görmüştür.
ADA dili ise Amerikan Savunma Departmanı (Department of Defence -DoD) desteği ile 70 li
yıllar  ve  80'li  yılların  başlarında  geliştirilmiştir.  Dod  dünyadaki  en  büyük  bilgisayar
kullanıcılarından  biridir.  Bu  kurum  farklı  yazılımsal  gereksinimleri  karşılamak  için  çok  sayıda
farklı programlama dili kullanıyordu ve tüm gereksinmelerini karşılayacak bir dil arayışına girdi.
Dilin tasarlanması amacıyla uluslararası bir yarışma düzenledi. Yarışmayı kazanan şirket (CIIHoneywell  Bull  of  France)  Pascal  dilini  baz  olarak  alan  çalışmalar  sonucunda  Ada  dilini
geliştirdi. Ada dilinin dökümanları 1983 yılında yayımlanmıştır.(Ada ismi, şair Lord Byron'un kızı
olan Lady Ada Lovelace'ın isminden alıntıdır. Ada Lovelace delikli kartları hesap makinalarında
ilk olarak kullanılan Charles Babbage'in yardımcısıydı. Charles Babbage hayatı boyunca "Fark
makinası" (Difference Engine) ve "Analitik Makine" (Analytical Engine) isimli makinaların yapımı
üzerinde  çalıştı  ama  bu  projelerini  gerçekleştiremeden  öldü.  Yine  de  geliştirdiği  tasarımlar
modern bilgisayarların atası kabul edilmektedir. Ada Lovelace Charles Babbage'ın makinası için
delikli kartları ve kullanılacak algoritmaları hazırlıyordu. Bu bayanın 1800'lü yılların başında ilk
bilgisayar  programını  yazdığı  kabul  edilmektedir.)  Ada  dili  genel  amaçlı  bir  dildir,  ticari
uygulamalardan  roketlerin  yönlendirilmesine  kadar  birçok  farklı  alanda  kullanılmaktdır.  Dilin
önemli  özelliklerinden  bir  tanesi  gerçek  zaman  uygulamalarına  (real-time  applications  /
embedded  systems)  destek  vermesidir.  Başka  bir  özelliği  de  yüksek  modülaritesi  nedeniyle
büyük programların yazımını kolaylaştırmasıdır. Ancak büyük ve karmaşık derleyicilere ihtiyaç
duyması, C, Modula-2 ve C++ dillerine karşı rekabetini zorlaştırmıştır.
Çok  yüksek  seviyeli  ve  genellikle algoritmik yapı içermeyen  programların görsel  bir ortamda
yazıldığı  diller  ise  4.  kuşak  diller  olarak  isimlendirilirler.  Genellikle  4GL  olarak  kısaltılırlar.
(fourth generation language).  İnsan  algısına  en  yakın  dillerdir.  RPG dili 4.  kuşak  dillerin ilki
olarak  kabul  edilebilir.Özellikle  küçük  IBM  makinalarının  kullanıcıları  olan  şirketlerin,  rapor
üretimi için basit bir dil istemeleri üzerine IBM firması tarafından geliştirilmiştir.

Programlama dillerini seviyelerine göre 5 ana gruba ayırabiliriz:
1. Çok yüksek seviyeli diller ya da görsel diller (visual languages):
Access, Foxpro, Paradox, Xbase, Visual Basic, Oracle Forms.
2. Yüksek seviyeli diller (Bunlara algoritmik diller de denir):
Fortran, Pascal, Basic, Cobol.
3. Orta seviyeli programlama dilleri:
Ada, C. Orta seviyeli diller daha az kayıpla makine diline çevrilebildiğinden daha hızlı çalışır.
4. Alçak seviyeli programlama dilleri:
Sembolik makine dili (Assembly language).
5. Makine dili:
En aşağı seviyeli programlama dili. (Saf makine dili tamamen 1 ve 0 lardan oluşuyor.)