Bu yazımızda programlama paradigmasının ne olduğunu, çeşitli programlama paradigmalarını ve bu paradigmalara hizmet eden bazı programlama dillerinin hangileri olduğunu öğreneceğiz.

Programlama Paradigması

Başlangıç olarak paradigmanın ne olduğuna bakalım. Paradigma, bir bilim dalında zihinsel bir resmin, gerçekliğin algılanması, kavramsallaştırılmasını sağlayan modele denir. Programlama aleminde ise problemlere üretilen çözümlerin nasıl formül haline getirileceğiyle alakalı olan temel programlama stilidir.

Programlama paradigmaları hangi yolla çözümlere ulaştıklarının yanında hangi yolları yasakladıklarıyla da bilinirler. Örneğin sadece fonksiyonel paradigmayı esas alan bir dil yan etkilerin kullanılmasını yasaklar.

Şimdi de en çok bilinen beş temel programlama paradigmasını inceleyelim:

Zorunlu Programlama Paradigması (Imperative)

Zorunlu programlama, bir durum üzerine programlama ve durumu değiştiren komutlar üzerine kuruludur. Zorunlu programlar, bilgisayarın gerçekleştireceği sıralı komutlardır. Hesaplamanın “nasıl?” yapılacağı önemlidir. Bu paradigma bilgisayarın donanımına en uygun olandır. Hemen hemen tüm bilgisayarların donanımı makine kodunu (zorunlu stildedir) çalıştıran tarzda dizayn edilmiştir. Hafızaya konulan veriler kullanılarak işlemler yapılır ve sonuçlar yine hafızanın bir bölgesine konulur. Bu nedenle programının hangi adıma ulaştığı hafızanın içeriğinden anlaşılabilmektedir. Örneğin C dilinden (zorunlu paradigmaya sahip bir dildir.) şu kod parçasına bakalım:

int x;   /* burada x tam sayısı değişkeni için hafızadan bir yer aldık.*/
x=3;     /* 3 değerini hafızada x değişkeni için aldığımız kutuya koyduk. Hafızaya bakarak buradaki değişikliği 
görebiliriz. */
x=x+5;   /* Bu cümle matematiksel açıdan yanlışmış gibi gözükse de aslında  paradigmamızı açıklayan bir ifadedir.
    Daha önce x'e 3 koymuştuk. Bu durum gerçekleştikten sonra şimdiki komutla o durumu tekrar değiştirdik ve
    x'in içeriği 8 olmuş oldu. Sonuçlar yine hafızada bir değişikliğe yol açtı ve bunu da görebiliriz. */

Zorunlu paradigmaya hizmet eden birkaç dil: C, Pascal, Fortran, Algol 60, Cobol, Basic.

Fonksiyonel Programlama Paradigması (Functional)

Bu stil hepimizin alışık olduğu matematikteki fonksiyon mantığını ve lambda hesaplamasını temel almaktadır. Fonksiyonel paradigmayı zorunlu paradigma ile kıyaslayarak nasıl bir mantığı olduğuna bakalım:

Fonksiyonel Paradigma Zorunlu Paradigma
Programlar değerlendirilerek yürütülen tek bir deyimden (expressiondan) oluşur. Programlar birbirinin ardına yürütülen komutlardan oluşur.
Değiştirilebilen veriden kaçınır. Bir durum veya verinin değeri üzerinde değişiklik yapmak esastır.
Başka fonksiyonları argüman olarak alan üst düzey fonksiyonlar kullanılır. Olan üst düzey fonksiyonlar fonksiyonel dillere bakılarak edinilmiştir.
Tamamen fonksiyonel dillerde yan etki kullanımı yasaktır. Girdi, çıktılarda, bir durum üzerine yapılan değişikliklerde sıkça yan etkiler kullanılır.
Otomatik bir hafıza yönetimi vardır. Hafıza yönetimi programcı tarafından elle yapılır.
İşlemci kullanımı ve hafıza yönetimi açısından daha az verimlidir. Derleme sırasında her şey daha önceden tarif edilmiş olduğundan daha verimlidir.

Fonksiyonel paradigmaya hizmet eden birkaç dil: APL, Erlang, Haskell, Lisp, ML, Oz, F# and Scheme.

Nesne Yönelimli Programlama Paradigması (Object Oriented)

Nesne yönelimli paradigma her bilgisayar programının etkileşim içerisinde bulunduğu birimler ve nesneler kümesinden oluştuğunu varsayan bir oluşumdur. 1960lı yıllarda donanım ve yazılımın karmaşıklaşmaya başlamasıyla birlikte, yazılım kalitesinin korunabilmesi ve yeniden kullanılabilirliği artırmak için düşünülmüştür. Bu paradigmada esas olan şey eylemler ve bu eylemlerin mantığından çok nesneler ve verilerdir. Bu paradigmada asıl umursadığımız şey değiştirmek istediğimiz nesnelerdir ve bu nesneleri değiştiren şeyin mantığı o kadar da önemli değildir. Üzerinde değişiklik yapmak istediğimiz tüm nesneleri ve bu nesnelerin birbirleriyle olan ilişkilerini belli bir model haline getiririz. Tek bir nesnenin genel halini tarif eden sınıflar oluştururuz. Bu sınıflar içerisinde veri yapılarını ve bu veri yapıları üzerinde değişiklik yapmamızı sağlayacak fonksiyonları tanımlarız. Bu şekilde bir mantık izleyerek programlama yaparız. Bu kavramı anlamak için şu modele bakalım:

Kare sınıfı
           >Kenar 
           >Alan    
                  (= kenar*kenar)

Yukarıdaki yapıda hem kenar verisini tutan hem de kare sınıfı üzerinde tanımlı olan alan fonksiyonunu tutan bir model görüyoruz. Bu model nesne yönelimli paradigmanın esas aldığı yapıdır. Bu paradigmada eylemler değil nesneler önemlidir demiştik. Esas aldığımız şey bir nesnedir ve bu nesne üzerine çeşitli fonksiyonlar çağrılarak nesnede istenilen değişikliklerin yapılması sağlanır.

Nesne yönelimli paradigmaya hizmet eden birkaç dil: C++, C#, Java, Common Lisp, Python, Smalltalk, Visual Basic.

Paralelizm (Parallelism)

Paralelizm paradigmasında esas olan mantık yapılması gereken işi küçük parçalara bölmek, bu küçük parçaları çeşitli birimlere vermek ve bunları koordine etmektir. Paralel bilgisayarlarda programlama için işletim sistemi seviyesinde ve programlama dili seviyesinde pek çok yazılım sistemi geliştirilmiştir. Bu sistemler, problemin parçalara bölümlenmesini ve işlemcilere atanmasını sağlayan çeşitli mekanizmalar içermelidir. Dolaylı paralellik (implicit parallelism) derleyici ya da diğer programın problemi bölümlemesi ve işlemcilere otomatik olarak atamasıdır. Dolaysız paralellik (explicit parallelism) ise programcının problemin nasıl bölümleneceğini bildirmesidir. Bazı insanlar paralel programlamayı, eş zamanlı (concurrent) programlama ile eş anlamlı kabul ederler. Paralel programlama, işlemler arasında iyi tanımlanmış iletişim yapıları kullanan ve verimi artırmaya yönelik işlemlerinin paralel işlenmesini sağlayan bir yapıdır. Eş zamanlı (concurrent) programlama, performanstan ziyade başka nedenlerden dolayı eş zamanlı işlemler arasında yeni iletişim tekniklerine dayanan bir yapıdadır. İşlemler arası iletişim genelde paylaşımlı hafıza veya mesaj geçirme tekniği ile yapılır.

Paralelizm paradigmasına hizmet eden birkaç dil: PVM, MPI, OpenMP, Global Arrays, Co-Array Fortran, UPC, HPF, SHMEM, Occam, Linda, Cilk.

Mantıksal Programlama Paradigması (Logical)

Genel anlamda matematiksel mantığı esas alan bir paradigmadır. Bu paradigmada mantık tamamen bildirimsel (declarative) amaçlarla kullanılır. Teorem kanıtlayıcısı (theorem-prover) veya model üreticisi (model-generator) problemin çözümünden sorumludur. Programlamacı teoremleri doğru bir şekilde mantıksal ifadelere çevirmekten ve teorem kanıtlayıcısını kontrol etmekten sorumludur. Mantıksal dillerin bildirimsel dillerden farkı sadace yordamsal yorumlama (procedural interpretation) değil mantıksal ve bildirimsel yorumlama da yapabilmeleridir. Bunu bir örnekle açıklayalım:

“anneanne” yi mantıksal bir şekilde tanımlayalım: anneanne(x, y)=anne(x,z) ve anne(z,y) (bu ifade anneanne kavramını basitçe belirtiyor.)

Mantıksal dillerdeki mantıksal ve bildirimsel yorumlama sayesinde biz bu şekilde programımızın bir tablodaki tüm anneanneleri bulmasını isteyebiliriz :)

Mantıksal paradigmaya hizmet eden birkaç dil: Prolog, ECLiPSe, Oz, Godel, Mercury, Leda.

Programlama aleminde daha birçok paradigma vardır, burada en temel paradigmaları, bunların mantıklarını ve bu paradigmaları temsil eden dil örneklerini vermeye çalıştık. Gelecek sayılarda görüşmek üzere..

Kaynaklar: