多范式的編程語(yǔ)言有:1、面向?qū)ο缶幊蹋岣哕浖闹赜眯?、靈活性和擴(kuò)展性;2、函數(shù)式編程,以數(shù)學(xué)函數(shù)為編程語(yǔ)言建模的核心的編程范式;3、泛型編程,提供了更高層級(jí)的抽象。
多范式的編程語(yǔ)言有:
概要:
本文主要講述了三種編程范式——面向?qū)ο缶幊獭⒑瘮?shù)式編程、泛型編程的概念
編程范式
編程范式是程序語(yǔ)言背后的思想。代表了程序設(shè)計(jì)者認(rèn)為程序應(yīng)該如何被構(gòu)建和執(zhí)行的看法。常見的編程范式有:過(guò)程式,面向?qū)ο螅瘮?shù)式,泛型編程等。
一些編程語(yǔ)言是專門為某種特定范式設(shè)計(jì)的,例如C語(yǔ)言是過(guò)程式編程語(yǔ)言;Smalltalk和Java是較純粹的面向?qū)ο缶幊陶Z(yǔ)言;Haskell是純粹的函數(shù)式編程語(yǔ)言。另外一些編程語(yǔ)言和編程范式的關(guān)系并不一一對(duì)應(yīng),如Python,Scala,Groovy都支持面向?qū)ο蠛鸵欢ǔ潭壬系暮瘮?shù)式編程。C++是多范式編程語(yǔ)言成功的典范。C++支持和C語(yǔ)言一樣的過(guò)程式編程范式,同時(shí)也支持面向?qū)ο缶幊谭妒?,STL(Standard Template Library)使C++具有了泛型編程能力。支持多種范式可能是C++直到現(xiàn)在仍然具有強(qiáng)大的生命力的原因之一。
Swift是一門典型的多范式編程語(yǔ)言,即支持面向?qū)ο缶幊谭妒剑仓С趾瘮?shù)式編程范式,同時(shí)還支持泛型編程。Swift支持多種編程范式是由其創(chuàng)造目標(biāo)決定的。Swift創(chuàng)造的初衷就是提供一門實(shí)用的工業(yè)語(yǔ)言。不同于Haskell這類出自大學(xué)和研究機(jī)構(gòu)的學(xué)術(shù)性質(zhì)的編程語(yǔ)言。蘋果推出Swift時(shí)就帶著著明確的商業(yè)目的:Mac OS和iOS系統(tǒng)的主要編程語(yǔ)言O(shè)bjective-C已顯老態(tài),Swift將使得蘋果系統(tǒng)的開發(fā)者擁有一門更現(xiàn)代的編程語(yǔ)言,從而促進(jìn)蘋果整個(gè)生態(tài)圈的良性發(fā)展。
Swift的設(shè)計(jì)和開發(fā)無(wú)不體現(xiàn)著“實(shí)用的工業(yè)語(yǔ)言”這一目標(biāo)。這決定了Swift無(wú)法做極端的語(yǔ)言實(shí)驗(yàn),它需要在理智地面對(duì)現(xiàn)實(shí)的基礎(chǔ)上,謹(jǐn)慎地尋求突破。這就決定了Swift需要繼承歷史遺產(chǎn),照顧現(xiàn)在大多數(shù)程序員的現(xiàn)實(shí)需求,同時(shí)面向未來(lái)有所發(fā)展。
1、面向?qū)ο?繼承遺產(chǎn)
面向?qū)ο缶幊虒?duì)象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴(kuò)展性。
面向?qū)ο缶幊痰暮诵母拍睿?/p>
-
多態(tài),指由繼承而產(chǎn)生的相關(guān)的不同的類,其對(duì)象對(duì)同一消息會(huì)做出不同的響應(yīng);
-
繼承,在某種情況下,一個(gè)類會(huì)有“子類”。子類比原本的類(稱為父類)要更加具體化;
-
封裝,面向?qū)ο蟪绦蛟O(shè)計(jì)隱藏了某一方法的具體執(zhí)行步驟,取而代之的是通過(guò)消息傳遞機(jī)制傳送消息給它。
以對(duì)象構(gòu)建程序的基本單元的面向?qū)ο缶幊陶Z(yǔ)言中。多態(tài)提供了更高的抽象能力,使得我們可以設(shè)計(jì)出更通用的程序。繼承提供了一種復(fù)用代碼的方法。封裝提供一種使用其他代碼更為便捷安全的機(jī)制。
現(xiàn)在絕大部分程序員的工作語(yǔ)言仍然是面向?qū)ο缶幊陶Z(yǔ)言。大部分流行的現(xiàn)代編程語(yǔ)言都會(huì)允許你創(chuàng)建對(duì)象。使用面向?qū)ο缶幊陶Z(yǔ)言,易于構(gòu)建軟件模型。因?yàn)?,?duì)象很類似乎很容易和現(xiàn)實(shí)世界上的所有事物和概念。但編程實(shí)踐表明,并不是任何東西成為對(duì)象都是一件好事情。舉一個(gè)Java中的蹩足的例子:Java中只有對(duì)象才能作為參數(shù)傳入函數(shù)(當(dāng)然還有原始類型primitive type)。所以為了將函數(shù)傳遞給另外一個(gè)函數(shù),你需要將函數(shù)包裹在一個(gè)對(duì)象中,通常會(huì)用一個(gè)匿名類,因?yàn)檫@個(gè)類不會(huì)有其他作用,只是為了讓Java的一切皆為對(duì)象的設(shè)計(jì)高興。
Java擁有純粹的面向?qū)ο蟾拍?。它從設(shè)計(jì)之初,就希望以一切皆為對(duì)象的純對(duì)象模型來(lái)為世界建模。但發(fā)展到現(xiàn)在,Java中加入了越來(lái)越多非對(duì)象的東西。引入了閉包,從而獲得了函數(shù)式編程中的一級(jí)函數(shù);引入泛型,從而獲得了參數(shù)化的類型。這可能暗示了,這個(gè)世界是如此得豐富多彩,使用單一模式為世界建模并不會(huì)成功。
2、函數(shù)式編程-發(fā)展
函數(shù)式編程是一種以數(shù)學(xué)函數(shù)為編程語(yǔ)言建模的核心的編程范式。它將計(jì)算機(jī)運(yùn)算視為數(shù)學(xué)函數(shù)計(jì)算,并且避免使用程序狀態(tài)以及可變對(duì)象。
函數(shù)式編程思想主要有兩點(diǎn):
-
以函數(shù)為編程語(yǔ)言建模的核心;
-
避免狀態(tài)和可變性。
函數(shù)是函數(shù)式編程的基石。函數(shù)式編程語(yǔ)言的代碼就是由一個(gè)個(gè)函數(shù)的組合而成的。編寫函數(shù)式語(yǔ)言的過(guò)程就是設(shè)計(jì)函數(shù)。大規(guī)模程序由成千上萬(wàn)的函數(shù)組成,為了有效的組合這些函數(shù)。函數(shù)式編程語(yǔ)言,會(huì)盡量避免狀態(tài),避免可變對(duì)象。沒(méi)有可變的狀態(tài),就使得函數(shù)式語(yǔ)言中的函數(shù)變?yōu)榱思兒瘮?shù)。純函數(shù)更容易模塊化,更容易理解,對(duì)于復(fù)用是友好的。
函數(shù)式編程語(yǔ)言也產(chǎn)生了一些有用的編程工具:
-
一級(jí)函數(shù),閉包;
-
柯里化函數(shù);
-
惰性求值。
這些在后面的章節(jié)里都會(huì)提到。這些編程工具也越來(lái)越多地出現(xiàn)在其他編程語(yǔ)言中。
函數(shù)式編程語(yǔ)言并不年輕,它的歷史和面向?qū)ο缶幊桃粯佑凭谩?958年被創(chuàng)造出來(lái)的LISP是最古老的函數(shù)式編程語(yǔ)言。它比C語(yǔ)言年代更為久遠(yuǎn)。但直到最近函數(shù)式編程思想才逐漸被重視。幾乎所有新發(fā)明的編程語(yǔ)言都或多或少受到了函數(shù)式編程思想的影響。Python,Scala,Groovy,Swift都有一級(jí)函數(shù),閉包。使得你可以將函數(shù)直接傳給另外一個(gè)函數(shù),函數(shù)也能夠以返回值形式被另一個(gè)函數(shù)返回。消除狀態(tài),提供不變性的好處越來(lái)越多被接受,Scala,Groovy,Swift都提供了方便地聲明不可變對(duì)象的方法,以支持你編寫更趨近于函數(shù)式的風(fēng)格的代碼。
函數(shù)編程語(yǔ)言有其優(yōu)秀的地方,也許將來(lái)會(huì)成為一個(gè)重要的編程范式。但是,函數(shù)式編程語(yǔ)言的重要性可能