聲明式編程和命令式編程有什麼區別?

(What is the difference between declarative programing language and imperative programming language? )


寫了一個專題文章來回答這個問題 從年會看聲明式編程(Declarative Programming) - 知乎專欄


聲明式編程和命令式編程的比較

最近剛剛看的一個帖子,比較能解決你的問題。


聲明式:

食飯時,要坐好,不要說話。

命令式:

吃飯,坐好,靜音。


  • 命令式編程:命令「機器」如何去做事情(how),這樣不管你想要的是什麼(what),它都會按照你的命令實現。
  • 聲明式編程:告訴「機器」你想要的是什麼(what),讓機器想出如何去做(how)。

    參考:


個人理解 declarative programming 是相對更高層面的編程.

Declarative programming 聲明式:

蔬菜.做成菜(蔬菜沙拉)

Imperative programming 命令式:

洗乾淨(蔬菜)
混合(蔬菜, 沙拉)
放入盤中(混合物)


原文:聲明式編程和命令式編程的比較_知識庫_博客園

SQL為例

(聲明式「叫他做一件事,不用管怎麼做」)

SELECT * from dogs

INNER JOIN owners

WHERE dogs.owner_id = owners.id

(命令式的實現,需要你教他怎麼做)

//dogs = [{name: "Fido", owner_id: 1}, {...}, ... ]

//owners = [{id: 1, name: "Bob"}, {...}, ...] var dogsWithOwners = []

var dog, owner

for(var di=0; di &< dogs.length; di++) {

dog = dogs[di]

for(var oi=0; oi &< owners.length; oi++) {

owner = owners[oi]

if (owner dog.owner_id == owner.id) {

dogsWithOwners.push ({

dog: dog,

owner: owner

})

}

}}

}


一個是過程式

一個是結構式


謝邀,一個是寫步驟一個是下定義。


其實程序就是輸入→處理→輸出

命令式編程強調處理過程細節;而聲明式編程強調輸出結果整體。

例如:

命令式:for循環遍曆數組,關注運行原理,強調How

聲明式:Array.map遍曆數組,關注輸出結果,強調What

聲明式更加直觀,聲明式說白了就是對命令式的上層封裝。

最具有代表性的是SQL語言,聲明式語法直觀,易學,CRUD(增刪改查)分別是insert into ,select from ,update set 和delete from。

如果是在Javascript語言中,應該盡量用聲明式編程,盡量使用新規範的高級API(需要理解API內部演算法),如果關注ES新規範語法糖的話不難發現,很多都是開放的聲明式高級API。

一方面精簡很多代碼;另一方面邏輯會清晰很多。


意識到這個問題以後,是不是可以理解為聲明式是體現了封裝的一種寫法?好比聲明式編程和命令式編程的比較 | 外刊IT評論 這個鏈接提到的SQL,雖然這樣看上去非常的聲明式,可本質上是語言本身,或者說編譯器本身把這個聲明裡具體的執行已經命令化了。


https://medium.com/@Snowmanzzz/programming-fashion-declarative-programming-56f734a21f9a


If this is a question from homework, look into your slides. Any answer you get here are more likely to looks marks than getting them.

If not and you"re interested to know, start by looking at Wikipedia, of Imperative programming.


簡單的講,Imperative Programming Language (命令式語言)一般都有control flow, 並且具有可以和其他設備進行交互的能力。而Declarative Programming language (聲明式語言) 一般做不到這些。

在數據方面,Imperative Programming Language 在處理內存的時候,採用的是indexed region 的方式,處理起來更為嚴謹。而Declarative Programming Language 則一般不用考慮內存index的佔用問題。


推薦閱讀:

大家對於徐昊的《對象已死?》這篇文章怎麼看?

TAG:編程語言 | Python | 函數式編程 | YCombinator函數式編程 |