Bu terimi birçok farklı bağlamda attığımı duyuyorum. Bu ne?
Bu terimi birçok farklı bağlamda attığımı duyuyorum. Bu ne?
Yanıtlar:
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.
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.
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 yacc
olarak 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:
yacc
)Ve daha fazlası …
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.
gevşekçe:
Deklaratif programlama şunlara eğilimlidir: -
Zorunlu programlama şunlara eğilimlidir: -
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.
İş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.
Ü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.
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.
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:
İ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.
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.
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.
Functional programming
bu 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.
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
Ö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ı .
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.
DP'yi ifade etmenin bir yolu olduğu için açıklarım
... ve hedefleri bulmak için genellikle bir birleştirme algoritmasıyla çalışan bir kesinti motoru olduğu yerde .
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.
Deklaratif programlamaya birkaç örnek daha:
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.
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.