宣告式程式設計(英語:Declarative programming)或譯為宣告式程式設計,是對與指令式程式設計不同的程式設計範型的一種合稱。它們建造電腦程式的結構和元素,表達計算的邏輯而不用描述它的控制流程[1]

概述

常見的宣告式語言包括:資料庫查詢語言SQL的查詢子集和XQuery英語XQuery正則表達式組態管理系統如Puppet管理組態語言。歸入這種範型的很多語言,描述問題領域英語Domain knowledge內目標的性質,讓電腦明白目標,而非流程,從而嘗試極小化有關的副作用[2]。而指令式程式設計則需要用語言原語英語Language primitive來明確的指出每一步該怎麼做[3]

可歸入宣告式程式設計範式的領域專屬語言(DSL)還包括:yacc語法解析器,編譯說明語言Make等。DSL不需要是圖靈完全的,往往容易以一種純宣告式的方式來表達。很多文字標記式語言例如HTMLMXMLXAMLXSLT往往是宣告式的。

定義

聲明式程式設計,通常被定義為除指令式以外的任何程式設計範式。同時存在一些其他的定義,簡單的將宣告式程式設計和指令式程式設計做對比,例如:

  • 告訴電腦需要計算「什麼」而不是「如何」去計算的進階程式。
  • 明確的對應數理邏輯的程式語言[4]
  • 任何沒有副作用的程式語言,或者更確切一點,任何參照透明的程式語言。

這些定義存在着一些重合。

子程式設計範式

宣告式程式設計是一個籠統的概念,除了一些特定的領域專屬語言之外,一些更加知名的程式設計範式也被歸類為其子範式。

邏輯式程式設計

邏輯程式設計通常被看做是形式邏輯的理論,把計算看做推導,透過函數推理規則重寫規則,來描述變數之間的關係。它的語言執行器(編譯器直譯器)採用了一個固定的演算法,以從這些關係產生結果。作為典型代表的Prolog語言,聲明關係並且對關係進行提問;它和許多邏輯程式語言,都允許副作用的存在。

函數式程式設計

函數式程式設計,嘗試最小化狀態英語State (computer science)帶來的副作用,因此可以被歸類入宣告式程式設計,它現在因大幅簡化了平行計算的編寫難度而備受關注[5]。除了純函數式程式設計語言如Haskell,多數函數式程式設計語言如SchemeClojureOCamlStandard ML等,允許副作用的存在。

約束式程式設計

約束式程式設計中,變數之間的關係是在約束中說明的,定義了問題的解的範圍。這些約束然後被應用程式來求解,以使得每個變數獲得一個值,並讓最多的約束得到滿足。約束式程式設計經常被用作函數式程式設計、邏輯程式設計甚至指令式程式設計的補充,用來解決人工智能中的約束滿足問題

參見

參考

外部連結

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.