這篇文章是應(yīng)“編程新思路”COP小組之邀胶滋,對(duì)編程范式做一個(gè)專題分享。主要是自己在讀書悲敷、學(xué)習(xí)究恤、工作上的一些心得總結(jié),能力有限后德,希望能拋磚引玉部宿,一同探討。
為什么要了解編程范式和語言
到目前為止瓢湃,世界上約有2500種程序設(shè)計(jì)語言理张,其中一部分的族譜關(guān)系如下。
語言從世界觀上思考和影響軟件設(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)力寻狂。編程范式匯總表格如下:
過程式編程世界觀是:程序是由若干行動(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)手段。
參考資料:
- 《冒號(hào)課堂》
- 《程序設(shè)計(jì)語言--實(shí)踐之路》第三版
-- EOF--