編程範例 |
---|
編程範例是一種根據編程語言的特性對編程語言進行分類的方法。語言能夠分爲多種範例。php
一些範例主要涉及對語言執行模型的影響,例如容許反作用,或者操做序列是否由執行模型定義。其餘範例主要關注代碼的組織方式,例如將代碼分組爲單元以及代碼修改的狀態。還有一些人主要關注語法和語法的風格。程序員
容許程序引用自身的符號技術(如反射)也能夠被視爲編程範例。然而,這與主要範例兼容,所以自己並非真正的範例。數據庫
例如,屬於命令範式的語言有兩個主要特徵:它們代表操做發生的順序,顯式控制該順序的結構,而且它們容許反作用,其中狀態能夠在一個時間點被修改,在一個代碼單元內,而後在不一樣的代碼單元內的不一樣時間點讀取。代碼單元之間的通訊不明確。同時,在面向對象的編程中,代碼被組織成包含狀態的對象,該狀態僅由做爲對象一部分的代碼修改。大多數面向對象的語言也是命令式語言。相比之下,語言符合聲明範式不要說明執行操做的順序。相反,它們提供系統中可用的許多操做,以及容許每一個操做執行的條件。語言執行模型的實現跟蹤哪些操做能夠自由執行並自行選擇順序。更多 關於多範式編程語言的比較。編程
正如軟件工程(做爲一個過程)由不一樣的方法定義同樣,編程語言(做爲計算模型)也是由不一樣的範例定義的。有些語言旨在支持一種範式(Smalltalk支持面向對象編程,Haskell支持函數式編程),而其餘編程語言支持多種範式(如Object Pascal,C ++,Java,C#,Scala,Visual Basic,Common Lisp,Scheme,Perl,PHP,Python,Ruby,Wolfram語言,Oz和F#)。例如,用C ++,Object Pascal或PHP編寫的程序能夠純粹是程序性的,純粹是面向對象的,或者能夠包含二者或其餘範例的元素。軟件設計者和程序員決定如何使用這些範例元素。數組
在面向對象的編程中,程序被視爲一組交互對象。在函數式編程中,程序被視爲一系列無狀態函數評估。當編程具備許多處理器的計算機或系統時,在面向過程的編程中,程序被視爲做用於邏輯共享數據結構的併發進程集。網絡
許多編程範式是衆所周知的,他們的技術禁止爲那些他們啓用。例如,純函數式編程不容許使用反作用,而結構化編程則不容許使用goto語句。部分因爲這個緣由,新範式一般被習慣於早期風格的人視爲教條主義者或過分刻板。[6]然而,避免使用某些技術能夠更容易理解程序行爲,並證實程序正確性的定理。數據結構
編程範例也能夠與容許僅使用API 調用執行模型的編程模型進行比較。基於執行模型的特徵,編程模型也能夠被分類爲範例。併發
對於並行計算,使用編程模型而不是語言是常見的。緣由是並行硬件的細節泄漏到用於編程硬件的抽象中。這致使程序員必須將算法中的模式映射到執行模型中的模式(因爲硬件泄漏到抽象中而插入)。所以,沒有一種並行編程語言能夠很好地映射到全部計算問題。所以,經過編程模型使用基本順序語言並將API調用插入到並行執行模型中更方便。這種並行編程模型能夠根據反映硬件的抽象進行分類,例如共享內存,帶消息傳遞的分佈式內存,地方概念在代碼中可見,等等。這些能夠被認爲是僅適用於並行語言和編程模型的編程範例的風格。dom
一些編程語言研究人員批評範式概念做爲編程語言的分類,例如Harper,[7]和Krishnamurthi。[8] 他們認爲許多編程語言不能嚴格地歸爲一種範式,而是包含幾種範式的特徵。請參閱多範式編程語言的比較。
編程的不一樣方法隨着時間的推移而發展,在當時或回顧性地被識別。有意識地肯定的早期方法是自20世紀60年代中期以來提倡的結構化編程。這種「編程範式」的概念至少能夠追溯到1978年,在羅伯特·W·弗洛伊德的圖靈獎演講中,題爲「編程範式」,其中引用了托馬斯庫恩在他的科學結構中使用範式的概念。革命(1962年)。[9]
在最低級別的編程範例是機器代碼,直接表示指令(程序存儲器的內容)做爲數字序列,和彙編語言,其中所述機器指令由助記符和表示存儲器地址可被指定符號的標籤。這些有時被稱爲第一代和第二代語言。
在20世紀60年代,彙編語言被開發用於支持庫COPY和很是複雜的條件宏生成和預處理能力,CALL到(子例程),外部變量和公共部分(全局變量),經過使用實現重要的代碼重用和硬件細節隔離邏輯運算符,如READ / WRITE / GET / PUT。裝配過去,如今仍然用於時間關鍵系統,一般用於嵌入式系統,由於它能夠最直接地控制機器的功能。
下一步的進展是程序語言的發展。這些第三代語言(首先被描述爲高級語言)使用與正在解決的問題相關的詞彙。例如,
全部這些語言都遵循程序範式。也就是說,他們一步一步地描述了至少應該遵循特定程序員來解決特定問題的程序。所以,任何此類解決方案的功效和效率都徹底是主觀的,而且高度依賴於程序員的經驗,創造性和能力。
隨着過程語言的普遍使用,建立了面向對象編程(OOP)語言,例如Simula,Smalltalk,C ++,C#,Eiffel,PHP和Java。在這些語言中,操做它的數據和方法被保存爲一個稱爲對象的單元。經過完美的封裝,OOP的一個顯着特徵,另外一個對象或用戶可以訪問數據的惟一方法是經過對象的方法。所以,能夠在不影響使用該對象的任何代碼的狀況下改變對象的內部工做。還有一些爭議,由提出亞歷山大·斯捷潘諾夫,理查德·斯托曼[10]和其餘程序員,關於OOP範式與程序模式的功效。每一個對象都須要有關聯方法,這使得一些懷疑論者將OOP與軟件膨脹聯繫在一塊兒; 經過多態性來解決這種困境的嘗試。
由於面向對象編程被認爲是範式而不是語言,因此甚至能夠建立面向對象的彙編語言。高級程序集(HLA)就是一個例子,它徹底支持高級數據類型和麪向對象的彙編語言編程 - 儘管它起源較早。所以,能夠看到不一樣的編程範式,而不是他們的倡導者的動機模因,而不是必然表明從一個級別到下一個級別的進展[ 須要的引證 ]。因爲新的和不一樣的術語適用於相似的實體和過程以及跨語言的衆多實現區別,所以對競爭範例的功效的精確比較常常變得更加困難。
文學編程做爲一種命令式編程形式,將程序構建爲以人爲中心的網絡,如在超文本文章中:文檔是程序不可或缺的一部分,程序的結構遵循散文闡述的邏輯,而不是編譯器的便利性。
獨立於命令式分支,開發了聲明性編程範例。在這些語言中,計算機被告知問題是什麼,而不是如何解決問題 - 程序被構造爲一組屬性以在預期結果中找到,而不是做爲要遵循的過程。給定數據庫或一組規則,計算機嘗試找到匹配全部所需屬性的解決方案。聲明性語言的原型是第四代語言 SQL,以及函數式語言和邏輯編程系列。
函數式編程是聲明式編程的一個子集。使用此範例編寫的程序使用函數,旨在表現爲數學函數的代碼塊。函數式語言不鼓勵經過賦值改變變量的值,而是大量使用遞歸。
該邏輯編程範式的意見做爲計算自動推理對知識的身體。關於問題域的事實表示爲邏輯公式,而且經過對它們應用推理規則來執行程序,直到找到問題的答案,或者證實公式集不一致。
符號編程是一種範例,描述了可以將公式和程序組件做爲數據進行操做的程序。[3] 所以,程序能夠有效地修改本身,而且彷佛「學習」,使它們適用於人工智能,專家系統,天然語言處理和計算機遊戲等應用程序。支持這種範式的語言包括Lisp和Prolog。[11]