編程范式
Programming paradigm
范参咙,模范龄广、典范也。范式即模式蕴侧、方法择同。常見的編程范式有:函數(shù)式編程、程序編程净宵、面向?qū)ο缶幊糖貌拧⒅噶钍骄幊痰取?/p>
在面向?qū)ο缶幊痰氖澜纾绦蚴且幌盗邢嗷プ饔茫ǚ椒ǎ┑膶?duì)象(Class Instances)塘娶,而在函數(shù)式編程的世界归斤,程序會(huì)是一個(gè)無狀態(tài)的函數(shù)組合序列。
不同的編程語言也會(huì)提倡不同的“編程范型”刁岸。一些語言是專門為某個(gè)特定的范型設(shè)計(jì)的脏里,如Smalltalk和Java支持面向?qū)ο缶幊獭6鳫askell和Scheme則支持函數(shù)式編程『缡铮現(xiàn)代編程語言的發(fā)展趨勢(shì)是支持多種范型迫横,如 C#、Java 8+酝碳、Kotlin矾踱、 Scala、ES6+ 等等疏哗。
1.命令式編程(Imperative programming)
計(jì)算機(jī)的硬件負(fù)責(zé)運(yùn)行使用命令式的風(fēng)格來寫的機(jī)器碼呛讲。計(jì)算機(jī)硬件的工作方式基本上都是命令式的。大部分的編程語言都是基于命令式的返奉。高級(jí)語言通常都支持四種基本的語句:
(1)運(yùn)算語句
一般來說都表現(xiàn)了在存儲(chǔ)器內(nèi)的數(shù)據(jù)進(jìn)行運(yùn)算的行為贝搁,然后將結(jié)果存入存儲(chǔ)器中以便日后使用。高階命令式編程語言更能處理復(fù)雜的表達(dá)式芽偏,產(chǎn)生四則運(yùn)算和函數(shù)計(jì)算的結(jié)合雷逆。
(2)循環(huán)語句
容許一些語句反復(fù)運(yùn)行數(shù)次。循環(huán)可依據(jù)一個(gè)默認(rèn)的數(shù)目來決定運(yùn)行這些語句的次數(shù)污尉;或反復(fù)運(yùn)行它們膀哲,直至某些條件改變。
(3)條件分支
容許僅當(dāng)某些條件成立時(shí)才運(yùn)行某個(gè)區(qū)塊被碗。否則某宪,這個(gè)區(qū)塊中的語句會(huì)略去,然后按區(qū)塊后的語句繼續(xù)運(yùn)行锐朴。
(4)無條件分支
容許運(yùn)行順序轉(zhuǎn)移到程序的其他部分之中兴喂。包括跳躍(在很多語言中稱為Goto)、副程序和Procedure等。
循環(huán)瞻想、條件分支和無條件分支都是控制流程压真。
早期的命令式編程語言,例如匯編蘑险,都是機(jī)器指令滴肿。雖然硬件的運(yùn)行更容易,卻阻礙了復(fù)雜程序的設(shè)計(jì)佃迄。
1954年開始開發(fā)的FORTRAN泼差,是第一個(gè)編譯型的編程語言,支持命名變量呵俏、復(fù)雜表達(dá)式堆缘、副程序和其他一些功能。后來的二十年中普碎,大量的其他高級(jí)命令式編程語言被發(fā)明出來吼肥。
在1980年后,面向?qū)ο缶幊逃醒杆俚陌l(fā)展麻车;面向?qū)ο缶幊陶Z言均有著命令式的風(fēng)格缀皱,但引入了類和對(duì)象的核心概念,從此編程進(jìn)入了 OOP 時(shí)代动猬。
2.面向?qū)ο缶幊蹋∣bject-oriented programming啤斗,OOP)
怎樣為一個(gè)模糊不清的問題找到一個(gè)最恰當(dāng)?shù)拿枋觯▎栴}描述)? 抽象(Abstraction)通常是我們用來簡化復(fù)雜的現(xiàn)實(shí)問題的方法赁咙。
在面向?qū)ο蟪绦蚓幊汤锱チ?jì)算機(jī)程序會(huì)被設(shè)計(jì)成彼此相關(guān)的對(duì)象。對(duì)象則指的是類的實(shí)例彼水。它將對(duì)象作為程序的基本單元崔拥,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性猿涨、靈活性和擴(kuò)展性握童,對(duì)象里的程序可以訪問及經(jīng)常修改對(duì)象相關(guān)連的數(shù)據(jù)姆怪。
對(duì)象包含數(shù)據(jù)(字段叛赚、屬性)與方法。
面向?qū)ο蟪绦蛟O(shè)計(jì)可以看作一種在程序中包含各種獨(dú)立而又互相調(diào)用的對(duì)象的思想稽揭,這與傳統(tǒng)的思想剛好相反:傳統(tǒng)的程序設(shè)計(jì)主張將程序看作一系列函數(shù)的集合俺附,或者直接就是一系列對(duì)計(jì)算機(jī)下達(dá)的指令。面向?qū)ο蟪绦蛟O(shè)計(jì)中的每一個(gè)對(duì)象都應(yīng)該能夠接受數(shù)據(jù)溪掀、處理數(shù)據(jù)并將數(shù)據(jù)傳達(dá)給其它對(duì)象事镣,因此它們都可以被看作一個(gè)小型的“機(jī)器”,即對(duì)象揪胃。目前已經(jīng)被證實(shí)的是璃哟,面向?qū)ο蟪绦蛟O(shè)計(jì)推廣了程序的靈活性和可維護(hù)性氛琢,并且在大型項(xiàng)目設(shè)計(jì)中廣為應(yīng)用。此外随闪,支持者聲稱面向?qū)ο蟪绦蛟O(shè)計(jì)要比以往的做法更加便于學(xué)習(xí)阳似,因?yàn)樗軌蜃屓藗兏唵蔚卦O(shè)計(jì)并維護(hù)程序,使得程序更加便于分析铐伴、設(shè)計(jì)撮奏、理解。反對(duì)者在某些領(lǐng)域?qū)Υ擞枰苑裾J(rèn)当宴。
當(dāng)我們提到面向?qū)ο蟮臅r(shí)候畜吊,它不僅指一種程序設(shè)計(jì)方法。它更多意義上是一種程序開發(fā)方式户矢。在這一方面玲献,我們必須了解更多關(guān)于面向?qū)ο笙到y(tǒng)分析和面向?qū)ο笤O(shè)計(jì)(Object Oriented Design,簡稱OOD)方面的知識(shí)梯浪。許多流行的編程語言是面向?qū)ο蟮?它們的風(fēng)格就是會(huì)透由對(duì)象來創(chuàng)出實(shí)例青自。
重要的面向?qū)ο缶幊陶Z言包含Common Lisp、Python驱证、C++延窜、Objective-C、Smalltalk抹锄、Delphi逆瑞、Java、Swift伙单、C#获高、Perl、Ruby 與 PHP等吻育。
面向?qū)ο缶幊讨心钛恚ǔ@美^承父類,以實(shí)現(xiàn)代碼重用和可擴(kuò)展性布疼。
3.聲明式編程(Declarative programming)
一種編程范式摊趾,與命令式編程相對(duì)立。
它描述目標(biāo)的性質(zhì)游两,讓計(jì)算機(jī)明白目標(biāo)砾层,而非具體過程。
聲明式編程不用告訴計(jì)算機(jī)問題領(lǐng)域贱案,從而避免隨之而來的副作用肛炮。
而命令式編程則需要用算法來明確的指出每一步該怎么做。
聲明式編程通常被看做是形式邏輯的理論,把計(jì)算看做推導(dǎo)侨糟。
聲明式編程因大幅簡化了并行計(jì)算的編寫難度碍扔,自2009起備受關(guān)注。
常見的聲明式編程語言有:
數(shù)據(jù)庫查詢語言(SQL秕重,XQuery)
正則表達(dá)式
邏輯編程
函數(shù)式編程
組態(tài)管理系統(tǒng)等蕴忆。
聲明式編程透過函數(shù)、推論規(guī)則或項(xiàng)重寫(term-rewriting)規(guī)則悲幅,來描述變量之間的關(guān)系套鹅。它的語言運(yùn)行器(編譯器或解釋器)采用了一個(gè)固定的算法,以從這些關(guān)系產(chǎn)生結(jié)果汰具。
很多文本標(biāo)記語言例如HTML卓鹿、MXML、XAML和XSLT往往是聲明式的留荔。函數(shù)式編程吟孙,特別是純函數(shù)式編程,嘗試最小化狀態(tài)帶來的副作用聚蝶,因此被認(rèn)為是聲明式的杰妓。不過,大多數(shù)函數(shù)式編程語言碘勉,例如Scheme巷挥、Clojure、Haskell验靡、OCaml倍宾、Standard ML和Unlambda,允許副作用的存在胜嗓。