Programlama Dilleri ve Tarihi

Programlama Dilleri

Yazılım kelimesi bilgisayar programlama dilleriyle oluşturulan dokümanları, dosyaları ifade eder. Yani bilgisayarınızda işletilmek, çalıştırılmak üzere tasarımlanmış dosyalar yazılım kapsamına girer.

Bu dosyalar nasıl yapılır?

Yazılım programlama dilleri ile tasarlanır ve yazılır, programlama dili de nedir derseniz. Programlama dilleri, bilgisayarınızın donanımını(ekran kartı, ses kartı, modem, mouse, klavye…) sizin en rahat biçimde kullanabileceğiniz düzeye getirmeye çalışır. Yani bilgisayarın o soğuk 1010110 gibi rakamlarını sizin zevkle kullandığınız programlara, işletim sistemlerine, oyunlara çevirir.

Örneğin kullanılmakta olan Windows işletim sistemi onbinlerce 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…

Bilgisayar programcıları işini zevkle yapan ve işini bir hobi edinmiş insanlardan oluşur, en azından öyle olmalı. Aksi halde yoğun konsantrasyon ve sabır isteyen bu işi yapmak aşırı zorlaşır[3].

 

Bir işi bilgisayara yaptırmak ancak belirli kodların belirli bir sıra doğrultusunda kullanılması ile olanaklıdır. Kullanılan bu koda programlama dili denilir[2].

 

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.

 

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].

 

1945 yılından itibaren yıllar boyunca beş nesil programlama dili geliştirilmiştir. Bunlar:

 

Birinci nesil, 1945 – makine dili

İkinci nesil, 1955’ler – çevirici dil

Üçüncü nesil, 1960 başları – yüksek düzey diller (yordamsal diller)Örneğin, COBOL, BASIC, C.

Dördüncü nesil, 1970 başları – çok yüksek düzey diller (soruna-yönelik diller): Örneğin, SQL, FOCUS.

Beşinci nesil, 1980 başları – doğal diller[5].

 

Programlama Dillerinin Özellikleri

 

Çok sayıda programlama dili bulunmakla beraber hepsinde bilgisayarın işlemlerini yönetmeye yönelik temel fonksiyonlara karşılık gelen komutlar mevcuttur. Bu komutları aşağıdaki gibi özetleyebiliriz.

 

1        Giriş / Çıkış komutları

Bu komutlar, bilgisayara verileri almalarını ve sonuçlarını sergilemelerini belirtir. Verilerin yeri, çıktıların yönlendirildiği cihazlar bu komutlarda belirtilir.

 

2        Hesaplama komutları

Bu komutlar, temel matematik işlemleri yapmaya yarayan komutlardır.

 

3        Veri yönetim komutları

Bu komutlar, verileri çeşitli bellek adresleri arasında olduğu kadar disk bellek arasında da hareket ettirmek amacıyla kullanılır.

 

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

 

Taşınabilirlik: C dilinde yazılmış ve işlerliği belirli bir donanıma bağımlı olmayan programlar başka bir makineye asgari seviyede değişiklik yapılarak ya da hiçbir değişiklik
yapılmadan taşınabilir. Bu dil belli bir donanıma bağımlı program bölümlerini açıkça belirtilmiş ayrı modüller halinde yazılmasını teşvik eder, böylece ileride bir taşıma söz konusu olduğunda, asgari gayret sarf edilerek taşınma sağlanır. C öncelikle sistem programlama için kullanıldı. C’nin sistem programlama için kullanılmasının çeşitli nedenleri vardır. Genellikle sistem programlarının çabuk çalışması gerekir. C derleyicileriyle derlenen programlar hemen hemen Assembler’ da yazılan programlar kadar hızlı çalışır[4].

 

Programlama Dili Sınıflandırmaları

 

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 imkânsı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ğlar. Aşağıda, sözü edilen programlama dillerini sınıflayacağız.

 

 

 

 

 

 

Geleneksel Sınıflandırma

 

Programlama dillerini doğal dillere olan yakınlıklarına göre 4 değişik seviyede toplayabiliriz;

 

  1. Makine dilleri,
  2. Assembly dilleri,
  3. Üst düzey diller,
  4. Uygulama üreteçleri.

 

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

 

Şimdi sırası ile programlama dillerini özetleyelim.

 

  1. Makine Dilleri

 

Makine dilleri ikili sayılardan oluşur. Tüm komutlar, adresler ve veriler ikili sistemde temsil edilir. Makine diline çevrilmiş bir komut iki parçadan oluşur;

 

4        Operatör: Herhangi bir komuta karşılık gelen işlemin kodudur.

5        Operand:  Üzerinde işlem yapılan yani işlenen veriyi yada verinin adresini tutan koddur. Bazı komutlarda Operand bulunmayabilir.

 

2.   Assembly Dilleri

      Assembly dilleri, makine dillerine oranla daha üst düzey dillerdir. Bu diller anımsatıcı simgelerden (mnemonic symbols) oluşur. Bunlar daha kolay ezberlenebildikleri için bu şekilde adlandırılmışlardır.

 

Assembly dillerinde simgesel adresler kullanılabilir. Bu adreslere sayısal değerleri atama işlemi, program derlenirken olur. Assembly dillerindeki derleyicilere assembler denir. Kaynak kodunda yazılmış programların nesne koduna dönüştürülmesi için kullanılır.

 

 

Her bilgisayarın assembly dili ile makine dili birbirinden farklıdır. Benzerlikler olmakla beraber yeni ve değişik komutlar içerdikleri için her birinin ayrıca öğrenilmesi gerekir. Buna karşılık assembly dili bilgisayarla daha kolay etkileşim sağladığı için bu dille yazılan programlar daha hızlı çalışır.

 

 

 

 

 

 

3.   Üst Düzey Diller

 

Üst düzey diller, doğal dillere ve matematik işlemlere makine dili ve assembly’e göre daha yakındır. 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 (interpreter) kullanırlar. Yorumlayıcılar her bir satırı önce makine diline çevirir sonra çalıştırır ve bir sonraki komuta geçer.

Üst düzey dilleri öğrenmek, kodlamak ve bu dillerde hataları bulmak, makine diline ve assembly’e göre daha kolaydır. Bu dilleri kullanan programcı makine dilinin detaylarında boğulmak yerine çözülmesi gerekli problem ile ilgilenir.

 

Bazı önemli üst düzey diller;

 

FORTRAN: Bilimsel hesaplamalar ve mühendislikte yaygın olarak kullanılır.

BASIC: Mikrobilgisayarlarda yaygın olarak kullanılan basit ve öğrenmesi kolay bir dildir.

PASCAL: Genel amaçlı bir üst düzey dildir.

C/C++: Yetenekli, net ve taşınabilir olması bu dili popüler kılmıştır.

 

4.   Uygulama Üreteçleri

 

Uygulama üreteçlerine 4.nesil diller (4GL: Fourth Generation Languages), çok üst düzey diller de denilebilir. Temel olarak bunlar programlama dillerinin katı kurallarını ortadan kaldırarak bilgisayara ne yapmaları gerektiğini girdi ve çıktıları belirterek anlatırlar.

 

Uygumla üreticiler genellikle içinde

1        Editör

2        Rapor çıkarıcı

3        Veritabanı yaratıcısı

4        Hata bulucuların yer aldığı paketler halinde satılır.

 

Sorgulama dilleri de uygulama ücretleri gibi soyut, kuralları gevşetilmiş dillerdir. Bunlar günlük konuşma dillerine benzer kurallar içerisinde sorgular yaratarak veri tabanlarına erişmekte kullanılırlar.

 

Bu tür diller programlama zamanını kısaltmakla birlikte ürettikleri kod genellikle alt düzey dillerde üretilen programlara göre daha verimsiz çalışırlar. Daha fazla bellek ve disk alanına gereksinim duyabilirler.

 

 

Programlama Paradigmaları (Dizileri)

 

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. Bu kavramlar programlama paradigmaları (dizileri) olarak adlandırılırlar.

 

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 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.

 

Pascal, C, imperatif dillere örneklerdir.

 

b-) Dekleratif Diller

 

Dekleratif diller programcıya programın mantığı, 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.

 

Yukarıdaki 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şımamaktadır.Prolog dekleratif dilere ö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 bu paradigmayı hayata geçiren önemli dillerden birisidir.

 

d-) Nesneye Dayalı Diller

 

Nesneye dayalı dillerde veriler, komutların veya fonksiyonların üzerinde 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ımlarlar. Bir başka deyişle veriler pasif listeler olarak değil, listeler ve bu listelerin üzerinde yapılabilen işlemlerle birlikte saklanır.

 

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

 

 

Programlama Kavramları

 

Yukarıda, değişik programlama paradigmalarını tanıtırken çeşitli kavramlardan söz ettik. Bu bölümde, değişken, fonksiyon, yordam gibi kavramların tanımlarını yapacağız.

 

Programlarda Kullanılan Araçlar

 

Programlar kullanıcı ile makine arasındaki ilişkiyi sağlayan kurallar dizinidir. Bu kurallar programlama dilleri arasında faklılıklar gösterse de bazı kavramlar veya araçlar tüm dillerde kullanılırlar.

 

Değişkenler (variable): Program içinde programcı tarafından tanımlanan nesnelere verilen isimdir. Örneğin;

 

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.

 

 

 

 

Var N:integer;

N:=35;

 

Yukarıda N bir tam sayı olarak tanımlanmakta, bir sonraki satırda ise N’e bir değer atanmaktadır.

Sabitler (constants): 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 tanımlamadan sonra M programın çalışması süresince her kullanıldığı yerde 50 değerini alacaktır.

 

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 akışı 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 farklı bir yöne gitmektedir. Aşağıdaki örnek bu söylenenleri açıklamaktadır.

 

if (a= =b)

then

c=0;

Else

c=1;

 

İfadesinde “a” değişkeni ile “b” karşılaştırılmakta ve sonuç doğru ise “c” ye 0 değeri atanmaktadır, fakat karşılaştırma sonucu yanlış ise “c” ye 1 değeri aktarılmaktadır.

 

 

 

 

 

 

 

 

 

 

 

Diğer bir kontrol ifadesi de while ifadesidir. Bu komutla bir ilişkinin doğruluğu sınanmakta ve sonuca göre işlem yapılmaktadır. Örneğin;

 

While (x!=0) {

a=a+1;

x=x–1;

}

 

Program bölümünde x=0 olmadığı sürece a’nın değeri 1 arttırılacaktır. x=0 olduğunda ise program kontrolü while döngüsünün dışına çıkacaktır.

 

Birinci kontrol ifadesi olarak tanıttığımız if konutuna ek olarak case ifadesi de aynı amaçla kullanılabilir. Bu durumda test edilen şartın sonucuna göre bir değişkene birden fazla değer atanabilir.

 

Switch (n) {

case 1: x=0; break;

case 2: x=1; break;

case 3: x=5; break;

}

 

İfadesinde n değişkeninin aldığı değere göre x değişkenine bir değer atanmakta ve kontrol döngünün dışına aktarılmaktadır[1].

konunun slaytına bu linkten ulaşabilirsiniz.

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.