溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

多范式的編程語言是什么

發(fā)布時間:2020-12-30 14:36:18 來源:億速云 閱讀:417 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章給大家分享的是有關(guān)多范式的編程語言是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

多范式的編程語言有:1、面向?qū)ο缶幊?,提高軟件的重用性、靈活性和擴(kuò)展性;2、函數(shù)式編程,以數(shù)學(xué)函數(shù)為編程語言建模的核心的編程范式;3、泛型編程,提供了更高層級的抽象。

多范式的編程語言有:

概要:

本文主要講述了三種編程范式——面向?qū)ο缶幊?、函?shù)式編程、泛型編程的概念

編程范式

編程范式是程序語言背后的思想。代表了程序設(shè)計(jì)者認(rèn)為程序應(yīng)該如何被構(gòu)建和執(zhí)行的看法。常見的編程范式有:過程式,面向?qū)ο?,函?shù)式,泛型編程等。

一些編程語言是專門為某種特定范式設(shè)計(jì)的,例如C語言是過程式編程語言;Smalltalk和Java是較純粹的面向?qū)ο缶幊陶Z言;Haskell是純粹的函數(shù)式編程語言。另外一些編程語言和編程范式的關(guān)系并不一一對應(yīng),如Python,Scala,Groovy都支持面向?qū)ο蠛鸵欢ǔ潭壬系暮瘮?shù)式編程。C++是多范式編程語言成功的典范。C++支持和C語言一樣的過程式編程范式,同時也支持面向?qū)ο缶幊谭妒?,STL(Standard Template Library)使C++具有了泛型編程能力。支持多種范式可能是C++直到現(xiàn)在仍然具有強(qiáng)大的生命力的原因之一。

Swift是一門典型的多范式編程語言,即支持面向?qū)ο缶幊谭妒?,也支持函?shù)式編程范式,同時還支持泛型編程。Swift支持多種編程范式是由其創(chuàng)造目標(biāo)決定的。Swift創(chuàng)造的初衷就是提供一門實(shí)用的工業(yè)語言。不同于Haskell這類出自大學(xué)和研究機(jī)構(gòu)的學(xué)術(shù)性質(zhì)的編程語言。蘋果推出Swift時就帶著著明確的商業(yè)目的:Mac OS和iOS系統(tǒng)的主要編程語言O(shè)bjective-C已顯老態(tài),Swift將使得蘋果系統(tǒng)的開發(fā)者擁有一門更現(xiàn)代的編程語言,從而促進(jìn)蘋果整個生態(tài)圈的良性發(fā)展。

Swift的設(shè)計(jì)和開發(fā)無不體現(xiàn)著“實(shí)用的工業(yè)語言”這一目標(biāo)。這決定了Swift無法做極端的語言實(shí)驗(yàn),它需要在理智地面對現(xiàn)實(shí)的基礎(chǔ)上,謹(jǐn)慎地尋求突破。這就決定了Swift需要繼承歷史遺產(chǎn),照顧現(xiàn)在大多數(shù)程序員的現(xiàn)實(shí)需求,同時面向未來有所發(fā)展。

1、面向?qū)ο?繼承遺產(chǎn)

面向?qū)ο缶幊虒ο笞鳛槌绦虻幕締卧?,將程序和?shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴(kuò)展性。

面向?qū)ο缶幊痰暮诵母拍睿?/p>

  • 多態(tài),指由繼承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會做出不同的響應(yīng);

  • 繼承,在某種情況下,一個類會有“子類”。子類比原本的類(稱為父類)要更加具體化;

  • 封裝,面向?qū)ο蟪绦蛟O(shè)計(jì)隱藏了某一方法的具體執(zhí)行步驟,取而代之的是通過消息傳遞機(jī)制傳送消息給它。

以對象構(gòu)建程序的基本單元的面向?qū)ο缶幊陶Z言中。多態(tài)提供了更高的抽象能力,使得我們可以設(shè)計(jì)出更通用的程序。繼承提供了一種復(fù)用代碼的方法。封裝提供一種使用其他代碼更為便捷安全的機(jī)制。

現(xiàn)在絕大部分程序員的工作語言仍然是面向?qū)ο缶幊陶Z言。大部分流行的現(xiàn)代編程語言都會允許你創(chuàng)建對象。使用面向?qū)ο缶幊陶Z言,易于構(gòu)建軟件模型。因?yàn)?,對象很類似乎很容易和現(xiàn)實(shí)世界上的所有事物和概念。但編程實(shí)踐表明,并不是任何東西成為對象都是一件好事情。舉一個Java中的蹩足的例子:Java中只有對象才能作為參數(shù)傳入函數(shù)(當(dāng)然還有原始類型primitive type)。所以為了將函數(shù)傳遞給另外一個函數(shù),你需要將函數(shù)包裹在一個對象中,通常會用一個匿名類,因?yàn)檫@個類不會有其他作用,只是為了讓Java的一切皆為對象的設(shè)計(jì)高興。

Java擁有純粹的面向?qū)ο蟾拍?。它從設(shè)計(jì)之初,就希望以一切皆為對象的純對象模型來為世界建模。但發(fā)展到現(xiàn)在,Java中加入了越來越多非對象的東西。引入了閉包,從而獲得了函數(shù)式編程中的一級函數(shù);引入泛型,從而獲得了參數(shù)化的類型。這可能暗示了,這個世界是如此得豐富多彩,使用單一模式為世界建模并不會成功。

2、函數(shù)式編程-發(fā)展

函數(shù)式編程是一種以數(shù)學(xué)函數(shù)為編程語言建模的核心的編程范式。它將計(jì)算機(jī)運(yùn)算視為數(shù)學(xué)函數(shù)計(jì)算,并且避免使用程序狀態(tài)以及可變對象。

函數(shù)式編程思想主要有兩點(diǎn):

  • 以函數(shù)為編程語言建模的核心;

  • 避免狀態(tài)和可變性。

函數(shù)是函數(shù)式編程的基石。函數(shù)式編程語言的代碼就是由一個個函數(shù)的組合而成的。編寫函數(shù)式語言的過程就是設(shè)計(jì)函數(shù)。大規(guī)模程序由成千上萬的函數(shù)組成,為了有效的組合這些函數(shù)。函數(shù)式編程語言,會盡量避免狀態(tài),避免可變對象。沒有可變的狀態(tài),就使得函數(shù)式語言中的函數(shù)變?yōu)榱思兒瘮?shù)。純函數(shù)更容易模塊化,更容易理解,對于復(fù)用是友好的。

函數(shù)式編程語言也產(chǎn)生了一些有用的編程工具:

  • 一級函數(shù),閉包;

  • 柯里化函數(shù);

  • 惰性求值。

這些在后面的章節(jié)里都會提到。這些編程工具也越來越多地出現(xiàn)在其他編程語言中。

函數(shù)式編程語言并不年輕,它的歷史和面向?qū)ο缶幊桃粯佑凭谩?958年被創(chuàng)造出來的LISP是最古老的函數(shù)式編程語言。它比C語言年代更為久遠(yuǎn)。但直到最近函數(shù)式編程思想才逐漸被重視。幾乎所有新發(fā)明的編程語言都或多或少受到了函數(shù)式編程思想的影響。Python,Scala,Groovy,Swift都有一級函數(shù),閉包。使得你可以將函數(shù)直接傳給另外一個函數(shù),函數(shù)也能夠以返回值形式被另一個函數(shù)返回。消除狀態(tài),提供不變性的好處越來越多被接受,Scala,Groovy,Swift都提供了方便地聲明不可變對象的方法,以支持你編寫更趨近于函數(shù)式的風(fēng)格的代碼。

函數(shù)編程語言有其優(yōu)秀的地方,也許將來會成為一個重要的編程范式。但是,函數(shù)式編程語言的重要性可能更多會體現(xiàn)在影響其他編程語言的發(fā)展上。未來,可能很難出現(xiàn)一門主要以函數(shù)式編程范式設(shè)計(jì)的編程語言成為主流的編程語言。如同Java這樣的以單一編程范式(面向?qū)ο螅?gòu)建,而成為主流的編程語言的機(jī)會應(yīng)該不多了。而如同Haskell這樣追求純粹的函數(shù)式編程語言,更多的可能只是一個偏學(xué)術(shù)的語言實(shí)驗(yàn)。

再重復(fù)一次上一節(jié)的提到理由,這個世界是如此得豐富多彩,使用單一模式為世界建模并不會成功。

面向?qū)ο笈c函數(shù)式編程

如果,我們按語言范式給現(xiàn)在流行的語言分類。支持面向?qū)ο蟮木幊陶Z言應(yīng)該會是最長的隊(duì)伍?,F(xiàn)在大部分流行的現(xiàn)代編程語言都是面相對象的,它們都會允許你創(chuàng)建對象。但同時,你會發(fā)現(xiàn)比較流行的幾個編程語言,Python,Scala,甚至Java都或多或少得受到了函數(shù)式編程語言的影響。它們都引入一些函數(shù)式編程的概念,讓你一定程度上可以編寫出具有函數(shù)式風(fēng)格的代碼。

在熟悉了類面向?qū)ο缶幊陶Z言之后,再接觸函數(shù)式編程語言,常常會覺得耳目一新,甚至?xí)[約覺得函數(shù)式語言是救世良方。那我們是否應(yīng)該就此徹底轉(zhuǎn)向函數(shù)式編程語言呢?使用Haskell拯救世界。

面向?qū)ο缶幊陶Z言在大規(guī)模實(shí)踐之后,我們確實(shí)更深刻地了解了它們的缺點(diǎn)(例如,難以編寫多線程環(huán)境下的軟件應(yīng)用;繼承并不是代碼復(fù)用的好方法)。函數(shù)式語言也確實(shí)有不少優(yōu)點(diǎn),有些優(yōu)點(diǎn)恰恰就能解決面向?qū)ο笳Z言的問題(純函數(shù)十分適應(yīng)多線程環(huán)境,純函數(shù)天生就是模塊化的,對于代碼復(fù)用十分友好)。但是,函數(shù)式編程也許也存在某些問題。而這些問題,可能在更大規(guī)模的業(yè)界實(shí)踐之后才會暴露出來。現(xiàn)在我們已經(jīng)可以確信,單純以對象為世界建模是有困難的。那么以數(shù)學(xué)模型來為世界建??赡芤膊⒉粫玫侥睦锶?。可以確信的是,它們都有自己擅長的領(lǐng)域和環(huán)境。我們現(xiàn)在仍然還無法使用某種編程范式來解決所有問題。

而更大的現(xiàn)實(shí)是無數(shù)企業(yè)已經(jīng)在面向?qū)ο缶幊陶Z言上做了巨大的投資,即使現(xiàn)在面向?qū)ο缶幊桃呀?jīng)暴露出一些問題,而函數(shù)式編程又呈現(xiàn)出不少能解決這些問題的優(yōu)點(diǎn),任何一個謹(jǐn)慎的人都不會,也不可能馬上拋棄面向?qū)ο缶幊?,徹底全面地轉(zhuǎn)向函數(shù)式編程語言。

現(xiàn)實(shí)的選擇是支持面向?qū)ο缶幊痰耐瑫r,提供函數(shù)式的支持。這樣,在大部分面向?qū)ο笥稳杏杏嗟牡胤?,你仍然可以使用面向?qū)ο蟮姆椒?。而在適合函數(shù)式編程的地方,而你又擁有函數(shù)式編程的思維和能力時,你還是可以函數(shù)式的編程方法改善生產(chǎn)力。

3、泛型編程-美好的點(diǎn)綴

泛型編程是另外一個有趣的話題。泛型為程語言提供了更高層級的抽象,即參數(shù)化類型。換句話說,就是把一個原本特定于某個類型的算法或類當(dāng)中的類型信息抽象出來。這個抽象出來的概念在C++的STL(Standard Template Library)中就是模版(Template)。STL展示了泛型編程的強(qiáng)大之處,一出現(xiàn)就成為了C++的強(qiáng)大武器。除C++之外,C#,Java,Haskell等編程語言都引入了泛型概念。

泛型編程是一個稍微局部一些的概念,它僅僅涉及如何更抽象地處理類型,即參數(shù)化類型。這并不足以支撐起一門語言的核心概念。我們不會聽到一個編程語言是純泛型編程的,而沒有其他編程范式。但正因?yàn)榉盒筒⒉粫淖兂绦蛘Z言的核心,所以在大多數(shù)時候,它可以很好的融入到其他的編程方式中。C++,Scala,Haskell這些風(fēng)格迥異的編程語言都支持泛型。泛型編程提供了更高的抽象層次,這意味著更強(qiáng)的表達(dá)能力。這對大部分編程語言來說都是一道美味佐餐美酒。

在Swift中,泛型得到廣泛使用,許多Swift標(biāo)準(zhǔn)庫是通過泛型代碼構(gòu)建出來的。例如Swift的數(shù)組和字典類型都是泛型集。這樣的例子在Swift中隨處可見。

總結(jié)

這幾篇系列文章中,將主要以Swift為例,講解多范式編程語言。系列文章分為三部分討論Swift所支持三種編程范式:

  • 面向?qū)ο缶幊谭妒?/p>

  • 函數(shù)式編程范式

  • 泛型編程

感謝各位的閱讀!關(guān)于“多范式的編程語言是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI