定義
聲明式編程通常被定義為任何不是必須的編程風格。還有其他一些常見的定義,試圖給這個術語一個定義,而不是簡單地將它與命令式編程對比。例如:
a.一個描述計算應該執行的高級程式。
b.任何缺乏副作用的程式語言(或者更具體地說,都是引用透明的)
c.與數學邏輯對應的語言。
這些定義基本上重疊。聲明式編程與命令式和程式式編程形成對比。聲明式編程是一種非必要的編程風格,其中程式在不明確列出必須執行的命令或步驟的情況下描述其預期結果。功能和邏輯程式語言的特點是聲明式編程風格。在邏輯程式語言中,程式由邏輯語句組成,程式通過搜尋語句的證明來執行。
在純粹的函式式語言中,比如Haskell,所有的函式都沒有副作用,而狀態變化只是表現為轉換狀態的函式,狀態被明確表示為程式中的第一類對象。儘管純粹的功能語言不是必需的,但它們通常提供一種功能描述作為一系列步驟的功能。其他函式式語言,如Lisp,OCaml和Erlang支持程式和函式式編程的混合。
一些邏輯程式語言(如Prolog)和資料庫查詢語言(如SQL)雖然原則上是聲明性的,但也支持程式式編程風格。
編程
聲明性編程是一個總括性術語,包括許多更為人熟知的編程範例。
約束編程
約束編程以指定目標解決方案屬性的約束形式表示變數之間的關係。通過給每個變數賦予一個值來解決這組約束,以便解決方案與約束的最大數目一致。約束規劃經常補充其他範式:功能性,邏輯性甚至是命令式編程。
特定於域的語言
眾所周知的聲明性域特定語言(DSL)的示例包括yacc解析器生成器輸入語言,QML,Make構建規範語言,Puppet的配置管理語言,正則表達式和SQL的子集(例如,SELECT查詢)。 DSL具有非常有用的優點,但不一定需要Turing-complete,這使得語言更容易純粹是聲明性的。
許多標記語言(如HTML,MXML,XAML,XSLT或其他用戶界面標記語言)通常都是聲明式的。例如,HTML僅描述網頁上應顯示的內容 - 它既不指定呈現頁面的控制流,也不指定頁面與用戶可能的互動。
截至2013年,一些軟體系統將傳統的用戶界面標記語言(例如HTML)與聲明性標記相結合,聲明性標記定義了後端伺服器系統應該做什麼(但不是如何)以支持聲明的接口。這種系統通常使用特定於域的XML名稱空間,可能包括SQL資料庫語法的抽象或使用表示狀態傳輸(REST)和SOAP對Web服務的參數化調用。
混合語言
例如,Makefiles以聲明方式指定了依賴關係,但也包括一個必要的行動列表。同樣,yacc聲明式地指定了一個上下文無關語法,但是包含來自宿主語言的代碼片斷,這通常是必要的(比如C)。
邏輯編程
邏輯程式語言,如Prolog狀態和查詢關係。回答這些查詢的具體細節取決於實現及其定理證明,但通常採取某種形式的統一。像函式式編程一樣,許多邏輯程式語言都允許有副作用,因此不是嚴格聲明式的。
建模
物理系統的模型或數學表示可以在聲明性的計算機代碼中實現。該代碼包含許多描述(“聲明”)行為關係的等式,而不是強制性的任務。當一個模型用這種形式表達時,計算機能夠執行代數操作來最好地制定解決方案算法。數學因果關係通常強加於物理系統的邊界,而系統本身的行為描述則是聲明性的或非因果性的。聲明式建模語言和環境包括Analytica,Modelica和Simile。