許多現存的編程語言均可基於其計算模型加以分類,納入某些語言族,或者屬於某種編程範式。按照不一樣的規則,能夠有多種分類的方法,並且不一樣的學者對某些語言的具體歸屬也有不一樣的意見。這裏咱們給出一種語言譜系: html
說明式(Declarative )shell
函數式 Lisp,ML,Haskell 編程
數據流 ld,Valbash
邏輯式 Prolog併發
基於模板的 XSLT編程語言
命令式( Imperative )分佈式
馮諾依曼 C,Ada,Fortranide
腳本式 Perl,Python,PHP函數式編程
面向對象 Smalltalk,C++,Java函數
值得注意的是這裏並無列出全部的編程範式,由於有些編程範式並不能按以上的方法進行分類,好比:元編程,泛型編程。另外還有一點就是並非一種語言就只從屬於一種編程範式,事實上有些語言自己就是爲支持多範式設計的,好比:Lisp就同時支持函數式編程、面向對象、元編程。
下面來分別介紹上面列出的幾種編程範式:
函數式(functional)語言採用一種基於函數的遞歸定義的計算模型。他們的靈感來自於lambda 演算。本質上,程序被看做是一種從輸入到輸出的函數,基於一些更簡單的函數,經過一種逐步精化的過程定義。函數式語言語言進行計算的主要方式是將函數做用於給定參數之上的。在函數式語言的程序設計中能夠沒有命令式語言所必需的那種變量,能夠沒有賦值語句,也能夠沒有循環。純函數式語言是沒有反作用的。從某種程序上,函數式語言表明了對計算機的一種數學模型(lambda 演算)的實現。Lisp是第一個函數式語言,但並非純函數式語言。典型的函數式語言有F#、ML和Haskell。
數據流(Dataflow)語言將計算當作在一些基本的功能結點之間流動的信息流。這些語言提供了一種具備內在並行性的模型:結點由輸入單詞的到達觸發,可以併發操做。
邏輯式(Logic)或基於約束的(constrained-based)語言有命題邏輯獲得靈感,他們把計算看做是一種目標制導的搜索過程,設法根據一集邏輯規則找出知足某些特定關係的值。Prolog是最有名的邏輯式語言。
馮諾依曼語言是咱們最熟悉的,也是最成功的。全部把修改變量的值看成最基本計算方式的語言均可以稱做馮諾依曼語言,包括咱們熟悉的C,Fortran等待。這類語言是創建馮諾依曼體系結構之上的。因爲馮諾依曼體系結構,這類語言的核心有:模擬存儲單元的變量,基於傳輸操做的賦值語句,以及迭代形式的循環運算。所以從某種程序上,這類語言是基於計算機的另外一種數學模型(圖靈機)的,實現了對計算機硬件結構的抽象。函數式語言的基礎是具備值的表達式,而馮諾依曼語言的基礎是語句(特別是賦值),他們經過修改存儲器裏面的值而產生反作用(side effect)的方法去影響後續計算。
腳本語言(Scripting)是馮諾依曼語言的一個子類,特色在於強調其主要用途是把用其餘語言開發的獨立程序做爲部件「粘到一塊兒」。Python就是著名的膠水語言,一些腳本語言都有特定的用途(好比 bash是*nix系統的shell語言)。可是像Perl Python Ruby倒是但願做爲通用語言的。
面向對象(object-oriented)語言最先能夠追溯到simula 67,可是真正讓面對對象流行起來的是smalltalk,甚至object-oriented這個詞就是smalltalk的做者發明的。大部分面嚮對象語言都與馮諾依曼語言有很深的淵源,只是在存儲和計算兩方面採用了一種更加結構化和分佈式的模型。面嚮對象語言將計算創建在獨立的對象的相互做用至上。每一個對象有其自身的內部狀態,以及管理自身狀態的可執行子程序。
最後要強調的一點是,語言類之間的劃分不是絕對的,劃分的方法也不止一種。這裏再給出另外一種常見的分類方法:
命令式編程
函數式編程
面向對象編程
邏輯式編程
btw:這裏的命令式編程語言就至關於馮諾依曼語言,也基本等同於一般所說的面向過程編程。
參考文獻:程序設計語言-實踐之路 Michael Scott