編程語言主要有四種類型
聲明式編程:專注於」做什麼」而不是」如何去做」。在更高層面寫代碼,更關心的是目標,而不是底層演算法實現的過程。
ex: css, 正則表達式,sql 語句,html, xml…
命令式編程(過程式編程) : 專注於」如何去做」,這樣不管」做什麼」,都會按照你的命令去做。解決某一問題的具體演算法實現。
函數式編程:把運算過程盡量寫成一系列嵌套的函數調用。
函數式編程強調沒有」副作用」,意味著函數要保持獨立,所有功能就是返回一個新的值,沒有其他行為,尤其是不得修改外部變數的值。
所謂」副作用」(side effect),指的是函數內部與外部互動(最典型的情況,就是修改全局變數的值),產生運算以外的其他結果。
② 為什麼說面向對象編程和函數式編程
先從結構化編程說起
很久以前,軟體開發的世界還是一片渾渾噩噩,不管開發什麼軟體都面臨著復雜性這個問題,代碼裡面到處是goto語句,程序的流程隨意跳轉。眾生寫代碼時,越寫到後面越不知道自己寫的是什麼。這時候出現一位巨人,它就是結構化編程。
結構化編程的基本思想是:
有序地控制流程,即把程序的執行順序限制為順序、分支和循環這三種;
把共通的處理歸結為常式(函數)。
結構化編程的好處是:
三大限制:大大降低了程序的自由度,減少了各種組合,使得程序不至於太過復雜。對於這一點,結構化編程的順序、分支和循環可以實現一切演算法,雖然降低了程序的復雜性和靈活性,但是程序的實現能力並沒有降低。
常式(函數):我們只需要知道過程(函數)的名字,而不需要知道過程的內部細節,即「黑盒化」。
雖然結構化解決了程序控制流的復雜問題,但程序裡面不僅包括控制結構,還包括要處理的數據。隨著處理數據的增加,程序的復雜性也會上升。這時候,面向對象編程來了!
面向對象的由來
「分別管理程序處理內容和處理數據對象所帶來的復雜性」問題是,為了得到正確的結果,必須保持處理和數據的一致性,這在結構化編程中是非常困難的,解決這一問題的方案就是數據抽象技術。
數據抽象是數據和處理方法的結合。這便是最初「對象」一詞的得來。面向對象編程也因此得名。
然後,從抽象原則來說,多個相同事物出現時,應該組合在一起,即DRY原則(Don't Repeat Yourself),便又引出了類這一概念。
根據數據類型來進行合適的處理(調用合適的方法),本來就應該是編程語言這種工具應該完成的事。這便是多態的引出了。
而對於繼承,大部分的觀點是「繼承是隨著程序的結構化和抽象化自然進化而來的一種方式」。結構化和抽象化,意味著把共通部分提取出來生成父類的自底向上的方法。(如果繼承是這樣誕生的話,那麼最初,有多個父類的多重繼承就會成為主流,而實際上最初引入繼承的Simula語言只提供單一繼承。松本行弘認為繼承的原本目的實際是逐步細化)
③ 函數式編程和響應式編程有什麼區別
1. 我暫且認為你說的RP是指Rx*框架的Reactive programming,(如果不是,就先認為是一下吧)
Rx*框架的RP,其實應該叫FRP(Functional Reactive Programming)(誤,感謝 邵成的指正,具體見補充部分),那和FP基本上就是一種派生(derive)關系了
FRP基本上就是面向非同步事件流的編程了,這個非同步事件流叫:Observable,一般叫:Stream
Stream就是一個 按時間排序的Events(Ongoing events ordered in time)序列
Stream是不可變(Immutability)的,任何操作都返回新的Stream, 且它是一個Monad(它有map和flatMap方法)。
FRP的關注點在Stream,而FP的關注點在(Type, Operate),Stream -> (Type, Operate)是一種泛化(generic),(Type, Operate) -> Stream 是一種派生。
RP本身是建立於觀察者模式之上的一種編程範式(級別同MV*),FP則更偏向底層解決一般化問題。
④ 什麼是積木式編程
就是把各種功能的代碼,封裝成模塊,比如有ADC功能,I2C功能,ISP功能,串口,定時器。。。等等全都封裝好,需要用什麼功能直接復制過來引用就可以了,因為介面都是按照某一特殊定義封裝好的,編程就像堆積木一樣。所以稱為積木式編程
⑤ 為什麼要用函數式編程
以 C 語言源程序為例,使用函數式的編程風格主要是有利於程序的調試!而且程序的可讀性也很好。程序思路很清楚!!以下面的源程序進行講解就一目瞭然了。在以下題目中,三次用到了求階乘的代碼(A!、(A-B)!、B!),現在使用調用子函數的編程風格,程序簡潔明了、且可讀性很強。如果不使用函數式編程,那麼求階乘的代碼你就必須要重復三次。你說到底是哪一種編程風格好呢?
例如:求組合數C(A,B) = A!/( (A-B)! * B! )
int jie_cheng( int ) ;
void main( )
{
int a = 0,b = 0 , c = 0 ;
scanf("%d %d",&a,&b);
c = jie_cheng(a) / (jie_cheng(a-b)*jiecheng(b)) ;
printf("Zu he shu C is: %d\n", c);
}
int jie_cheng(int num)
{
if( num == 1)
return 1 ;
else
return num*jie_cheng(num-1) ;
}
⑥ 對話式編程 什麼意思
大概是一種 數控機床操作語言,這種編程語言主要針對即時工作中使用的,對於數控機床的工作所使用的一種編程,也可以想像成是人與數控機床之間對話所使用的一種語言。
⑦ 什麼是過程式編程
通俗點:面向過程是以代碼為中心,組織編程過程。面向對象,是以一個具體的對象為中心,比如程序中的按鈕,列表框等等組件,需要掌握繼承等關鍵概念。
⑧ 函數式編程是什麼意思
C語言是面向過程的編程,它的最重要特點是函數,通過主函數來調用一個個子函數。程序運行的順序都是程序員決定好了的。它是我學的第一種程序語言。 C++是面向對象的編程,類是它的主要特點,程序執行過程中,先由主函數進入,定義一些類,根據需
⑨ 什麼是函數式編程思維
試著把函數想像成一個根據一個指定輸入產出指定輸出的黑盒,就能簡化成邏輯電路中的各種門的樣子或者是各種流通管道的樣子。
然後試想數據通過這些組合起來的管道/門,變成你要的結果。
或者是通過現有的管道或門,構建(抽象)出更復雜/更通用的管道/門。
這就是函數式編程。
任何支持函數的語言都可以進行函數式風格的編程 注意到與命令式風格不同的是沒有賦值,這意味著reason 程序的時候每個變數的值是不變的 不用考慮程序變數隨著時間的變化 -- 大大降低了程序的復雜性。
既然C/C++(98) 也能進行函數式風格的編程 為什麼不認為它是一門函數式語言呢,因為需要容易的進行函數式編程需要以下幾個語言特性支持
closure
按照上面的三條規則函數式是first class 的 是可以直接傳遞作為參數的,而因為lambda演算作用於是lexical scope 的,variable capture 意味著語言要支持GC才能更方便的操作。 這意味著像Java(8以前), C/C++ 這兩門工業界語言函數式編程並不非常適合.
2. 高階類型推斷
因為函數可以作為參數,其類型可以非常復雜 比如下面的函數類型其實非常普遍:
val callCC : (('a -> 'b -> 'c) -> ('a -> 'c) -> 'd) -> ('a -> 'c) -> 'd
如果沒有類型推斷,其實很難寫對或者理解它的語義
3. tail-call
因為函數式風格沒有賦值,也就沒有for循環, 要實現循環操作 只能通過遞歸調用, 比如下面簡單的例子:
let rec even n = if n = 0 then true else if n = 1 then false else odd (n - 1)
and odd n = if n = 1 then true else if n = 0 then false else even (n - 1)
這需要編譯器保證上面的例子不能有stackoverflow 能提供這樣保證的編譯器並不多,比如所謂的 "函數式" 語言scala 就不能提供這種保證 也就實際上不是函數式語言.
相比函數式風格我覺得更重要的一個語言特性的時代數數據類型和模式匹配
⑩ 函數式編程有什麼弊端
不論是面向對象編程還是函數式編程,如果你走了極端,那都是錯誤的。面向對象編程的極端是一切都是對象(純面向對象)。函數式編程的極端是純函數式編程語言。
面向對象編程的問題
面向對象的問題在於它對「對象」的定義,它試圖將所有事情就納入到這個概念里。這種做法極端化後,你就得出來一個一切皆為對象思想。
但這種思想是錯誤的,因為有些東西不是對象。函數就不是對象。