Atitit 提升開發效率 宣告式程式設計範式 目錄 1. 宣告式程式設計體系樹 1 1.1. 宣告式(對比:指令式,,主要包括 函數式,邏輯式程式設計) 2 1.2. 宣告式程式設計:表達與執行

2020-08-05 23:49:57

Atitit 提升開發效率  宣告式程式設計範式

 

目錄

1. 宣告式程式設計體系樹 1

1.1. 宣告式(對比:指令式,,主要包括 函數式,邏輯式程式設計) 2

1.2. 宣告式程式設計:表達與執行分離 3

1.3. 不僅表達當下,還表達未來 3

1.4. 不僅表達自己有的,還表達自己沒有的 3

2. 子程式設計範式[編輯] 4

2.1.1. 約束式程式設計[數據庫約束  註解約束 4

2.1.2. 領域專屬語言[編輯] 5

2.1.3. 函數語言程式設計[編輯] 5

2.1.4. 邏輯式程式設計[編輯] 5

 

 

  1. 宣告式程式設計體系樹

範式

宣告式

函數式

Lisp家族

 

ML家族

 

 

  •  

 

 

 

邏輯式

 

 

 

命令式

結構化

過程式

 

物件導向

 

 

 

非結構化

 

 

 

 

 

超程式設計

泛型

模板

 

 

 

 

反射化

 

 

 

 

 

 

 

 

 

 

    1. 宣告式程式設計:表達與執行分離

如果將指令式程式設計看作是一種「忠實的」表達(表達了就要執行,而且所表達的正是要執行的內容),那麼宣告式程式設計就是相當不老實的表達。

表達了可以不執行,甚至沒法執行

 宣告式程式設計中延遲計算是一個常見的特性,它極大增加了邏輯組織結構的靈活性。比如在WebMVC架構中

    1. 不僅表達當下,還表達未來

現代程式語言中標配的Promise物件,它表示了未來可以獲得的一個值,當我們還未真正得到這個值的時候,就可以把它作爲返回值返回,並在程式中作爲參數傳來傳去。

而在傳統的指令式程式設計概念中,函數的返回就表示執行完畢,如果是非同步執行,則只能通過回撥函數獲取通知,在概念層面上我們並無法直接定義和使用「未來的值」。

    1. 不僅表達自己有的,還表達自己沒有的

未來的值雖然現在未來,但畢竟未來可期。但如果根本不知道未來是否會來,那能否給它分配一個表達形式呢?

在groovy語言中,提供了類似Ruby的methodMissing機制 機製

 

整個軟件開發生態環境正在不斷向着宣告式和命令式水乳交融的方向發展。以前,爲了突出聲明式的部分,我們會選擇模板語言,即在描述性內容中嵌入少量的命令式控制邏輯。而在今天,出現了JSX這種直接將描述性內容嵌入到命令式上下文中的技術。更進一步,類似SwiftUI這種基於通用程式語言直接實現宣告式表達的技術正快步向我們走來

 

  1. 子程式設計範式[編輯]

宣告式程式設計是一個大的概念,其下包含一些有名的子程式設計範式。

      1. 約束式程式設計[數據庫約束  註解約束

約束式程式設計(英語:Constraint programming)中,變數之間的關係是在約束中說明的,定義了問題的解的範圍。這些約束然後被應用程式來求解,以使得每個變數獲得一個值,並讓最多的約束得到滿足。

約束式程式設計經常被用作函數語言程式設計、邏輯程式設計甚至指令式程式設計的補充。

 

約束程式設計

 約束程式設計Constraint programming)是一種程式設計典範,在這種程式設計範式中,變數之間的「關係」是以約束的形式陳述(組織)的。這些「關係(約束)」和指令式程式設計語言元素不同的是:它們並非明確說明了要去執行的步驟中的某一步,而是規範其解的一些屬性。這樣看來,約束程式設計是一種宣告式的程式設計範式。

 

      1. 領域專屬語言[編輯]

一些着名的宣告式領域專屬語言(DSLs)包括yacc語法分析器,編譯說明語言MakePuppet管理設定語言,正則表達式SQL的一些子集(例如Select queries等)。DSLs有時非常有用,並且不需要是圖靈完備的,這往往讓其很容易以一種純宣告式的方式來表達。

很多文字標示語言例如HTMLMXMLXAMLXSLT往往是宣告式的。

      1. 函數語言程式設計[編輯]

函數語言程式設計,特別是純函數語言程式設計,嘗試最小化狀態帶來的副作用,因此被認爲是宣告式的。大多數函數語言程式設計語言,例如SchemeClojureHaskellOCamlStandard MLUnlambda,允許副作用的存在。

      1. 邏輯式程式設計[編輯]

邏輯式程式設計語言如Prolog宣告關係並且對關係進行提問。同函數語言程式設計一樣,許多邏輯程式語言允許副作用的存在。