編程范式與語言:函數(shù)式語言代碼簡潔案例

這篇文章是應(yīng)“編程新思路”COP小組之邀胶滋,對(duì)編程范式做一個(gè)專題分享。主要是自己在讀書悲敷、學(xué)習(xí)究恤、工作上的一些心得總結(jié),能力有限后德,希望能拋磚引玉部宿,一同探討。

為什么要了解編程范式和語言
到目前為止瓢湃,世界上約有2500種程序設(shè)計(jì)語言理张,其中一部分的族譜關(guān)系如下。

image.png

語言從世界觀上思考和影響軟件設(shè)計(jì)箱季,不同范式看待設(shè)計(jì)的角度也迥然不同,比如命令范式語言以狀態(tài)(變量)抽象現(xiàn)實(shí)世界棍掐,對(duì)象范式語言以對(duì)象對(duì)象現(xiàn)實(shí)世界藏雏,函數(shù)范式語言以計(jì)算(函數(shù))抽象現(xiàn)實(shí)時(shí)間。對(duì)現(xiàn)實(shí)問題的不同觀察視角,從根本上影響軟件開發(fā)者的思考方式和對(duì)軟件設(shè)計(jì)的認(rèn)識(shí)掘殴。
編程語言的產(chǎn)生和流行都有其時(shí)代背景赚瘦,比如,
在早期機(jī)器語言開發(fā)的低效率之下奏寨,需要更高效率的程序語言起意,結(jié)構(gòu)化設(shè)計(jì)思想應(yīng)運(yùn)而生,這一階段命令范式語言大放異彩病瞳,以C語言為杰出代表揽咕;
隨后,大規(guī)模軟件開發(fā)項(xiàng)目死亡率之高套菜,讓人們重新思考總結(jié)軟件設(shè)計(jì)原則和思想亲善,這時(shí)候面對(duì)對(duì)象設(shè)計(jì)思想脫穎而出,命令范式語言無法實(shí)踐這些新的軟件設(shè)計(jì)理念逗柴,新語言的產(chǎn)生勢在必然蛹头,這一段大量的對(duì)象范式語言涌現(xiàn),其中C++戏溺、Java語言的接受度最為廣泛渣蜗;
后來隨著多核CPU的推廣和分布式計(jì)算應(yīng)用場景問題的涌現(xiàn),為了將程序員從復(fù)雜的并發(fā)管理的焦油坑中解救出來旷祸,要求語言能提供一種合適的抽象機(jī)制對(duì)并發(fā)場景進(jìn)行描述耕拷,這時(shí)候函數(shù)范式和并發(fā)方式終于吸引了眾人的目光,成為聚光燈下的寵兒肋僧,這其中erlang斑胜、golang語言的關(guān)注度最高;
然后嫌吠,又發(fā)現(xiàn)在某些特定應(yīng)用領(lǐng)域止潘,通用語言無法完美地在問題域的抽象層次上進(jìn)行描述,針對(duì)不同的問題域辫诅,產(chǎn)生了大量的特定領(lǐng)域語言凭戴。由于DSL比通用語言更簡單、更抽象炕矮、更專業(yè)么夫、更接近自然語言,開發(fā)效率顯著提高肤视。此外尤為關(guān)鍵的是档痪,這種方式填補(bǔ)了專業(yè)程序員與業(yè)務(wù)分析員之間的鴻溝。

但是隨著軟件規(guī)模越來越大邢滑,需求越來越多腐螟,變更越來越快,為了管理快速膨脹的軟件復(fù)雜度,大量的語言乐纸、設(shè)計(jì)模式和框架涌現(xiàn)衬廷。面對(duì)這些新知識(shí)時(shí),我們常常感到困惑:0)為什么有這么多新語言汽绢、新設(shè)計(jì)模式吗跋、新框架?
1)如何快速的學(xué)習(xí)宁昭、掌握這些新語言跌宛、設(shè)計(jì)模式和框架,它們背后是否存在更普遍性的規(guī)律久窟?
2)基于A語言(如Java秩冈,Erlang)特性的設(shè)計(jì)模式如何借鑒并運(yùn)用到B語言(如C)上?
從抽象語義的角度看斥扛,設(shè)計(jì)模式入问、框架、庫都是語言的一種外延稀颁,說的苛刻點(diǎn)芬失,這些都是彌補(bǔ)語言缺陷的補(bǔ)丁。比如對(duì)于動(dòng)態(tài)類型語言匾灶,類型像變量一樣使用棱烂,很多創(chuàng)建型設(shè)計(jì)模式就沒用了。對(duì)于函數(shù)式語言阶女,函數(shù)像變量一樣使用颊糜,很多行為設(shè)計(jì)模式就沒用了。
通過深度學(xué)習(xí)編程范式和語言設(shè)計(jì)秃踩,才能撥開繁雜的設(shè)計(jì)模式迷霧衬鱼,從語言的本源來了解軟件設(shè)計(jì)的本質(zhì)和解決問題的思想和方法,讓我們快速把握語言的脈絡(luò)憔杨,進(jìn)而提高我們軟件設(shè)計(jì)的能力和語感鸟赫,加深理解設(shè)計(jì)模式、框架的意義消别。

編程范式的差異

編程范式的核心價(jià)值在于:突破原有的編程方式的某些限制抛蚤,帶來新思維和新方法,從而進(jìn)一步解放程序員的勞動(dòng)力寻狂。編程范式匯總表格如下:

image.png

過程式編程世界觀是:程序是由若干行動(dòng)指令組成的有序列表岁经;其方法論是:用變量來儲(chǔ)存數(shù)據(jù),用語句來執(zhí)行指令,其設(shè)計(jì)思想就是結(jié)構(gòu)化設(shè)計(jì)蛇券。擅長于面向用戶的缀壤,交互性強(qiáng)朽们、多為事件驅(qū)動(dòng)、業(yè)務(wù)邏輯復(fù)雜的應(yīng)用诉位。
函數(shù)式和邏輯式語言擅長基于數(shù)理邏輯的應(yīng)用,如并發(fā)菜枷、人工智能苍糠、符號(hào)處理、數(shù)據(jù)庫啤誊、編譯器等岳瞭。函數(shù)式編程中的高階函數(shù)與基本數(shù)據(jù)類型平起平坐,故可將代碼作數(shù)據(jù)用蚊锹,這是程序既簡潔又強(qiáng)大的原因之一瞳筏。回調(diào)機(jī)制采用的正是函數(shù)式風(fēng)格牡昆。
對(duì)象式雖然是在命令式的基礎(chǔ)上發(fā)展起來的姚炕,其本質(zhì)就是將相關(guān)的函數(shù)用數(shù)據(jù)粘合,重新包裝后再貼上對(duì)象的標(biāo)簽丢烘。對(duì)象式以對(duì)象為基本模塊單位柱宦,而對(duì)象是現(xiàn)實(shí)中具體事物和抽象概念的模擬,它更接近人類的認(rèn)知模式播瞳,編程者更容易也更樂于用這種方式編程肠套。過程式編程的理念是以過程為中心鸿捧,自頂向下、逐步求精。對(duì)象式則正相反鸡典,以數(shù)據(jù)為中心,自底向上乎完、逐步合并掰读。
并發(fā)式編程以進(jìn)程為導(dǎo)向 (Process-Oriented)、以任務(wù)為中心將系統(tǒng)模塊化姜贡。

編程范式舉例:
策略模式
python對(duì)象式實(shí)現(xiàn)

class Bisection (FindMinima):
        def algorithm(self,line):
                return (5.5,6.6)
class ConjugateGradient (FindMinima):
        def algorithm(self,line):
                return (3.3,4.4)
class MinimaSolver: # context class
        strategy=''
        def __init__ (self,strategy):
                self.strategy=strategy
        def minima(self,line):
                return self.strategy.algorithm(line)
        def changeAlgorithm(self,newAlgorithm):
                self.strategy = newAlgorithm
def test():
        solver=MinimaSolver(ConjugateGradient())
        print solver.minima((5.5,5.5))
        solver.changeAlgorithm(Bisection())
        print solver.minima((5.5,5.5))

python函數(shù)式實(shí)現(xiàn)

def bisection(line):
    return 5.5, 6.6
def conjugate_gradient(line):
    return 3.3, 4.4
def test():
    solver = conjugate_gradient
    print solver((5.5,5.5))
    solver = bisection
    print solver((5.5,5.5))

快排

C過程式實(shí)現(xiàn)

void quickSort(int* arr,int startPos, int endPos)
{
    int i,j;
    int key;
    key=arr[startPos];
    i=startPos;
    j=endPos;
    while(i<j)
    {
        while(arr[j]>=key && i<j)--j;
        arr[i]=arr[j];
        while(arr[i]<=key && i<j)++i;
        arr[j]=arr[i];
    }
    arr[i]=key;
    if(i-1>startPos)
        quickSort(arr,startPos,i-1);
    if(endPos>i+1)
        quickSort(arr,i+1,endPos);
} 

erlang函數(shù)式實(shí)現(xiàn)

qsort([]) -> [];

qsort([H|T])->
    qsort([LO || LO <- T, LO < H]) ++ [H] ++ qsort([HI || HI <- T, HI >= H]).

**編程語言的共性 **

上一節(jié)试吁,我們從宏觀角度上看語言,從2500種語言中總結(jié)出5種主要的編程范式楼咳。那么從微觀角度看語言熄捍,是否也可以從2500種語言中,找出共性呢母怜?答案是肯定的余耽。
有一種觀點(diǎn):軟件 = 數(shù)據(jù) + 算法。數(shù)據(jù)通過數(shù)據(jù)類型來描述苹熏,算法通過控制來描述碟贾,所以不管語言如何層出不窮币喧,所有語言的設(shè)計(jì)離不開2個(gè)基本面:控制流和數(shù)據(jù)類型。并且為了提升其描述能力袱耽,提供了控制抽象和數(shù)據(jù)抽象杀餐。這是一個(gè)宏大的話題史翘,這里就不展開說洪唐,下面這張腦圖基本涵蓋了語言設(shè)計(jì)中控制流、控制抽象溅潜、數(shù)據(jù)類型和數(shù)據(jù)抽象的核心問題和實(shí)現(xiàn)手段。


參考資料:

  1. 《冒號(hào)課堂》
  2. 《程序設(shè)計(jì)語言--實(shí)踐之路》第三版

-- EOF--

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市槐沼,隨后出現(xiàn)的幾起案子肖油,更是在濱河造成了極大的恐慌审孽,老刑警劉巖筋遭,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件次和,死亡現(xiàn)場離奇詭異踏施,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)罕邀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門畅形,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诉探,你說我怎么就攤上這事日熬。” “怎么了肾胯?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵竖席,是天一觀的道長。 經(jīng)常有香客問我敬肚,道長毕荐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任艳馒,我火速辦了婚禮憎亚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弄慰。我一直安慰自己第美,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布陆爽。 她就那樣靜靜地躺著斋日,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墓陈。 梳的紋絲不亂的頭發(fā)上恶守,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天第献,我揣著相機(jī)與錄音,去河邊找鬼兔港。 笑死庸毫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衫樊。 我是一名探鬼主播飒赃,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼科侈!你這毒婦竟也來了载佳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤臀栈,失蹤者是張志新(化名)和其女友劉穎蔫慧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體权薯,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姑躲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盟蚣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黍析。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屎开,靈堂內(nèi)的尸體忽然破棺而出阐枣,到底是詐尸還是另有隱情,我是刑警寧澤奄抽,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布侮繁,位于F島的核電站,受9級(jí)特大地震影響如孝,放射性物質(zhì)發(fā)生泄漏宪哩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一第晰、第九天 我趴在偏房一處隱蔽的房頂上張望锁孟。 院中可真熱鬧,春花似錦茁瘦、人聲如沸品抽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圆恤。三九已至,卻和暖如春腔稀,著一層夾襖步出監(jiān)牢的瞬間盆昙,已是汗流浹背羽历。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淡喜,地道東北人秕磷。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像炼团,于是被迫代替她去往敵國和親澎嚣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容