Bildirimsel programlama

Bilgisayar biliminde, bildirimsel programlama bir programlama paradigmasıdır. —bilgisayar programlarının yapısını ve öğelerini oluşturma stili— bir hesaplamanın mantığını kontrol akışını tanımlamadan ifade eder.Bu stili uygulayan birçok dil, programın nasıl gerçekleneceğini programlama dil ilkelerinin bir dizisi olarak tanımlamak yerine programın neyi başarması gerektiğini problem alanı açısından tanımlayarak yan etkileri en aza indirmeye veya tümüyle ortadan kaldırmaya çalışır. (nasılı temeliyle dilin gerçeklemesine bağlıdır). Bu, algoritmaları açık adımlarla uygulayan zorunlu programlamanın tersidir.Bildirimsel programlama, genellikle, programları biçimsel mantığın teorileri ve hesaplamalar —ki bunlar, bu mantık uzayındaki çıkarımlardır— olarak kabul eder. Bildirimsel programlama', paralel programlar yazmayı büyük ölçüde basitleştirebilir.Yaygın bildirimsel diller, veritabanı sorgulama dillerini (örneğin, SQL, XQuery), düzenli ifadeleri, mantıksal programlamayı, işlevsel programlamayı ve konfigürasyon yönetim sistemlerini içerir.Bildirime dayalı programlama, genellikle, zorunlu olmayan herhangi bir programlama stili olarak tanımlanır. Bir dizi diğer yaygın tanımlar, onu, zorunlu programlama ile basitçe karşılaştırarak tanımlamaya çalışır. Örneğin:Yan etkileri olmayan (veya daha spesifik olarak, referans olarak şeffaf olan) herhangi bir programlama dili.Bildirimsel programlama, programların gerçekleştirilmesi gereken komutları veya adımları açıkça listelemeden istenen sonuçları tanımladığı, zorunlu olmayan bir programlama stilidir. İşlevsel ve mantıksal programlama dilleri, bildirimsel bir programlama stili ile karakterize edilir. Mantıksal programlama dillerinde programlar mantıksal deyimlerden oluşur ve program deyimlerin kanıtlarını arayarak yürütülür.Haskell gibi saf bir işlevsel dilde, tüm işlevler yan etkisizdir ve durum değişiklikleri yalnızca, programda açıkça birinci sınıf bir nesne olarak temsil edilen durumu dönüştüren işlevler olarak temsil edilir. Saf işlevsel diller zorunlu olmasa da, genellikle bir işlevin etkisini bir dizi adım olarak tanımlamak için bir olanak sağlarlar. Lisp, OCaml ve Erlang gibi diğer işlevsel diller, prosedürel ve işlevsel programlamanın bir karışımını destekler.Prolog gibi bazı mantıksal programlama dilleri ve SQL gibi veritabanı sorgulama dilleri, prensipte bildirimsel olmakla birlikte, prosedürel bir programlama stilini de destekler.Bildirimsel programlama, bir dizi daha iyi bilinen programlama paradigmasını içeren bir şemsiye terimdir.Kısıt programlama, değişkenler arasındaki ilişkileri hedef çözümün özelliklerini belirleyen kısıtlamalar biçiminde belirtir. Kısıtlar kümesi, çözümün maksimum kısıtlama sayısıyla tutarlı olması için her değişkene bir değer verilerek çözülür. Kısıtlı programlama genellikle diğer paradigmaları tamamlar: İşlevsel, mantıksal ve hatta zorunlu programlama.Bildirimsel etki alanına özgü dillerin (EAÖD'ler) iyi bilinen örnekleri arasında yacc ayrıştırıcı üreteci giriş dili, QML, Make derleme belirtim dili, Puppet'ın yapılandırma yönetim dili, normal ifadeler ve bir SQL alt kümesi (örneğin seçim—SELECT—sorguları) bulunur.). EAÖD'ler, Turing bütünlü olması gerekmese de faydalı olma avantajına sahiptir, bu da bir dilin tamamen bildirimsel olmasını kolaylaştırır.HTML, MXML, XAML, XSLT veya diğer kullanıcı arayüzü biçimlendirme dilleri gibi birçok biçimlendirme dili genellikle bildirimseldir. Örneğin HTML, yalnızca bir web sayfasında neyin görünmesi gerektiğini tanımlar - ne bir sayfanın oluşturulması için kontrol akışını ne de sayfanın bir kullanıcıyla olası etkileşimlerini belirtir.2013 itibarıyla, bazı yazılım sistemleri, geleneksel kullanıcı arabirimi biçimlendirme dillerini (HTML gibi), arka uç sunucu sistemlerinin beyan edilen arabirimi desteklemek için ne (nasıl değil) yapması gerektiğini tanımlayan bildirime dayalı biçimlendirme ile birleştirir. Tipik olarak etki alanına özgü bir XML isimuzayı kullanan bu tür sistemler, SQL veritabanı sözdiziminin soyutlamalarını veya representational state transfer (REST) ve SOAP kullanan web hizmetlerine parametreli çağrıları içerebilir.Haskell, Scheme ve ML gibi fonksiyonel programlama dilleri, fonksiyon uygulaması aracılığıyla ifadeleri değerlendirir. İlgili ancak daha zorunlu olan Prosedürel programlama paradigmasının aksine, işlevsel programlama açık sıralamaya çok az önem verir. Örneğin, Scheme'de, birçok alt ifade türünün değerlendirme sırası tanımsızdır veya örtüktür. Bunun yerine, hesaplamalar, G/Ç'ya açık referanslar ve az miktarda görünen veriler ve mümkün olan her yerde durum mutasyonundan kaçınılan veya kapsüllenen çeşitli özyinelemeli yüksek dereceli işlev uygulaması ve kompozisyonu ile karakterize edilir.Örneğin, makefile'ler, bağımlılıkları bildirimsel bir tarzda belirtir,  ancak yapılması gereken zorunlu bir eylem listesi de içerir. Benzer şekilde, YACC, bildirimsel olarak bağlamdan bağımsız bir dilbilgisi belirtir, ancak genellikle zorunlu olan (C gibi) bir ana bilgisayar dilinden kod parçacıkları içerir.Mantık programlama dilleri, Prolog gibi, ilişkileri tanımlar ve sorgular. Bu sorguların nasıl yanıtlandığına ilişkin ayrıntılar, uygulamaya ve teorem ispatına bağlıdır, ancak tipik olarak bir tür birleştirme biçimini alır. İşlevsel programlama gibi, birçok mantık programlama dili yan etkilere izin verir ve sonuç olarak, kesin olarak bildirimsel değildir.Fiziksel sistemlerin modelleri veya matematiksel temsilleri, bildirimsel olan bilgisayar kodunda uygulanabilir. Kod, davranışsal ilişkileri tanımlayan (bildirilen) zorunlu atamalar değil, bir dizi denklem içerir. Bu formalizmde bir model ifade edildiğinde, bir bilgisayar çözüm algoritmasını en iyi şekilde formüle etmek için cebirsel işlemleri gerçekleştirebilir. Matematiksel nedensellik tipik olarak fiziksel sistemin sınırlarına dayatılırken, sistemin davranışsal açıklaması bildirimsel veya nedenseldir. Bildirime dayalı modelleme dilleri ve ortamları arasında Analytica, Modelica ve Simile bulunur.