Deklaratif programlama nedir? [kapalı]


193

Bu terimi birçok farklı bağlamda attığımı duyuyorum. Bu ne?


7
Doğru yanıt olarak seçtiğiniz yanıt (yeşil onay işaretiyle belirtilir) yanlıştır. Deklaratif programlamayı antitezinden zorunlu kılan programdan ayıran şeyi tanımlamaz. Lütfen seçiminizi değiştirmeyi düşünün.
Shelby Moore III

3
Evet, doğru olarak işaretlenen cevap doğru DEĞİLDİR.
Dermot

4
@ShelbyMooreIII Ayrıca okuyabilmemiz için hangi cevabın doğru olduğunu belirtiniz!
vivek.m

@ vivek.m Bugün yeni bir cevap verdim .
Shelby Moore III

Yanıtlar:


148

Bildirimli programlama, kodunuzu, nasıl yapmak istediğinizi değil, ne yapmak istediğinizi açıklayacak şekilde yazdığınız zamandır. Nasıl yapılacağını anlamak derleyiciye bırakılmıştır.

Bildirici programlama dillerine örnek olarak SQL ve Prolog verilebilir.


29
Hala bilgisayara "ne" istediğinizi söylemek için "nasıl" anlamaya :)
hasen

7
@hasenj bu ve diğer cevaplar zorunlu programlama ile paylaşılmayan tek özelliği tanımlamaz - bu değişmezliktir .
Shelby Moore III

3
Zorunlu programlamadan (C, C ++, C # gibi diller) nasıl farklı olduğundan bahsedebilirseniz gerçekten harika olacak, o zaman okuyucuların farkı yaratması daha kolay olacaktır.
RBT

1
programcısı : "Paris'e seyahat etmek istiyorum." deklaratif (c) : "Oraya nasıl gitmek istersiniz? tekne ile yelken açmak mı, yoksa bir uçakta uçmak mı? programcısı : "Nasıl yapıldığıyla ilgilenmiyorum." imperative (sql) : "Endişelenme. İhtiyacın olanı sorgulayabilirim." ( Bu ben cevap anlamak nasıl )
nate

Referans olarak şeffaf olmayan ifadeleri destekliyorsa SQL nasıl bildirimde bulunabilir?
java-addict301

80

Diğer cevaplar zaten bildirimsel programlamanın ne olduğunu açıklayan harika bir iş yapıyor, bu yüzden bunun neden yararlı olabileceğine dair bazı örnekler vereceğim.

Bağlam Bağımsızlığı

Beyan Programları bağlamdan bağımsızdır . Çünkü sadece nihai hedefin ne olduğunu açıklarlar, fakat bu amaca ulaşmak için ara adımlar atmazlar, aynı program farklı bağlamlarda kullanılabilir. Bu, zorunlu programlarla yapmak zordur , çünkü bunlar genellikle bağlama bağlıdır (örn. Gizli durum).

Örnek yaccolarak alalım. Bir ayrıştırıcı jeneratör aka. derleyici derleyici, bir dilin dilbilgisini tanımlamak için harici bir bildirim DSL'si, böylece o dil için bir ayrıştırıcı açıklamadan otomatik olarak oluşturulabilir. Bağlam bağımsızlığı nedeniyle, böyle bir dilbilgisi ile birçok farklı şey yapabilirsiniz:

  • Bu dilbilgisi için bir C ayrıştırıcısı oluşturun (orijinal kullanım durumu yacc)
  • Bu dilbilgisi için bir C ++ ayrıştırıcısı oluşturun
  • Bu dilbilgisi için bir Java ayrıştırıcısı oluşturma (Jay kullanarak)
  • Bu dilbilgisi için bir C # ayrıştırıcısı oluşturun (GPPG kullanarak)
  • Bu dilbilgisi için bir Ruby ayrıştırıcısı oluşturma (Racc kullanarak)
  • Bu dilbilgisi için bir ağaç görselleştirmesi oluşturun (GraphViz kullanarak)
  • yacc kaynak dosyasının bazı güzel yazdırma, fantezi biçimlendirme ve sözdizimi vurgulamalarını yapın ve referans dilinize sözdizimsel bir şartname olarak ekleyin

Ve daha fazlası …

Optimizasyon

Bilgisayarı hangi adımları atacağınıza ve hangi sırayla yazdığınıza göre, programınızı çok daha özgürce yeniden düzenleyebilir, hatta bazı görevleri paralel olarak gerçekleştirebilir. İyi bir örnek, bir SQL veritabanı için bir sorgu planlayıcısı ve sorgu iyileştiricisidir. Çoğu SQL veritabanları onlar olduğunu sorguyu görüntülemesine izin aslında o sorguya vs yürütme sorulan idam etmeleri. Genellikle, bu sorgular hiçbir şey görünmüyorbirbirleri gibi. Sorgu planlayıcısı, hayal bile edemeyeceğiniz şeyleri göz önünde bulundurur: örneğin, disk tabağının dönme gecikmesi veya tamamen farklı bir kullanıcı için tamamen farklı bir uygulamanın benzer bir sorguyu ve bulunduğunuz tabloyu yürüttüğü gerçeği ile katılmak ve yükleme önlemek için çok çalıştı zaten zaten bellekte.

Burada ilginç bir değiş tokuş var: Makine, zorunlu bir dilde olduğundan daha fazla bir şey yapmayı anlamak için daha fazla çalışmak zorunda, ancak bunu çözdüğünde , optimizasyon için çok daha fazla özgürlük ve daha fazla bilgiye sahip. sahne.


23

gevşekçe:

Deklaratif programlama şunlara eğilimlidir: -

  • Her biri bir anlamı olan (genellikle problem alanında) ve bağımsız olarak ve tek başına anlaşılabilen deklarasyonlar veya deklaratif ifadeler.

Zorunlu programlama şunlara eğilimlidir: -

  • Her biri bir eylem gerçekleştiren komut dizileri; ancak bu sorun alanında bir anlamı olabilir veya olmayabilir.

Sonuç olarak, zorunlu bir stil, okuyucunun sistemin gerçekte ne yaptığını anlamasına yardımcı olur, ancak çözmesi amaçlanan sorun hakkında çok az fikir verebilir. Öte yandan, açıklayıcı bir stil, okuyucunun problem alanını ve sistemin problemin çözümüne yönelik yaklaşımını anlamasına yardımcı olur, ancak mekanik konusunda daha az bilgilendiricidir.

Gerçek programlar (ProLog veya C gibi spektrumun uçlarını tercih eden dillerde yazılmış olanlar bile), parçanın değişen karmaşıklıklarını ve iletişim ihtiyaçlarını karşılamak için her iki stilin çeşitli noktalarda çeşitli derecelerde sunulma eğilimindedir. Bir stil diğerinden üstün değildir; sadece farklı amaçlara hizmet ederler ve hayattaki birçok şeyde olduğu gibi ılımlılık anahtardır.


Doğru cevap bu. Yukarıdaki o mumble herhangi biri
Krzysztof Wende

Sadece soruyu cevaplamakla kalmayıp aynı zamanda bağlam ve pratiklikle "5 Yaşımdaki gibi açıkla" tarzında yaptığınız için teşekkür ederiz. Mükemmel cevap.
monsto

17

İşte bir örnek.

CSS'de (HTML sayfalarını biçimlendirmek için kullanılır), bir görüntü öğesinin 100 piksel yüksekliğinde ve 100 piksel genişliğinde olmasını istiyorsanız, basitçe şu şekilde istediğinizi "beyan edersiniz":

#myImageId {
height: 100px;
width: 100px;
}

CSS'yi bildirici bir "stil sayfası" dili olarak kabul edebilirsiniz.

Bu CSS'yi okuyan ve yorumlayan tarayıcı motoru , görüntünün bu kadar uzun ve bu kadar geniş görünmesini sağlamakta özgürdür. Farklı tarayıcı motorları (ör. IE motoru, Chrome motoru) bu görevi farklı uygular.

Onların benzersiz uygulamaları, elbette, bildirici bir dilde DEĞİL, Montaj, C, C ++, Java, JavaScript veya Python gibi prosedürel bir dilde yazılmıştır. Bu kod, adım adım gerçekleştirilecek bir dizi adımdır (ve işlev çağrılarını içerebilir). İnterpolate piksel değerleri gibi şeyler yapabilir ve ekranda oluşturulabilir.


11

Üzgünüm, ama diğer cevapların çoğuna katılmıyorum. Deklaratif programlama tanımının bu karışık yanlış anlaşılmasını durdurmak istiyorum.

Tanım

Alt ifadelerin referans şeffaflığı (RT), bildirimsel programlama ifadesinin tek gerekli özelliğidir , çünkü zorunlu programlama ile paylaşılmayan tek özelliktir.

Deklaratif programlamanın diğer atıfta bulunulan özellikleri, bu RT'den türetilir. Ayrıntılı açıklama için lütfen yukarıdaki köprüyü tıklayın.

Elektronik tablo örneği

İki cevap e-tablo programlama bahsetti. Elektronik tablo programlamasının (diğer bir deyişle formüller) değişken küresel duruma erişmediği durumlarda, bildirimsel programlamadır. Bunun nedeni, değişebilen hücre değerlerinin (tüm programın) monolitik girişi ve çıkışı olmasıdır main(). Yeni değerler, her formül yürütüldükten sonra hücrelere yazılmaz, bu nedenle bildirim programının ömrü boyunca değiştirilebilir (e-tablodaki tüm formüllerin yürütülmesi). Böylece, birbirlerine göre, formüller bu değişebilir hücreleri değişmez olarak görürler. Bir RT fonksiyonunun değişmez küresel duruma (ve ayrıca değişebilir yerel duruma ) erişmesine izin verilir .

Böylece, program sona erdiğinde (çıktı olarak main()) hücrelerdeki değerleri mutasyona uğratma yeteneği , onları kurallar bağlamında depolanabilir değerleri değiştirebilir yapmaz. Anahtar ayrım, her bir e-tablo formülü gerçekleştirildikten sonra hücre değerlerinin güncellenmemesidir, bu nedenle formüllerin gerçekleştirilme sırası önemli değildir. Tüm bildirim formülleri gerçekleştirildikten sonra hücre değerleri güncellenir.


1
İstenmeyen yan etkiler, bildirilenler ile programın gerçek davranışı arasındaki ilişkiyi yok edebilir. Bunu yeni bir cevapta daha ayrıntılı olarak açıkladım .
Shelby Moore III

8

Deklaratif programlama, zorunlu programlamanın o resmi boyamak için talimatlar olduğu resimdir.

Bilgisayarın istediğiniz yere ulaşmak için atması gereken adımları tanımlamak yerine "Ne olduğunu söylüyorsanız" açıklayıcı bir tarzda yazıyorsunuz.

Verileri işaretlemek için XML kullandığınızda, "Bu bir kişidir, bu bir doğum günüdür ve üzerinde bir sokak adresi vardır" diyorsunuz çünkü bildirimsel programlama kullanıyorsunuz.

Deklaratif ve zorunlu programlamanın daha fazla etki için birleştirildiği bazı örnekler:

  • Windows Presentation Foundation, bir kullanıcı arabiriminin neye benzediğini ve denetimler ile temeldeki veri yapıları arasındaki ilişkilerin (bağlamalar) neler olduğunu tanımlamak için bildirici XML sözdizimi kullanır.

  • Yapılandırılmış yapılandırma dosyaları, bir dize veya veri değerinin ne anlama geldiğini tanımlamak için bildirici sözdizimi kullanır ("anahtar = değer" çiftleri kadar basit).

  • HTML metni, her bir metin parçasının belgenin tamamı ile ilgili rolünü tanımlayan etiketlerle işaretler.


2
XML bildirimsel olsa da, basitçe işaretleme ile ilişkili aktif anlambilim olmadığı için bildirimsel programlama olduğunu söyleyecek kadar ileri gitmem . Bir şeyin adres olduğunu söylemek, onunla ne yapmak istediğinizi anlamanıza yardımcı olmaz.
HenryR

1
Deklaratif programın kullanıldığı temel bir bağlam (alan?) Bulunmalıdır. Dolayısıyla, ANT ile birleştirilmiş XML kullanımı, bir bildirim programı olarak yorumlanabilir.
Gutzofter

7

Deklaratif Programlama deklarasyonlarla, yani deklaratif cümle ile programlama yapıyor. Beyan cümleleri, onları zorunlu cümlelerden ayıran bir dizi özelliğe sahiptir. Özellikle, beyanlar:

  • değişmeli (yeniden sıralanabilir)
  • çağrışımsal (yeniden gruplandırılabilir)
  • idempotent (anlam değişikliği olmadan tekrar edebilir)
  • monotonik (beyanlar bilgiyi çıkarmaz)

İlgili bir nokta, bunların hepsinin yapısal özellikler olması ve konuyla dik olmasıdır. Beyanname "Ne vs. Nasıl" ile ilgili değildir . Biz beyan (temsil ve constrain) olabilir "nasıl" aynı kolaylıkla diye ilan gibi bir "ne" . Bildirici içerikle değil yapıyla ilgilidir. Deklaratif programlama, kodumuzu nasıl soyutladığımız ve yeniden düzenlediğimiz ve onu alt programlara nasıl modülerleştirdiğimiz üzerinde önemli bir etkiye sahiptir, ancak alan modeli üzerinde çok fazla değil.

Genellikle, bağlam ekleyerek zorunlu olandan bildirgeye dönüşebiliriz. Örneğin, "Sola dönün. (... bekleyin ...) Sağa dönün." "Bob 11: 00'da Foo ve Bar'ın kesiştiği yerde sola dönecektir. Bob 11: 06'da Bar ve Baz'ın kesiştiği yerde sağa dönecektir." İkinci durumda, cümle iktidarsız ve değişmeli iken, önceki durumda cümle yeniden düzenlenmesi veya tekrarlanması programın anlamını ciddi şekilde değiştirecektir.

Monotonik ile ilgili olarak , bildirimler olasılıkları çıkaran kısıtlamalar ekleyebilir . Ancak kısıtlamalar hala bilgi ekler (daha kesin olarak, kısıtlamalar bilgidir). Zamanla değişen beyanlara ihtiyacımız varsa, bunu açık zamansal anlambilim ile modellemek tipiktir - örneğin "top düzdür" ten "top T zamanında düzdür". İki çelişkili bildirimimiz varsa, tutarsız bir bildirim sistemimiz vardır, ancak bu, yumuşak kısıtlamalar (öncelikler, olasılıklar, vb.) Getirerek veya paraconsistentli bir mantık kullanılarak çözülebilir.


1
Deklaratif ifadeler programın amaçlanan davranışına katkıda bulunur, zorunluluk amaçlanan veya amaçlanmayan katkıda bulunabilir. Eğer kasıtlı anlambilim ise, bildirgenin değişmeli ve kasıtlı olması gerekmez.
Shelby Moore III

6

Bir bilgisayara nasıl bir şey yapılacağını değil, ne istediğinizi açıklamak.


6

bir excel sayfası hayal edin. Vergi beyannamenizi hesaplamak için formüllerle doldurulmuş sütunlar.

Tüm mantık hücrelerde bildirilir, hesaplama sırası prosedürel olarak değil formülün kendisi tarafından belirlenir.

Deklaratif programlamanın konusu budur. Sorunlu alanı ve çözümü programın akışı yerine bildirirsiniz.

Prolog kullandığım tek beyan dilidir. Farklı bir tür düşünme gerektirir, ancak sizi tipik prosedürel programlama dilinden başka bir şeye maruz bırakıp açmayacağınızı öğrenmek iyidir.


6

Bu soruya cevap verdiğim Aralık 2011'den bu yana, deklaratif programlama anlayışımı geliştirdim . İşte mevcut anlayışımı takip ediyor.

Anlayışımın (araştırma) uzun versiyonu, aşağıda sağlayacağım özeti derinlemesine anlamak için okumanız gereken bu bağlantıda detaylandırılmıştır .

Zorunlu programlama, değiştirilebilir durumun depolandığı ve okunduğu yerdir, bu nedenle program talimatlarının sıralanması ve / veya çoğaltılması, programın davranışını (anlambilimi) değiştirebilir (ve hatta bir hataya, yani istenmeyen davranışa neden olabilir).

(Benim önceki cevap iddia) en naif ve aşırı anlamda, bildirime programlama (DP) tüm saklanan değişken durumunu kaçınarak, böylece sipariş ve / veya program talimatlarının çoğaltılması olduğunu DEĞİL programın davranışını (semantik) değiştirmek .

Bununla birlikte, böyle bir aşırı tanım gerçek dünyada çok yararlı olmayacaktır, çünkü hemen hemen her program depolanabilir değişken durumu içerir. Tablo örneği , yeni durumları kaydedilir önce tüm program kodu, giriş durumu ve bir statik kopyası ile tamamlanma çalıştırılır, çünkü DP bu aşırı tanımına uygundur. Sonra herhangi bir durum değişirse, bu tekrarlanır. Ancak gerçek dünyadaki programların çoğu, bu tür yekpare bir devlet değişikliği modeliyle sınırlı olamaz.

DP'nin daha yararlı bir tanımı, programlama talimatlarının sıralanması ve / veya çoğaltılması, herhangi bir opak anlambilimi değiştirmemesidir. Başka bir deyişle, anlambilimde gizli rastgele değişiklikler yoktur - program talimatı düzeninde ve / veya çoğaltılmasında yapılan herhangi bir değişiklik, yalnızca programın davranışında amaçlanan ve şeffaf değişikliklere neden olur.

Bir sonraki adım, DP'de hangi programlama modellerinin veya paradigmalarının yardımcı olduğu hakkında konuşmak olacaktır, ancak buradaki soru bu değildir.


Güncelleme: lütfen bildirim programlamasının tanımı hakkındaki diğer cevabımdaki daha kapsamlı açıklamaya da bakın .
Shelby Moore III

Functional programmingbu günlerde aslında bildirimsel programlamanın bir alt kümesi olan vızıltı kelimesidir. C # dilinde LINQ, dilin doğası gereği zorunlu olduğunda işlevsel programlamanın bir öğesidir. Böylece C # bu tanımla bir çeşit hibrit haline gelir.
RBT

1
Compute.com bağlantısı öldü.
Kedar Mhaswade

5

Bu açıklayan etrafında dayalı programlamayı bir yöntem var neyi şey yapmak ya da bunun yerine açıklayan olmalıdır nasıl çalışması gerekir.

Başka bir deyişle, ifadelerden oluşan algoritmalar yazmazsınız, sadece şeylerin nasıl olmasını istediğinizi düzenlersiniz. İki iyi örnek HTML ve WPF'dir.

Bu Wikipedia makalesi iyi bir genel bakış: http://en.wikipedia.org/wiki/Declarative_programming


1
Küçük kelime oyunu. WPF, bir dil veya paradigma değil, bir kütüphanedir. Bence gerçekten XAML'nin bildirimsel bir dil örneği olduğunu söylediniz.
Nick

Ve bir kütüphane / çerçeve kullanarak programlamayı nasıl tanımlarsınız?
Gutzofter

Deklaratif programlamanın ifadeler içeremeyeceğini söylemek yanlıştır. Anahtar ayrım ifadelerin depolanan değerleri değiştiremeyeceğidir .
Shelby Moore III

HTML bir programlama dili değildir
lud

5

Önceki cevabımı yazdığım için, aşağıda belirtilen beyan edici özelliğin yeni bir tanımını formüle ettim . Ayrıca zorunlu programlamayı dual özellik olarak tanımladım.

Bu tanım, önceki cevabımda verdiğim tanımdan daha üstündür, çünkü özlü ve daha geneldir. Ancak, grok yapmak daha zor olabilir, çünkü programlama ve genel olarak yaşam için geçerli olan eksiklik teoremlerinin imaları insanların aklını sarması zordur.

Tanımın alıntı yapılan açıklaması, saf fonksiyonel programlamanın bildirimsel programlamada oynadığı rolü tartışmaktadır .

Beyan Edici ve Zorunlu

Bildirici özellik, genel ve belirsiz olmayan teknik olarak kesin bir tanımda tuhaf, geniş ve yakalanması zordur, çünkü istenmeyen yan etkilere yol açmadan programın anlamını (aka anlambilim) bildirebileceğimiz naif bir kavramdır. Anlamın ifadesi ile istenmeyen etkilerin önlenmesi arasında doğal bir gerilim vardır ve bu gerilim aslında eksiklik teoremlerinden kaynaklanmaktadır programlamanın ve evrenimizin .

Teknik olarak kesin olmayan basite indirgemek, ve aynı bildirim tanımlamak çoğu zaman belirsiz ne yapacağını olarak ve zorunlu nasıl yapılacağını . Bir belirsiz durum “ Ne olduğunu” “ nasıl ” bir programda o çıkışları da programlanabilen bir derleyici.

Açıkçası, bir dili Turing'i tamamlayan sınırsız özyineleme de benzer bir şekilde anlambilimdedir - yalnızca değerlendirmenin sözdizimsel yapısında değil (operasyonel anlambilim). Bu mantıksal olarak Gödel'in teoremine benzer bir örnektir - “ herhangi bir aksiyom sistemi de tutarsız ”. Bu alıntıdaki çelişkili tuhaflığı düşünün! Bu nedenle biz kanıtlayamayız, aynı zamanda anlam ekspresyonu kanıtlanabilir bağlı olmayan gösterilmiştir bir örnek 2 olduğu bir program (ve benzer şekilde kendi semantik) Sonlanma teoremi aka dur.

Eksiklik teoremleri, Termodinamiğin İkinci Kanununda belirtildiği gibi “ entropi (bağımsız olasılıklar # olarak da bilinir) sonsuza kadar en fazla eğilim gösteren evrenimizin temel doğasından kaynaklanır . Bir programın kodlaması ve tasarımı asla bitmez - canlıdır! - çünkü gerçek bir dünya ihtiyacını karşılamaya çalışır ve gerçek dünyanın anlambilimi her zaman daha fazla olasılıkla değişir ve eğilimlidir. İnsanlar asla yeni şeyler keşfetmeyi bırakmazlar (programlardaki hatalar dahil ;-).

Bu garip evrende, kenarı olmayan (evrenimizin “dışında” olmadığını) düşünün, açıklanana kadar yanlış görünecek kısa ama aldatıcı olmayan, basit bir tanım gerektirir. derinden.

Tanım:


Bildirici özellik, her bir modüler semantiği ifade edebilecek sadece bir olası ifade kümesinin mevcut olduğu yerdir.

Zorunlu özellik 3 , anlambilimin bileşim altında tutarsız olduğu ve / veya ifade kümelerinin varyasyonlarıyla ifade edilebildiği ikili karakterdir.


Bu bildirim tanımı anlamsal kapsamda belirgin bir şekilde yereldir , yani modüler bir anlambilim, küresel kapsamda nerede ve nasıl somutlaştırıldığına ve nerede kullanıldığına bakılmaksızın tutarlı anlamını korumasını gerektirir . Böylece her bildirime modüler semantik tüm olası Başkalarıyla değil (dolayı eksiklik teoremleri kadar) bir imkansız özünde dik olmalıdır küresel ayrıca “nin noktasıdır tutarlılık, tanık için algoritma veya model Fazla her zaman daha iyi Robert Harper, Profesör tarafından” Standart ML tasarımcılarından Carnegie Mellon Üniversitesi'nde Bilgisayar Bilimleri Bölümü.

Bu modüler bildirimsel semantiklerin örnekleri arasında kategori teorisi işlevleri, örn .Applicative , Nominal yazım, ad alanları, adlandırılmış alanlar ve wrt, semantik operasyonel seviyesine ve daha sonra saf fonksiyonel programlamaya dahildir.

Bu nedenle, iyi tasarlanmış beyan dilleri, ifade edilebilecek şeylerde bir miktar genellik kaybı olsa da, içsel tutarlılıkla ifade edilebilecek bir kazanç olsa da, anlamı daha açık bir şekilde ifade edebilir.

Yukarıda belirtilen tanımın bir örneği, bir e-tablo programının hücrelerindeki, farklı sütun ve sıra hücrelerine taşındığında aynı anlamı vermesi beklenmeyen, yani hücre tanımlayıcılarının değiştiği formül kümesidir. Hücre tanımlayıcıları, amaçlanan anlamın bir parçasıdır ve gereksiz değildir. Dolayısıyla, her bir elektronik tablo sonucu, bir formül kümesindeki hücre tanımlayıcılarına benzersizdir. Bu durumda tutarlı modüler semantik, hücre formülleri için saf fonksiyonların giriş ve çıkışı olarak hücre tanımlayıcılarının kullanılmasıdır (aşağıya bakınız).

Hiper Metin İşaretleme Dili (diğer adıyla HTML) - statik web sayfalarının dili - (en azından HTML 5'ten önce) dinamik davranışı ifade etme yeteneği olmayan yüksek (ancak mükemmel bir şekilde 3 değil ) bildirici dile bir örnektir . HTML belki de öğrenmesi en kolay dildir. Dinamik davranış için, JavaScript gibi zorunlu bir komut dosyası dili genellikle HTML ile birleştirilir. Her nominal tür (yani etiketler) sözdizimi kuralları dahilinde kompozisyon altında tutarlı anlamını koruduğundan, JavaScript içermeyen HTML bildirim tanımına uyar.

Bildirici için rakip bir tanım , anlambilimsel ifadelerin değişmeli ve idempotent özellikleridir, yani ifadelerin anlamı değiştirilmeden yeniden sıralanabilir ve çoğaltılabilir. Örneğin, adlandırılmış alanlara değer atanan ifadeler, bu adlar herhangi bir zımni sıraya göre modüler ise, programın anlamı değiştirilmeden yeniden sıralanabilir ve çoğaltılabilir. İsimler bazen bir sipariş anlamına gelir, örneğin hücre tanımlayıcıları sütunlarını ve satır konumlarını içerir - toplamı e-tabloya taşımak anlamını değiştirir. Aksi takdirde, bu özellikler dolaylı olarak genelanlambilimin tutarlılığı. İfadelerin semantiklerini, rasgele sıralanmış veya çoğaltılmışsa tutarlı kalmaları için tasarlamak genellikle imkansızdır, çünkü düzen ve çoğaltma semantiğe özgüdür. Örneğin, “Foo var” (veya inşaat) ve “Foo mevcut değil” (ve yıkım) ifadeleri. Eğer kişi amaçlanan anlambilimin rastgele tutarsızlığını endimyasal olarak kabul ederse, bu tanım bildirici özellik için yeterince genel kabul edilir. Özünde bu tanım genelleştirilmiş bir tanım olarak anlamsızdır, çünkü anlambilime diklikle tutarlılık sağlamaya çalışır, yani anlambilim evreninin dinamik olarak sınırsız olduğu ve küresel bir tutarlılık paradigmasında yakalanamayacağı gerçeğini ortadan kaldırmaya çalışır .

Alt düzey operasyonel semantiğin değişmeli ve idempotent özelliklerine ihtiyaç duyulması, operasyonel semantiği bildirici yerelleştirilmiş modüler semantiğe dönüştürür, örneğin saf fonksiyonel programlama (zorunlu döngüler yerine özyineleme dahil). Daha sonra uygulama detaylarının operasyonel sırası , üst düzey anlambilimin tutarlılığını etkilemez (yani küresel olarak yayılır ). Örneğin, elektronik tablo formüllerinin değerlendirme sırası (ve teorik olarak da çoğaltılması) önemli değildir, çünkü çıktılar, tüm çıktılar hesaplanana kadar, yani saf işlevlere benzer şekilde girişlere kopyalanmaz.

C, Java, C ++, C #, PHP ve JavaScript özellikle bildirici değildir. Copute'un sözdizimi ve Python'un sözdizimi, amaçlanan sonuçlarla daha açıklayıcı bir şekilde birleştirilir , yani, dışsal olanı ortadan kaldıran tutarlı sözdizimsel semantikler, kodun unutulduktan sonra kolayca anlaşılabilmesini sağlar. Copute ve Haskell operasyonel anlambilimin determinizmini uygular ve “ kendinizi tekrar etmeyin ” (KURU) teşvik eder , çünkü sadece saf işlevsel paradigmaya izin verirler.


2 biz dil Coq ile bir program, örneğin semantik kanıtlayabilirim bile, bu ifade edilir semantik sınırlıdır yazmaya ve yazarak bile vardır diller için bir programla sematiğinde tüm yakalamak asla tam değil, örneğin HTML + CSS ile tanımlanmamış anlambilime sahip tutarsız kombinasyonları ifade etmek mümkündür.

3 Birçok açıklama yanlış bir şekilde yalnızca zorunlu programlamanın sözdizimsel olarak sıralı ifadeler olduğunu iddia etmektedir. Zorunlu ve fonksiyonel programlama arasındaki bu karışıklığı netleştirdim . Örneğin, HTML ifadelerinin sırası, anlamlarının tutarlılığını azaltmaz.


Edit: Robert Harper'ın bloguna aşağıdaki yorumu gönderdim :

fonksiyonel programlamada ... bir değişkenin değişim aralığı bir tiptir

Birinin işlevselliği zorunluluk programlamasından nasıl ayırdığına bağlı olarak, bir zorunluluk programındaki 'atanabilir' ifadeniz de değişkenliğine bir sınır koyan bir türe sahip olabilir.

İşlevsel programlama için şu anda takdir ettiğim tek karışık olmayan tanım a) birinci sınıf nesneler ve türler gibi işlevler, b) döngülere göre özyineleme tercihi ve / veya c) saf işlevler - yani istenen anlambilimi etkilemeyen işlevler ( böylece bellek tahsisi gibi işlevsel anlamsallıkların etkilerinden dolayı genel amaçlı bir anlamsal semantikte mükemmel derecede saf fonksiyonel programlama mevcut değildir ).

Saf bir fonksiyonun idempotent özelliği, değişkenleri üzerindeki fonksiyon çağrısının, genellikle zorunlu bir prosedürün argümanları için geçerli olmayan değeri ile değiştirilebileceği anlamına gelir. Saf işlevler, girdi ve sonuç türleri arasındaki oluşturulamayan durum geçişlerine göre deklaratif görünmektedir.

Ancak saf işlevlerin bileşimi böyle bir tutarlılığı korumaz, çünkü yan etki (küresel durum) zorunlu bir sürecini, örneğin Haskell'in IOMonad'ı gibi saf bir fonksiyonel programlama dilinde modellemek mümkündür ve dahası, böyle bir şeyin yapılmasını önlemek tamamen imkansızdır. herhangi bir Turing tam saf fonksiyonel programlama dili.

Ben şöyle yazdı 2012'de de yorumların benzer uzlaşma görünüyor ki en son blogunuza bildirim programlama amaçlanan semantik opak asla oldukları görüşünü yakalamak için bir girişim olduğunu. Opak semantik örnekleri düzene bağımlılık, operasyonel anlambilim katmanında daha yüksek seviyeli semantiklerin silinmesine bağımlılıktır (örneğin, dökümler dönüşüm değildir ve rejenere jenerikler daha yüksek seviyeli semantiği sınırlar ) ve kontrol edilemeyen değişken değerlere bağımlılıktır (kanıtlanmıştır) doğru) programlama diline göre.

Böylece, sadece Turing olmayan tam dillerin açıklayıcı olabileceği sonucuna vardım.

Dolayısıyla, bildirici bir dilin açık ve belirgin bir özelliği, çıktısının bazı numaralandırılabilir üretken kurallara uyduğu kanıtlanabilir. Örneğin, komut dosyası yazılmayan (diğer bir deyişle Turing tamamlanmamıştır) belirli bir HTML programı (yorumlayıcıların ayrılma yollarındaki farklılıkları yok sayarak) için çıktı değişkenliği numaralandırılabilir. Ya da daha özünde bir HTML programı değişkenliğinin saf bir fonksiyonudur. Bir elektronik tablo programı, giriş değişkenlerinin saf bir işlevidir.

Bana öyle geliyor ki, bildirici diller sınırsız yinelemenin antitezidir , yani Gödel'in ikinci eksiklik teoremine göre kendini referanslayan teoremler kanıtlanamaz.

Lesie Lamport , Öklid'in Gödel'in türler ve mantık (Curry-Howard yazışmaları, vb.) Arasındaki uyumla programlama dili bağlamında matematik kanıtlarına uygulanan eksiklik teoremlerinin nasıl çalıştığı hakkında bir peri masalı yazdı .


4

Deklaratif programlama, "makinenin operasyonel modelinden ziyade geliştiricinin zihinsel modeline uygun dillerde programlama yapma eylemidir".

Deklaratif ve zorunlu programlama arasındaki fark, yapılandırılmış verilerin ayrıştırılması sorunu ile iyi bir şekilde gösterilmiştir.

Zorunlu bir program, girdi tüketmek ve veri oluşturmak için karşılıklı olarak yinelenen işlevler kullanır. Deklaratif bir program, daha sonra ayrıştırılabilmesi için verilerin yapısını tanımlayan bir gramer ifade eder.

Bu iki yaklaşım arasındaki fark, bildirim programının, sorunun zihinsel modeline, ana bilgisayar dilinden daha yakın bir şekilde eşlenen yeni bir dil yaratmasıdır.


2

Garip gelebilir, ancak bildirim sistemleri listesine Excel'i (veya gerçekten herhangi bir elektronik tabloyu) eklerdim. Bunun güzel bir örneği burada verilmiştir .


1

DP'yi ifade etmenin bir yolu olduğu için açıklarım

  • Bir hedef ifadesi , koşullar - ne aradığımız. Bir, belki veya çok mu var?
  • Bilinen bazı gerçekler
  • Bilinen gerçekleri genişleten kurallar

... ve hedefleri bulmak için genellikle bir birleştirme algoritmasıyla çalışan bir kesinti motoru olduğu yerde .


-1

Anlayabildiğim kadarıyla, Prolog gibi programlama sistemlerini tanımlamak için kullanılmaya başlandı, çünkü prolog (sözde) şeyleri soyut bir şekilde beyan etmekle ilgilidir.

Yukarıdaki kullanıcılar tarafından verilen tanıma sahip olduğu için giderek daha az anlam ifade etmektedir. HTML'nin bildirimsel programlamasına karşı Haskell'in bildirimsel programlaması arasında bir uçurum olduğu açık olmalıdır.


1
Deklaratif programlamanın kök niteliği saklanan değerlerin değişmezliği olduğundan, "HTML'nin bildirim programlamasına karşı Haskell'in bildirimsel programlama arasında bir uçurum" yoktur .
Shelby Moore III

Olursa olsun, tam bir programlama sistemine karşı olduğu gibi, örtük hesaplamalarında bile kısıtlanan alana özgü bir dil arasında adil bir fark vardır.
Marcin

Kabul. Tur-tamlık, depolanan değerlerin değişmezliğine diktir. Bu nedenle, açıklayıcı ve zorunlu özelliklerle karıştırmamalıyız. Bu "körfeze" neden olabilecek özelliklerden (Turing-completeeness) birini düşündüğünüz için teşekkür ederiz.
Shelby Moore III

Dönme tamlığı sadece sınırsız özyineleme gerektirir . Saklanan değerlerin değişmezliği, sınırsız özyinelemeyi engellemez. Böylece dik özelliklerdir.
Shelby Moore III

-2

Deklaratif programlamaya birkaç örnek daha:

  • Veri bağlama için ASP.Net işaretlemesi. Örneğin, "bu tabloyu bu kaynakla doldur" der ve bunun nasıl gerçekleştiğini sisteme bırakır.
  • Linq ifadeleri

Deklaratif programlama güzeldir, çünkü zihinsel kod modelinizi * basitleştirmeye yardımcı olabilir ve sonunda daha ölçeklenebilir olabilir.

Örneğin, bir dizideki veya listedeki her öğeye bir şeyler yapan bir işleviniz olduğunu varsayalım. Geleneksel kod şöyle görünür:

foreach (object item in MyList)
{
   DoSomething(item);
}

Orada büyük bir anlaşma yok. Peki ya daha bildirimsel sözdizimini kullanır ve bunun yerine DoSomething () öğesini bir Action olarak tanımlarsanız ne olur? O zaman şöyle söyleyebilirsiniz:

MyList.ForEach(DoSometing);

Bu elbette daha özlü. Ama eminim ki burada iki satır kod kaydetmekten daha fazla endişeniz var. Örneğin performans. Eski yol, işlemin sırayla yapılması gerekiyordu. .ForEach () yönteminin, işlemi otomatik olarak paralel olarak işleyebileceğini belirtmeniz için bir yolu olsaydı ne olurdu? Artık birdenbire kodunuzu çok güvenli bir şekilde çok iş parçacıklı hale getirdiniz ve yalnızca bir kod satırını değiştirdiniz. Ve aslında, .Net için tam da bunu yapmanızı sağlayan bir uzantı var.

  • Bu bağlantıyı izlerseniz, sizi bir arkadaşımın blog yayınına götürür. Tüm gönderi biraz uzun, ancak "Sorun" başlıklı başlığa ilerleyebilir ve sorun çıkmaz. *

1
Tanımlayıcı programlamayı değil, işlevsel programlamayı açıklıyorsunuz . Deklaratif programlama, saklanan değerleri mutasyona uğratmama özelliğine sahiptir .
Shelby Moore III

Bildirime programlama yapabilirsiniz depolanan değerleri mutasyona ... Eğer (declare) belirtmek sadece müzik neyi silmek yerine mutasyona hakkında gitmek için tam olarak nasıl tam bir mutasyona istiyorum. Sql bir sql INSERT veya UPDATE deyimi başka ne düşünüyorsun?
Joel Coehoorn

İşlevleriniz saf değilse, istenmeyen yan etkilerin bildirdiğiniz şey ile programın gerçek davranışı arasındaki ilişkiyi yok edebileceği noktasını kaçırıyorsunuz. Bunu yeni bir cevapta daha ayrıntılı olarak açıkladım .
Shelby Moore III

-3

Cevabı metne nasıl gönderdiğinize bağlıdır. Genel olarak programa belirli bir görünümde bakabilirsiniz, ancak soruna hangi açıyla baktığınıza bağlıdır. Programla başlayacağım: Dim Bus, Araba, Zaman, Yükseklik Integr

Yine sorunun genel olarak ne olduğuna bağlıdır. Program nedeniyle kısaltmanız gerekebilir. Umarım bu yardımcı olur ve eğer değilse geri bildirime ihtiyaç duyar. Teşekkür ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.