PROGRAMLAMA DİLLERİ

Program bir bilgisayar sistemine yapması gereken işleri tam olarak tanımlamaya yarayan tanımlar kümesidir. Bu programların yazım kurallarına da programlama dili denir. Doğal dillerde olduğu gibi programlama dillerinin de kuralları vardır. Doğal dillerin aksine bu kurallardan en küçük bir sapma yapıldığında bile program çalışmaz [1].

 

Bu nedenle program yazma işleminin hızlı ve verimli olabilmesi ve sonuçta ortaya çıkan programın hatasız çalışabilmesi için programın yazımında bazı kurallara uyulması gerekir[1].

Örneğin kullanılmakta olan Windows işletim sistemi on binlerce sayfa, milyonlarca bilgisayar kodunun bir araya gelmesinden oluşur. İşte işin tüm zorluğu, o kodların arasında dolaşan, hata mesajlarını günlerce kodları gözden geçirerek arayan, sandalye tepesinde saatlerce aynı ekrana bakarak ilginç görüntüler sergileyen programcıların üzerindedir [2]..

Program yazarken dil seçimi, yazılacak programın niteliğine göre yapılmalıdır. Örneğin bir muhasebe programı yazmak için seçilen dil, bazı matematik programlarının yazılması için uygun olmayabilir[3].

1-      PROGRAMLAMA DİLLERİNİN ÖZELLİKLERİ

Çok sayıda değişik programlama dili bulunmakla beraber hepsinde bilgisayarın işlemlerini yönetmeye yönelik fonksiyonlara karşılık gelen komutlar mevcuttur. Bu komutları şu şekilde özetleyebiliriz.

  • Giriş / Çıkış Komutları: Bu komutlar, bilgisayara verileri almalarını ve sonuçlarını sergilemelerini belirtir. Verilen veri, çıktıların yönlendirildiği cihazlar bu komutlarda belirtilir.
  • Hesaplama Komutları: Bu komutlar, temel matematik işlemlerini yapmaya yarayan komutlardır.
  • Kontrolün Yönlendirilmesi İçin Kullanılan Komutlar: Bu komutlar, programın normal komut akışından sapabilmek için kullanılır. Program komutları normal olarak sırayla çalıştırılır. Bu sıranın herhangi bir nedenle dışına çıkılmak istendiğinde kontrol komutları kullanılarak kontrol başka bir adrese transfer edilir.
  • Verilerin Bilgisayar İçinde Taşınması, Saklanması ve Geri Çağrılmasına Yönelik Komutlar: Bu komutlar, verileri çeşitli bellek adresleri arasında olduğu kadar diskle bellek arasında da hareket ettirmek amacıyla kullanılır [1].

Programlama dillerinin en önemli özelliklerinden birisi makineden bağımsız olabilmeleridir. Programların taşınabilirliği olarak da adlandırılan bu özellik programın geliştirildiği bilgisayardan başka bir bilgisayarda da çalışabilmesi anlamına gelir [1].

Taşınabilirlik çok değişik kapasite ve özellikleri bulunan bir yığın bilgisayarın bulunduğu günümüzde oldukça önemli bir kavram haline gelmiştir. Bir programın taşınması sırasında çeşitli sorunlar ile karşılaşılmaktadır. Merkezi işlemcinin aritmetik yetenekleri ve kullandığı kelime uzunluğu, taşınabilirliğin önündeki en önemli engellerdir. Bunlara ek olarak değişik makineler değişik karakter kodları(ASCII veya EBCDIC gibi) kullanabilmektedirler[1].

Programların geliştirildiği makine dışındaki makinelerde yeniden derlenip çalışması için bazı düzeltme ve ayarlamalar yapılması gerekir. Diğer bir sorunda bazen aynı tür makinede, aynı dilin değişik derleyicilerinin, programları değişik yorumlamasıdır. Örneğin, C dili kullanılarak yazılan programlarda zaman zama derleyiciye özgü komutlar bulunabilmekte ve bunların kullanılması taşınabilirliği etkilemektedir [1].

Tüm bu sorunlara rağmen günümüzde kullanılan 3. nesil diller makineden bağımsız olarak nitelendirilebilir. Bu amaca kısmen de olsa ulaşılmış olmanın yanında, bilgisayar bilimlerindeki çalışmalar ve gelişmeler sonucu, yeni dillerden beklenenler makineden bağımsız çalışmanın çok ötesine geçmiştir [1].

2-      PROGRAMLAMA DİLİ SINIFLANDIRMALARI

Bir algoritmanın doğrudan doğruya makine diline çevrilmesi ile elde edilen programlarla karmaşık işler yapabilen yazılımların geliştirilmesi neredeyse imkansızdır. Makine dilinin insan beyni ile izlenemeyecek detayları içermesi, karmaşık algoritmaları doğrudan bu dille ifade edebilmemizi çok  zorlaştırmaktadır. Algoritmalardaki kavramsal adımları makine diline çevirebilmek için birçok ara dil geliştirilmiştir. Bu diller, programcıya saklayıcılar, bellek adresleri, makine döngüsü gibi donanımla ilgili detaylar arasında kaybolmadan programlama olanağı sağlarlar. Aşağıda, sözü edilen programlama dillerini sınıflayacağız [1]:

2-1-Geleneksel Sınıflandırma

Çok yüksek seviyeli diller : VisualBasic, Paradox, Acces , Foxpro …
Yüksek seviyeli diller: Pascal ,Basic ,Fortran…
Orta seviyeli diller: C ,C++, C# , Java ,ADA…
Düşük seviyeli diller: Assembly…
Makina dilleri: Bilgisayarın çalışma dilleri 1 ve 0’lardan oluşur…

Makine dilleri dışında üretilen programların makine tarafından yürütülebilmesi için mutlaka makine dillerine çevrilmesi gerekir. Yazılan programın programcı tarafından geliştirilmiş orijinal haline kaynak kodu (source code), makine diline çevrilmiş haline ise nesne kodu (object code) adı verilir.

1-      Makine Dilleri

Makine dili mikroişlemci ya da mikro denetleyici gibi komut işleme yeteneğine sahip entegrelerin işleyebilecekleri komutlardan ve buna uygun söz diziminden oluşan dile verilen addır. Makine dili, işlemcinin verilen komutlar doğrultusunda çalıştırılmasını sağlayan ve işlemci mimarisine göre değişen en alt seviyedeki programlama dilidir. Bu dil sadece 0 ve 1 binary ikililerinin anlamlı kombinasyonlarından meydana gelmektedir. Bu nedenle, makine dilinin anlaşılması çok güçtür [4].

Örneğin: 1 0011 0111 gibi 9 bitlik bir wordu düşünecek olursak burada sol baştaki 1 biti indirect adresleme yapıldığını, bu bitten sonraki 4 bit olan 0011 çarpma işleminin yapılması gerektiğini geriye kalan 4 bit 0111 ise hafızanın 0111 adresine gidilmesi gerektiğini belirtebilmektedir. Bu düzen tabi ki farklı işlemci mimarileri için farklı olacaktır [4].

 

Makine diline çevrilmiş bir komut iki parçadan oluşur;

  • Operatör: Herhangi bir komuta karşılık gelen işlemin kodudur.
  • Operand: Üzerinde işlem yapılan yani işlenen veriyi ya da verinin adresini tutan koddur. Bazı komutlarda operand bulunmayabilir [1].

2-Düşük Seviyeli Diller (Assembly)

Assembly dili karmaşık programlar yazmak için kullanılan düşük seviyeli bir programlama dilidir. Assembly insanlar tarafından anlaşılması zor olan makina dilinin sayısal ifadelerini, insanlar tarafından anlaşılarak programlanması daha kolay olan alfabetik ifadelerle değiştirerek düşük seviyede programlama için bir ortam oluşturur. Assembly kullanmanın amacı, ilk bilgisayarlarda yazılan programların daha az hata içermesi ve daha az zaman almasını sağlamaktır.

Assembly dilini makina koduna çeviren programlara assembler denir. Bir assembler’ı derleyiciden ayıran en önemli özellik bire bir dönüşüm yapmasıdır. Derleyiciler kodun tamamını okurlar ve kodun tamamını anlamlı bir programa dönüştürürler. Kodun her satırını tek tek okuyan ve uygulayan programlara ise yorumlayıcı denir.

Assembly dilinde yazılmış programlar, genellikle platformdan bağımsız yüksek seviyeli diller ile yazılmış programlara karşın belli bir işlemci mimarisi hedef alınarak yazılmıştır. Çünkü assembly ile yazılmış bir kod bire bir işlemci ile konuşur. Bu nedenle ortaya yazımı çok zahmet gerektiren bir kod çıkar. Ancak program gereksiz kodlar içermediğinden çok daha yüksek performanslarda çalışabilir.

Assembly, bilgisayar biliminin gelişimi süresince geniş alanlarda kullanılmıştır. Ancak günümüzde yüksek seviyeli dillerin yaygınlaşması ile daha seyrek kullanılan bir araç haline gelmiştir. Genellikle donanımla bire bir ilişki kuracak kod parçaları yazmak için ya da beklenmedik performans sorunlarını çözmek için kullanılmaktadırlar. Çoğunlukla kodlanan programlar donanım sürücüleri, gömülü sistemler ve gerçek zamanlı uygulamalardır. Bu uygulamalar yüksek hız ve performans gerektirdiğinden, Assembly ile programlanmaktadırlar [5].

3-Orta Seviyeli Diller

Doğal dillere ve matematik işlemlere makine dili ve Assembly’e göre daha yakındırlar. En önemli tarafı ise üst düzey dillerin makinelerden bağımsız olarak çalışmalarıdır.

Bu diller kullanılarak yazılan programların makine diline çevrilmesi gerekir. Çevirme işlemi için bazı diller derleyiciler kullanır ve tüm kod aynı zamanda makine diline çevrilir. Bazı diller yorumlayıcılar kullanır. Yorumlayıcılar her bir satırı önce makine diline çevirir, sonra çalıştırır ve bir sonraki komuta geçer.

C, Java, C++ orta seviyeli programlama dillerine örnek olarak verilebilir.

 

 

4- Yüksek Seviyeli Diller

1960’larda yaygınlaşmıştır. 3.kuşak dillerde denir. İngilizceye benzer ifadelerin kullanıldığı, aritmetik işlemlerde kullandığımız işaretlerin kullanıldığı, daha hızlı ve kolay program yazmayı sağlayan, programcının daha az çaba sarfettiği dillerdir Çok sayıda dil geliştirilmiştir: Pascal, Fortan, Cobol, Algol, vb. Bu dillerin ifadeleri derleyici tarafından makine diline çevrilirler. Bu kuşak dillere “procedural” diller denmektedir. Bunun nedeni bu dillerle çözümün “nasıl” yapılacağını ayrıntılı olarak bildirmemizdir[6].

5- Çok Yüksek Seviyeli Diller

4. kuşak dillerde denir. 3. kuşak bir diller onlarca yüzlerce satır halinde kodlanan bir pogram, 4.kuşak dillerle birkaç satırda ifade edilir. Çünkü bu dillerle sadece “NE” istediğimizi bildiririz, 3. kuşak dillerde olduğu gibi “NASIL” yapılacağını söylemeyiz. Örnek olarak LISP, SNOBOL, FORTH, SQL verilebilir. Bilindiği gibi SQL ilişkisel (“relational”) veri tabanı sistemlerinde yaygın olarak kullanılan sorgulama dilidir (“query language”) [5].

Çok yüksek seviyeli diller genellikle içinde;

 

  • Editör
  • Rapor çıkarıcı
  • Veri tabanı yaratıcısı
  • Hata bulucuların yer aldığı paketler halinde satılır.

 

2-2- Programlama Paradigmaları

Yukarıdaki bölümde programlama dillerini sınıflandırırken tarihi gelişimlerini ve doğal dillere olan yakınlıklarını esas aldık. Oysa ki programlama dilleri geliştirilirken çeşitli ihtiyaçlar ve bu ihtiyaçlara cevap veren kavram ve kuralların geliştirilmesi söz konusudur. Bu bölümde, yukarıda belirlediğimiz programlama dillerinin gelişimi sırasında temel kuralların programlama dillerine nasıl yansıdığına bakıp bu dilleri değişik kategorilerde sınıflandırmaya çalışacağız[1]

A ) İmperatif Diller:

İmperatif programlama dilleri geleneksel programlama kavramları üzerine kurulmuştur. Özellikleri, durum ve bu durumları değiştirecek komutlara dayalı olmasıdır. Burada durum bir dizi değişkenin değeri ve o andaki program kontrolünün bilgisayar belleğinde bulunduğu yer olarak nitelendirilebilir. Bir başka deyişle, durum programda kullanılan değerler ile bellek arasındaki mantıksal ilişkidir.

Bu dillerde, program mantığının geliştirilmesi ve programın çalışması sırasındaki kontrol işlemleri programcının sorumluluğundadır. Programda sonuçların tam olarak nasıl elde edileceği açıkça tanımlanmalıdır. Programın çalışması sırasında değişkenlerin isimleri değiştirilebilir. Programın hangi sırada çalışacağı, hangi komutların hangilerinden önce çalıştırılacağı önem taşır[1].

Pascal, C, ADA imperatif dillerin örnekleridir.

 

B) Deklaratif Diller

Dekleratif diller programcıya programın mantığını, yani ulaşmak istediği hedef üzerine odaklanma olanağı sağlar. Bu diller nelerin hesaplanacağını belirleyen tanımlar veya denklemlerden oluşmuştur. Hesaplamanın nasıl yapılacağı ise programcı tarafından belirlenen bir husus değildir.

Yukardaki açıklamadan da anlaşılacağı gibi, çok genel amaçlı bir dekleratif dil geliştirmek verimli olmayabilir. Bu nedenle, dekleratif diller özel amaçlar için geliştirilmekte ve bu amaca yönelik hesaplamaları veya benzetimleri yapmakta kullanılmaktadırlar.

Dekleratif dillerde, bir değişken yalnızca bir kez tanımlanabilir. Bu tanım programın akışı içerisinde değiştirilemez. Veri yapıları açıkça tanımlanmalıdır. Programdaki tanımların ve ilişkilerin hangi sırada çalıştırıldığı önem taşımaktadır [1].

PROLOG dekleratif dillere örnektir.

C) Fonksiyonel Diller

Fonksiyonel dillerde terimler komutlar yerine fonksiyonlardan oluşmuştur. Bu yaklaşım programcıları komutları belli bir sırada dizme zorunluluğundan kurtarıp onlara daha kavramsal düşünebilme olanağı sağlar. Fonksiyonlar kullanıldığı zaman belli bir görevi yerine getirecek fonksiyon ve bu fonksiyonun gereksinim duyduğu parametreler tanımlanır. Daha sonra, bu fonksiyon parametreler tanımlanarak çağırılır ve istenen görev çalıştırılmış olur. LISP önemli fonksiyonel dillerdendir [1].

D) Nesneye Dayalı Diller

Nesneye dayalı dillerde veriler, komutların veya fonksiyonların üzerlerinde işlem yaptığı pasif elemanlar olmaktan çıkıp, çevreleri ile ilişki kurabilen nesneler olarak tanımlanırlar. Bu ilişki mesaj gönderilerek kurulmaktadır. Bu tür dillerde, nesneleri altında toplayan sınıflar, bu nesneler üstünde yapılacak işlemleri belirleyen yöntemler gibi tanımlar bulunmaktadır. Bu diller, veriler üzerinde yapılan işlemleri kullanıcıdan saklayarak verileri belli komutları alan ve bunun karşılığında kendi içlerinde bazı değişiklikler yapan ve sadece sonuçları kullanıcıya yansıtan nesneler olarak tanımlar. Bir başka deyişle veriler pasif listeler olarak değil, listeler ve bu listelerin üzerinde yapılabilen işlemlerle birlikte saklanır[1].

C++ en yaygın bilinen nesneye dayalı dildir.

3-PROGRAMLAMA KAVRAMLARI

Bu bölümde değişken, fonksiyon, yordam gibi kavramların tanımlarını yapacağız.

3-1- Programlarda Kullanılan Araçlar

  • Değişkenler: Program içinde programcı tarafından tanımlanan nesnelere verilen isimdir.

ÖR/  A=2*X

olarak tanımladığımız zaman, A, X değişkenine bağımlı bir değişken olarak tanımlanmış olur. A ve x için program içinde değişik değerler atanabilir. Keza, aşağıdaki örnekte N bir tamsayı olarak tanımlanmakta, bir sonraki satırda ise N’e bir değer atanmaktadır. Burada örnek olarak Pascal formatı kullanılmıştır.

var N: integer;

N:= 35

  • Sabitler: programın bir yerinde bir değer atanan ve programın çalışması süresince aynı değerde kalan nesnelerdir. Örneğin;

constant M =50;

şeklinde yapılan bir tanımlamadan sonra M programın çalışması süresince her kullanıldığı yerde 50 değerini alacaktır.

  • Literaller: Bir değerin karakter olarak gösterimidir. Yukarıda M sabitine 50 değeri atanmıştır ve’50’ bu değerin literal olarak karşılığıdır. Literallerin kullanılması programcılar arasında zaman zaman kötü bir programlama yaklaşımı olarak nitelendirilmektedir.

3-2- Veri Tipleri:

Programlama dilleri çeşitli işleri yapabilmek için kullanılacak veri türlerini ve bu türler üzerinde yapılabilecek işlemleri tanımlar. En yaygın olarak kullanılan veri türleri tamsayılar (integer), gerçek sayılar (real) ve kayan noktalı sayılar (floating point) olarak sayılabilir. Bunlara ek olarak programlama dillerinde karakterleri ve kelimeleri ifade etmek üzere veri türleri tanımlanmıştır. Ayrıca mantıksal (boolean) veri türü olarak tanımlana ve genellikle ikili değerler alan veri türlerinden karşılaştırma yapmak için kullanılan komutlarda yararlanılmaktadır.

Yukarıdaki açıklamalardan yola çıkarak, veri türleri üç başlık altında toplanabilir.

  • Sayılar,
  • Mantıksal veriler
  • Karakterler

 

 

 

 

 

JAVA programlama dilinde kullanılan veri türleri

Değişken Türü
Türkçe karşılığı
Bit büyüklüğü Sınır Değerleri
boolean Mantık değişkeni 1 true(doğru) , false(yanlış)
char harf değişkeni 16 ‘\u0000’ den ‘\uFFFF’
byte tam sayı değişkeni 8 -128 den 127 e
short tam sayı değişkeni 16 -32768 den 32767 e
int tam sayı değişkeni 32 -2157483648 den 2147483647 e
long tam sayı değişkeni 64 -9223372036854775808 den  9223372036854775808 e
float Gerçek sayı değişkeni 32 -3.40292347e+38 den 3.40292347e+38 e
double Gerçek sayı değişkeni 64 -1.7976931348623157e+308 den 1.7976931348623157e+308 e

3-3- Veri Yapıları:

Veri yapısı, verinin hafızada saklanma şekli ve organizasyonu olarak tanımlanabilir. Veriler, veri tiplerine göre hafızada farklı şekillerde tutulabilirler. Örneğin işaretli olmayan pozitif bir sayı ikili (binary) olarak tutulur. İşaretli sayılar 2’ye tümleyen yapısında, harfler ASCII karekterler olarak tutulurlar.

Veriye farklı yollardan ulaşma isteği farklı organizasyonların yapılmasını beraberinde getirmektedir. Örneğin hafızada her biri 4 byte yer kaplayan 100 adet tam sayı

  • Sırasız
  • Sıralı (örn küçükten büyüğe doğru)
  • Ağaç yapısı

olmak üzere üç farklı şekilde organize edilmiş olabilir.

Organizasyonun yapısına göre veriye ulaşma yolu da değişir. Veriler içinden sadece ortalamanın bulunması gereken bir durumda bilgilerin sıralı olması önemli değildir. Ancak arama yapılmak istendiğinde verilerin sıralı olması gereklidir. Eğer mevcut verilere ekleme veya çıkartma yapılmak istenirse, ağaç yapısının kullanılması daha uygundur. Görüldüğü gibi veriye ulaşma şekline göre organizasyon değişmektedir.

İyi bir organizasyon yapılabilmesi için amaçlananlar:

  • Hafızanın en iyi şekilde kullanılması, verinin çok fazla yer kaplamamasını sağlayacak şekilde organize edilmesi,
  • Verinin oluşturulması, ekleme/çıkartma yapılması, arama yapma veya bilgi çekme gibi ulaşım stilleri için verimli algoritmalar sunmasıdır.

 

Organizasyon yapısı mevcut durumdaki önemli kriterlere göre de değişim gösterir. Hafızanın etkin olarak kullanılması gereken bir durumda hız göz ardı edilebilirken, hız daha önemli ise, hafızada çok yer kaplayan bir organizasyon tercih edilebilir[6].

3-4- Atama İfadeleri:

Atama ifadeleri, bir değişkene bir değer atamak için kullanılan ifadelerdir. En yaygın olarak kullanılan programlama araçlarıdır. Özellikle imperatif ve nesne tabanlı dillerde, atama ifadeleri çok yaygın olarak kullanılır. Genel yapıları;

değişken adı <atama ifadesi> (değer veya işlem)

şeklindedir.

Atama ifadesi değişik dillerde değişik şekilde olabilir. Mesela Pascal’da atama ifadesi “:=” iken C’de “=” dir.

A=b*c

ifadesi C dilinde, A değişkenine b ile c nin çarpımının atandığını ifade etmektedir. Bu ifadeler daha karmaşık şekillerde alabilirler ve bu durumda değişik sonuçlar ortaya çıkabilir. Örneğin;

y=a*b+c/d              (a=3; b=4; c=4; d=2)

ifadesinin sonucu işlemlerin yapılma sırasına bağlı olarak değişik değerler alabilir. Bu karışıklığı önlemek için operatörlerin öncelik sıraları belirlenmiştir. Buna göre çarpma ve bölme, toplama ve çıkarmadan önce yapılır. Bu kural uygulandığı takdirde bu işlemin sonucu 14 olacaktır. Bu yaklaşıma operatör öncelikleri denir.

3-5- Kontrol İfadeleri

Kontrol ifadeleri programın akışını etkileyen ve normal akış sırasını değiştirebilen ifadelerdir. Bunlardan en yaygın olarak bilineni, ama kullanımı en fazla eleştirileni goto ifadesidir. Bu ifade kullanılarak program değişik noktalara aktarılabilir. Eleştirme nedenlerinin bir tanesi programın okunabilirliğini zorlaştırması bir diğeri de programı verimsiz hale getirmesidir. Dolayısıyla, günümüz programcıları bu ifadenin kullanılmasına sıcak bakmamaktadırlar.

Bunun yerine if then else komutu sıkça kullanılmaktadır. Bu ifadede mantıksal bir değişkenin değeri test edilmekte ve sonuç doğru ise program akışı bir yöne yanlış ise ayrı bir yöne gitmektedir. Aşağıdaki örnek bu söylenenleri açıklamaktadır[1].

Konuyla ilgili slayt dosyasına ulaşmak için tıklayınız.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Close
Join me: