許多現(xiàn)存的編程語(yǔ)言都可基于其計(jì)算模型加以分類,歸入某些語(yǔ)言族,或者屬于某種編程范式。按照不同的規(guī)則,可以有多種分類的方法,而且不同的學(xué)者對(duì)某些語(yǔ)言的具體歸屬也有不同的意見(jiàn)。這里我們給出一種語(yǔ)言譜系:
說(shuō)明式(Declarative )
函數(shù)式 Lisp,ML,Haskell
數(shù)據(jù)流 ld,Val
邏輯式 Prolog
基于模板的 XSLT
命令式( Imperative )
馮諾依曼 C,Ada,Fortran
腳本式 Perl,Python,PHP
面向?qū)ο?Smalltalk,C++,Java
值得注意的是這里并沒(méi)有列出所有的編程范式,因?yàn)橛行┚幊谭妒讲⒉荒馨匆陨系姆椒ㄟM(jìn)行分類,比如:元編程,泛型編程。另外還有一點(diǎn)就是并不是一種語(yǔ)言就只從屬于一種編程范式,事實(shí)上有些語(yǔ)言本身就是為支持多范式設(shè)計(jì)的,比如:Lisp就同時(shí)支持函數(shù)式編程、面向?qū)ο蟆⒃幊獭?br>
下面來(lái)分別介紹上面列出的幾種編程范式:
函數(shù)式(functional)語(yǔ)言采用一種基于函數(shù)的遞歸定義的計(jì)算模型。他們的靈感來(lái)自于lambda 演算。本質(zhì)上,程序被看作是一種從輸入到輸出的函數(shù),基于一些更簡(jiǎn)單的函數(shù),通過(guò)一種逐步精化的過(guò)程定義。函數(shù)式語(yǔ)言語(yǔ)言進(jìn)行計(jì)算的主要方式是將函數(shù)作用于給定參數(shù)之上的。在函數(shù)式語(yǔ)言的程序設(shè)計(jì)中可以沒(méi)有命令式語(yǔ)言所必需的那種變量,可以沒(méi)有賦值語(yǔ)句,也可以沒(méi)有循環(huán)。純函數(shù)式語(yǔ)言是沒(méi)有副作用的。從某種程序上,函數(shù)式語(yǔ)言代表了對(duì)計(jì)算機(jī)的一種數(shù)學(xué)模型(lambda 演算)的實(shí)現(xiàn)。Lisp是第一個(gè)函數(shù)式語(yǔ)言,但并不是純函數(shù)式語(yǔ)言。典型的函數(shù)式語(yǔ)言有F#、ML和Haskell。
數(shù)據(jù)流(Dataflow)語(yǔ)言將計(jì)算看成在一些基本的功能結(jié)點(diǎn)之間流動(dòng)的信息流。這些語(yǔ)言提供了一種具有內(nèi)在并行性的模型:結(jié)點(diǎn)由輸入單詞的到達(dá)觸發(fā),能夠并發(fā)操作。
邏輯式(Logic)或基于約束的(constrained-based)語(yǔ)言有命題邏輯得到靈感,他們把計(jì)算看作是一種目標(biāo)制導(dǎo)的搜索過(guò)程,設(shè)法根據(jù)一集邏輯規(guī)則找出滿足某些特定關(guān)系的值。Prolog是最有名的邏輯式語(yǔ)言。
馮諾依曼語(yǔ)言是我們最熟悉的,也是最成功的。所有把修改變量的值當(dāng)作最基本計(jì)算方式的語(yǔ)言都可以稱作馮諾依曼語(yǔ)言,包括我們熟悉的C,Fortran等待。這類語(yǔ)言是建立馮諾依曼體系結(jié)構(gòu)之上的。由于馮諾依曼體系結(jié)構(gòu),這類語(yǔ)言的核心有:模擬存儲(chǔ)單元的變量,基于傳輸操作的賦值語(yǔ)句,以及迭代形式的循環(huán)運(yùn)算。因此從某種程序上,這類語(yǔ)言是基于計(jì)算機(jī)的另一種數(shù)學(xué)模型(圖靈機(jī))的,實(shí)現(xiàn)了對(duì)計(jì)算機(jī)硬件結(jié)構(gòu)的抽象。函數(shù)式語(yǔ)言的基礎(chǔ)是具有值的表達(dá)式,而馮諾依曼語(yǔ)言的基礎(chǔ)是語(yǔ)句(特別是賦值),他們通過(guò)修改存儲(chǔ)器里面的值而產(chǎn)生副作用(side effect)的方法去影響后續(xù)計(jì)算。
腳本語(yǔ)言(Scripting)是馮諾依曼語(yǔ)言的一個(gè)子類,特點(diǎn)在于強(qiáng)調(diào)其主要用途是把用其他語(yǔ)言開(kāi)發(fā)的獨(dú)立程序作為部件“粘到一起”。Python就是著名的膠水語(yǔ)言,一些腳本語(yǔ)言都有特定的用途(比如 bash是nix系統(tǒng)的shell語(yǔ)言)。但是像Perl Python Ruby卻是希望作為通用語(yǔ)言的。
面向?qū)ο?/em>*(object-oriented)語(yǔ)言最早可以追溯到simula 67,但是真正讓面對(duì)對(duì)象流行起來(lái)的是smalltalk,甚至object-oriented這個(gè)詞就是smalltalk的作者發(fā)明的。大部分面向?qū)ο笳Z(yǔ)言都與馮諾依曼語(yǔ)言有很深的淵源,只是在存儲(chǔ)和計(jì)算兩方面采用了一種更加結(jié)構(gòu)化和分布式的模型。面向?qū)ο笳Z(yǔ)言將計(jì)算建立在獨(dú)立的對(duì)象的相互作用至上。每個(gè)對(duì)象有其自身的內(nèi)部狀態(tài),以及管理自身狀態(tài)的可執(zhí)行子程序。
最后要強(qiáng)調(diào)的一點(diǎn)是,語(yǔ)言類之間的劃分不是絕對(duì)的,劃分的方法也不止一種。這里再給出另一種常見(jiàn)的分類方法:
命令式編程
函數(shù)式編程
面向?qū)ο缶幊?br>
邏輯式編程
btw:這里的命令式編程語(yǔ)言就相當(dāng)于馮諾依曼語(yǔ)言,也基本等同于通常所說(shuō)的面向過(guò)程編程。
參考文獻(xiàn):程序設(shè)計(jì)語(yǔ)言-實(shí)踐之路 Michael Scott
程序設(shè)計(jì)原理 8th edition Robert W. Sebesta