宣告式編程
宣告式編程(英語:Declarative programming)或譯為聲明式編程,是對與指令式編程不同的編程範型的一種合稱。它們建造計算機程序的結構和元素,表達計算的邏輯而不用描述它的控制流程[1]。
概述
常見的宣告式語言包括:資料庫查詢語言如SQL的查詢子集和XQuery,正則表達式,配置管理系統如Puppet管理配置語言。歸入這種範型的很多語言,描述問題領域內目標的性質,讓電腦明白目標,而非流程,從而嘗試極小化有關的副作用[2]。而指令式編程則需要用語言原語來明確的指出每一步該怎麼做[3]。
可歸入聲明式編程范型的領域專屬語言(DSL)還包括:yacc語法解析器,編譯說明語言Make等。DSL不需要是圖靈完全的,往往容易以一種純聲明式的方式來表達。很多文本標記語言例如HTML、MXML、XAML和XSLT往往是聲明式的。
定義
聲明式編程,通常被定義為除指令式以外的任何編程范型。同時存在一些其他的定義,簡單的將宣告式編程和命令式編程做對比,例如:
這些定義存在着一些重合。
子編程范型
聲明式編程是一個籠統的概念,除了一些特定的領域專屬語言之外,一些更加知名的編程范型也被歸類為其子范型。
邏輯式編程
邏輯編程通常被看做是形式邏輯的理論,把計算看做推導,透過函數、推理規則或重寫規則,來描述變數之間的關係。它的語言執行器(編譯器或解釋器)採用了一個固定的算法,以從這些關係產生結果。作為典型代表的Prolog語言,聲明關係並且對關係進行提問;它和許多邏輯編程語言,都允許副作用的存在。
函數式編程
函數式編程,嘗試最小化狀態帶來的副作用,因此可以被歸類入宣告式編程,它現在因大幅簡化了並行計算的編寫難度而備受關注[5]。除了純函數式編程語言如Haskell,多數函數式編程語言如Scheme、Clojure、OCaml、Standard ML等,允許副作用的存在。
約束式編程
在約束式編程中,變量之間的關係是在約束中說明的,定義了問題的解的範圍。這些約束然後被應用程序來求解,以使得每個變量獲得一個值,並讓最多的約束得到滿足。約束式編程經常被用作函數式編程、邏輯編程甚至指令式編程的補充,用來解決人工智能中的約束滿足問題。
參見
參考
- ^ Lloyd, J.W., Practical Advantages of Declarative Programming
- ^ declarative language. FOLDOC. 17 May 2004 [26 January 2020]. (原始內容存檔於2015-08-10).
- ^ Sebesta, Robert. Concepts of programming languages. Boston: Pearson. 2016. ISBN 978-0-13-394302-3. OCLC 896687896.
- ^ Chakravarty, Manuel M. T. On the Massively Parallel Execution of Declarative Programs (學位論文). Technische Universität Berlin. 14 February 1997 [26 February 2015]. (原始內容存檔於2015-09-23).
In this context, the criterion for calling a programming language declarative is the existence of a clear, mathematically established correspondence between the language and mathematical logic such that a declarative semantics for the language can be based on the model or the proof theory (or both) of the logic.
- ^ Marlow, Simon. Parallel and Concurrent Programming in Haskell: Techniques for Multicore and Multithreaded Programming. O'Reilly Media. 18 June 2013. ISBN 978-1449335946.
外部連結
- Frans Coenen. Characteristics of declarative programming languages. 1999.
- Robert Harper.
- Olof Torgersson. A Note on Declarative Programming Paradigms and the Future of Definitional Programming. 1996.