Atitit 提升開發效率 宣告式程式設計範式
目錄
1.1. 宣告式(對比:指令式,,主要包括 函數式,邏輯式程式設計) 2
按範式 |
|
如果將指令式程式設計看作是一種「忠實的」表達(表達了就要執行,而且所表達的正是要執行的內容),那麼宣告式程式設計就是相當不老實的表達。
表達了可以不執行,甚至沒法執行
宣告式程式設計中延遲計算是一個常見的特性,它極大增加了邏輯組織結構的靈活性。比如在WebMVC架構中
現代程式語言中標配的Promise物件,它表示了未來可以獲得的一個值,當我們還未真正得到這個值的時候,就可以把它作爲返回值返回,並在程式中作爲參數傳來傳去。
而在傳統的指令式程式設計概念中,函數的返回就表示執行完畢,如果是非同步執行,則只能通過回撥函數獲取通知,在概念層面上我們並無法直接定義和使用「未來的值」。
未來的值雖然現在未來,但畢竟未來可期。但如果根本不知道未來是否會來,那能否給它分配一個表達形式呢?
在groovy語言中,提供了類似Ruby的methodMissing機制 機製
整個軟件開發生態環境正在不斷向着宣告式和命令式水乳交融的方向發展。以前,爲了突出聲明式的部分,我們會選擇模板語言,即在描述性內容中嵌入少量的命令式控制邏輯。而在今天,出現了JSX這種直接將描述性內容嵌入到命令式上下文中的技術。更進一步,類似SwiftUI這種基於通用程式語言直接實現宣告式表達的技術正快步向我們走來
宣告式程式設計是一個大的概念,其下包含一些有名的子程式設計範式。
在約束式程式設計(英語:Constraint programming)中,變數之間的關係是在約束中說明的,定義了問題的解的範圍。這些約束然後被應用程式來求解,以使得每個變數獲得一個值,並讓最多的約束得到滿足。
約束式程式設計經常被用作函數語言程式設計、邏輯程式設計甚至指令式程式設計的補充。
約束程式設計
約束程式設計(Constraint programming)是一種程式設計典範,在這種程式設計範式中,變數之間的「關係」是以約束的形式陳述(組織)的。這些「關係(約束)」和指令式程式設計語言元素不同的是:它們並非明確說明了要去執行的步驟中的某一步,而是規範其解的一些屬性。這樣看來,約束程式設計是一種宣告式的程式設計範式。
一些着名的宣告式領域專屬語言(DSLs)包括yacc語法分析器,編譯說明語言Make,Puppet管理設定語言,正則表達式和SQL的一些子集(例如Select queries等)。DSLs有時非常有用,並且不需要是圖靈完備的,這往往讓其很容易以一種純宣告式的方式來表達。
很多文字標示語言例如HTML、MXML、XAML和XSLT往往是宣告式的。
函數語言程式設計,特別是純函數語言程式設計,嘗試最小化狀態帶來的副作用,因此被認爲是宣告式的。大多數函數語言程式設計語言,例如Scheme、Clojure、Haskell、OCaml、Standard ML和Unlambda,允許副作用的存在。
邏輯式程式設計語言如Prolog宣告關係並且對關係進行提問。同函數語言程式設計一樣,許多邏輯程式語言允許副作用的存在。