3 回答

TA貢獻1893條經(jīng)驗 獲得超10個贊
這些實際上并沒有任何明確,客觀的定義。這是我如何定義它們:
勢在必行 -重點在于計算機應(yīng)采取的步驟,而不是計算機將要執(zhí)行的操作(例如C,C ++,Java)。
聲明式 -重點在于計算機應(yīng)該做什么而不是應(yīng)該如何做(例如SQL)。
功能性 -聲明性語言的子集,主要關(guān)注遞歸

TA貢獻2080條經(jīng)驗 獲得超4個贊
命令式和聲明式描述了兩種相反的編程風(fēng)格。命令式是傳統(tǒng)的“循序漸進配方”方法,而聲明式則更是“這就是我想要的,現(xiàn)在您要確定如何做”。
這兩種方法在整個編程過程中都會發(fā)生-即使使用相同的語言和相同的程序。通常,聲明式方法被認為是更可取的,因為它使程序員不必指定太多細節(jié),同時也減少了錯誤發(fā)生的機會(如果您描述了所需的結(jié)果,并且經(jīng)過良好測試的自動過程可以從此倒退為定義步驟,那么您可能希望事情比手動指定每個步驟更可靠)。
另一方面,命令式方法可以為您提供更多的低級控制-這是編程的“微管理器方法”。這樣可以使程序員利用有關(guān)問題的知識來給出更有效的答案。因此,以聲明性的方式編寫程序的某些部分并不罕見,而對于速度至關(guān)重要的部分則更為必要。
就像您想象的那樣,用于編寫程序的語言會影響您的聲明式能力-一種內(nèi)置“智能”語言的語言,用于在給出結(jié)果描述的情況下確定要做什么,這將使聲明性更強這種方法比程序員需要先在命令式代碼中添加這種智能,然后才能夠在頂部構(gòu)建更具說明性的層的方法要多。因此,例如,像prolog這樣的語言被認為是非常聲明性的,因為它具有內(nèi)置的搜索答案的過程。
到目前為止,您會注意到我還沒有提到函數(shù)式編程。那是因為這是一個其含義與其他兩個含義沒有直接關(guān)系的術(shù)語。最簡單的函數(shù)式編程意味著您可以使用函數(shù)。特別是,您使用支持功能作為“第一類值”的語言-這意味著您不僅可以編寫函數(shù),而且可以編寫編寫函數(shù)的函數(shù)(編寫編寫的函數(shù),并將...傳遞給職能。簡而言之-函數(shù)像字符串和數(shù)字一樣靈活且通用。
因此,經(jīng)常將功能性,命令性和聲明性一起提到是很奇怪的。原因是將功能編程的想法“極端化”的結(jié)果。從最純粹的意義上講,一個函數(shù)是數(shù)學(xué)中的東西-一種“黑匣子”,需要一些輸入并始終提供相同的輸出。這種行為不需要存儲更改的變量。因此,如果您設(shè)計一種旨在實現(xiàn)非常純凈,受數(shù)學(xué)影響的函數(shù)式編程思想的編程語言,您最終會在很大程度上拒絕可以改變的值(在某種特定的,有限的技術(shù)意義上)的思想。
如果這樣做-如果限制了變量的更改方式-幾乎無意中,您最終會迫使程序員編寫更具聲明性的程序,因為命令式編程的很大一部分都在描述變量的更改方式,并且您不能再去做!因此事實證明,函數(shù)式編程(尤其是使用函數(shù)式語言的編程)往往會提供更具說明性的代碼。
總結(jié)一下,然后:
命令式和聲明式是兩種相反的編程樣式(相同的名稱用于鼓勵使用這些樣式的編程語言)
函數(shù)式編程是一種編程樣式,其中函數(shù)變得非常重要,結(jié)果,更改值變得不那么重要。指定值更改的能力有限,這會強制采用更具聲明性的樣式。
因此“函數(shù)式編程”通常被稱為“聲明式”。
添加回答
舉報