# Programlama paradigması
Programlama paradigmaları, programlama dillerini özelliklerine göre sınıflandırmanın bir yoludur. Diller birden fazla paradigma içinde sınıflandırılabilir.
Bazı paradigmalar, temel olarak, yan etkilere izin verilmesi veya işlem sırasının yürütme modeli tarafından tanımlanıp tanımlanmadığı gibi dilin yürütme modeli için çıkarımlarla ilgilidir. Diğer paradigmalar, bir kodu, kod tarafından değiştirilen durumla birlikte birimler halinde gruplamak gibi, esas olarak kodun düzenlenme şekliyle ilgilidir. Yine de diğerleri esas olarak sözdizimi ve dilbilgisi stiliyle ilgilenir.
Yaygın programlama paradigmaları şunları içerir:
  - Programcının, makineye durumunu nasıl değiştireceğini bildirdiği (emirlendirdiği), emirli 
   - Emirleri prosedürler halinde gruplandıran, yordamsal.
   - Komutları, üzerinde çalıştıkları durumun bir parçası ile gruplandıran nesne yönelimli.
  - Programcının, istenen sonucun özelliklerini nadiren bildirdiği, ancak nasıl hesaplanacağını açıklamadığı, bildirimsel 
   - İstenen hesaplama sonucunun, bir dizi fonksiyon çağırımının sonucu olarak görüldüğü, fonksiyonel programlama.
   - Bir gerçekler ve kurallar sistemi hakkındaki bir sorunun cevabı olarak tanımlanan sonucun bildirildiği, mantıksal programlama.
   - Sonucun, bir optimizasyon probleminin çözümü olarak bildirildiği matematiksel programlama.
   - İstenen sonucun veri akışları ve değişikliğin yayılması ile bildirildiği reaktif.
Programın kendisine atıfta bulunmasını sağlayan yansıma gibi, sembolik teknikler de bir programlama paradigması olarak düşünülebilir. Ancak bu, ana paradigmalarla uyumludur ve bu nedenle kendi başına gerçek bir paradigma değildir.
Örneğin, emirli paradigmaya giren dillerin iki ana özelliği vardır: işlemlerin gerçekleştiği sırayı, bu sırayı açıkça kontrol eden yapılarla belirtirler ve herhangi bir zamanda bir durumun değiştirilebileceği yan etkilere izin verirler. Bir kod birimi içinde, zamanın farklı bir noktasında farklı bir kod birimi okunabilir. Kod birimleri arasındaki iletişim açık değildir. Bu arada, nesne yönelimli programlamada kod, yalnızca nesnenin parçası olan kod tarafından değiştirilen bir durumu içeren nesneler halinde düzenlenir. Nesne yönelimli dillerin çoğu aynı zamanda emirli dillerdir. Buna karşılık, bildirimsel paradigmaya uyan diller, işlemlerin yürütüleceği sırayı belirtmez. Bunun yerine, sistemde her birinin yürütülmesine izin verilen koşullarla birlikte bir dizi kullanılabilir işlem sağlarlar. Dilin yürütme modelinin uygulanması, hangi işlemlerin yürütülmekte serbest olduğunu izler ve sırayı bağımsız olarak seçer. Daha fazlası için, çok paradigmalı programlama dillerinin karşılaştırılması.


## Genel bakış.
Yazılım mühendisliğinin (bir süreç olarak) farklı "metodolojilerle" tanımlanması gibi, programlama dilleri de (hesaplama modelleri olarak) farklı "paradigmalarla" tanımlanır. Bazı diller tek bir paradigmayı desteklemek üzere tasarlanmıştır (Smalltalk nesne yönelimli programlamayı destekler, Haskell işlevsel programlamayı destekler), diğer programlama dilleri ise birden çok paradigmayı destekler (Object Pascal, C++, Java, JavaScript, C#, Scala, Visual Basic, Common Lisp gibi), Şema, Perl, PHP, Python, Ruby, Oz ve F#). Örneğin, C++, Object Pascal veya PHP ile yazılmış programlar tamamen prosedürel ya da tamamen nesne yönelimli olabilir. Ya da her ikisinin veya diğer paradigmaların öğelerini içerebilir. Yazılım tasarımcıları ve programcılar bu paradigma öğelerinin nasıl kullanılacağına karar verirler.
Nesne yönelimli programlamada, programlar bir dizi etkileşimli nesne olarak ele alınır. İşlevsel programlamada, programlar durumsuz işlev değerlendirmeleri dizisi olarak ele alınır. Çok işlemcili bilgisayarları veya sistemleri programlarken, süreç yönelimli programlamada, programlar mantıksal olarak paylaşılan veri yapıları üzerinde hareket eden eşzamanlı işlemler kümesi olarak ele alınır.
Pek çok programlama paradigması, "teşvik ettikleri" teknikler kadar "yasakladıkları" tekniklerle de bilinir. Örneğin, saf işlevsel programlama yan etkilerin kullanımına izin vermezken, yapılandırılmış programlama, goto (git) ifadesinin kullanımına izin vermez. Kısmen, bu nedenle, yeni paradigmalar genellikle daha önceki tarzlara alışkın olanlar tarafından doktriner veya aşırı katı olarak kabul edilir. Yine de, belirli tekniklerden kaçınmak, program davranışını anlamayı ve program doğruluğu ile ilgili teoremleri kanıtlamayı kolaylaştırabilir.
Programlama paradigmaları, yalnızca bir UPA kullanarak bir yürütme modelinin çağrılmasına izin veren "programlama modelleriyle" de karşılaştırılabilir. Programlama modelleri, yürütme modelinin özelliklerine göre paradigmalar olarak da sınıflandırılabilir.
Paralel hesaplama için, bir dil yerine bir programlama modeli kullanmak yaygındır. Bunun nedeni, paralel donanımın ayrıntılarının donanımı programlamak için kullanılan soyutlamalara sızmasıdır. Bu, programcının algoritmadaki kalıpları, yürütme modelindeki kalıplarla eşleştirmek zorunda kalmasına neden olur (donanımın soyutlamaya sızması nedeniyle). Sonuç olarak, hiçbir paralel programlama dili tüm hesaplama problemlerine iyi eşleme yapamaz. Bu nedenle, bir temel sıralı dil kullanmak ve bir programlama modeli aracılığıyla paralel yürütme modellerine UPA çağrıları eklemek daha uygundur. Bu tür paralel programlama modelleri, paylaşılan bellek, mesaj geçişli dağıtılmış bellek, kodda görünen "yer" kavramları vb. gibi donanımı yansıtan soyutlamalara göre sınıflandırılabilir. Bunlar, yalnızca paralel diller ve programlama modelleri için geçerli olan programlama paradigmasının "lezzetleri" olarak kabul edilebilir.


## Paradigmalar.
 - Ajan tabanlı (agent-oriented)
 - Bağlayıcı (concatenative)
 - Belirlenimci olmayan (nondeterministic)
 - Bildirimsel (declarative) (kontrast: Zorunlu (imperative))
 - Kısıtlı (constraint)
 - Fonksiyonel (functional)
 - Veri akışı (dataflow)
 - Hücre yönelimli (cell-oriented)
 - Reaktif (reactive)
 - Bileşen tabanlı
 - Akış tabanlı (flow-based)
 - Boru hattı (pipeline)
 - Dil yönelimli (language-oriented)
 - Etki alanı özgü (domain-specific)
 - Gramer yönelimli (grammar-oriented)
 - Lehçeleme (dialecting)
 - Kasıtlı (intentional)
 - Değer düzeyi (value-level) (kontrast: Fonksiyon düzeyi (function-level))
 - Eşzamanlı (concurrent)
 - Fonksiyon düzeyi (function-level) (kontrast: Değer düzeyi (value-level))
 - İfade yönelimli (expression-oriented)
 - Mantık (logic)
 - Kısıtlı mantık (constraint logic)
 - Tutsakedici mantık (abductive logic)
 - Tümevareabilir mantık (inductive logic)
 - Meta programlama (metaprogramming)
 - Otomatik (automatic)
 - Genel (generic)
 - Şablon (template)
 - Kural tabanlı (policy-based)
 - Yansıtıcı (reflective)
 - Öznitelik yönelimli (attribute oriented)
 - Olaya dayalı (event-driven)
 - Servis odaklı
 - Zamana dayalı (time-driven)
 - Özellik yönelimli (feature-oriented)
 - Paralel hesaplama (parallel computing)
 - İşlem yönelimli (process-oriented)
 - Semantik yönelimli (semantic-oriented)
 - veritabanılı (data-driven)
 - Yapısal (structured) (kontrast: Yapısal olmayan (non-structured))
 - Modüler (modular)
 - Nesne yönelimli (object-oriented)
 - Otomata tabanlı (automata-based)
 - Kaygıların ayrımına (separation of concerns) göre:
 - Cephe yönelimli (aspect-oriented)
 - Konu yönelimli (subject-oriented)
 - Rol yönelimli (role-oriented)
 - Sınıf tabanlı (class-based)
 - Prototip tabanlı (prototype-based)
 - Özyinelemeli (recursive)
 - Yapısal olmayan (non-structured) (kontrast: Yapısal (structured))
 - Dizi (array) (kontrast: Sayıl (scalar))
 - Tekrarlamalı (iterative)
 - Zorunlu (imperative)
 - Yordamsal (procedural)