在面向?qū)ο缶幊痰氖澜纾绦蚴且幌盗邢嗷プ饔茫ǚ椒ǎ┑膶ο螅–lass Instances)室琢,而在函數(shù)式編程的世界,程序會是一個無狀態(tài)的函數(shù)組合序列。
不同的編程語言也會提倡不同的“編程范型”庐冯。一些語言是專門為某個特定的范型設(shè)計(jì)的,如Smalltalk和Java支持面向?qū)ο缶幊炭泊6鳫askell和Scheme則支持函數(shù)式編程≌垢福現(xiàn)代編程語言的發(fā)展趨勢是支持多種范型,如 C#玲昧、Java 8+栖茉、Kotlin、 Scala孵延、ES6+ 等等吕漂。
1.命令式編程(Imperative programming)
計(jì)算機(jī)的硬件負(fù)責(zé)運(yùn)行使用命令式的風(fēng)格來寫的機(jī)器碼。計(jì)算機(jī)硬件的工作方式基本上都是命令式的尘应。大部分的編程語言都是基于命令式的惶凝。高級語言通常都支持四種基本的語句:
(1)運(yùn)算語句
一般來說都表現(xiàn)了在存儲器內(nèi)的數(shù)據(jù)進(jìn)行運(yùn)算的行為,然后將結(jié)果存入存儲器中以便日后使用犬钢。高階命令式編程語言更能處理復(fù)雜的表達(dá)式苍鲜,產(chǎn)生四則運(yùn)算和函數(shù)計(jì)算的結(jié)合。
(2)循環(huán)語句
容許一些語句反復(fù)運(yùn)行數(shù)次玷犹。循環(huán)可依據(jù)一個默認(rèn)的數(shù)目來決定運(yùn)行這些語句的次數(shù)混滔;或反復(fù)運(yùn)行它們,直至某些條件改變。
(3)條件分支
容許僅當(dāng)某些條件成立時(shí)才運(yùn)行某個區(qū)塊遍坟。否則拳亿,這個區(qū)塊中的語句會略去,然后按區(qū)塊后的語句繼續(xù)運(yùn)行愿伴。
(4)無條件分支
容許運(yùn)行順序轉(zhuǎn)移到程序的其他部分之中肺魁。包括跳躍(在很多語言中稱為Goto)、副程序和Procedure等隔节。
循環(huán)鹅经、條件分支和無條件分支都是控制流程。
早期的命令式編程語言怎诫,例如匯編瘾晃,都是機(jī)器指令。雖然硬件的運(yùn)行更容易幻妓,卻阻礙了復(fù)雜程序的設(shè)計(jì)蹦误。
1954年開始開發(fā)的FORTRAN,是第一個編譯型的編程語言肉津,支持命名變量强胰、復(fù)雜表達(dá)式、副程序和其他一些功能妹沙。后來的二十年中偶洋,大量的其他高級命令式編程語言被發(fā)明出來。
在1980年后距糖,面向?qū)ο缶幊逃醒杆俚陌l(fā)展玄窝;面向?qū)ο缶幊陶Z言均有著命令式的風(fēng)格,但引入了類和對象的核心概念悍引,從此編程進(jìn)入了 OOP 時(shí)代恩脂。
2.面向?qū)ο缶幊蹋∣bject-oriented programming,OOP)
怎樣為一個模糊不清的問題找到一個最恰當(dāng)?shù)拿枋觯▎栴}描述)趣斤? 抽象(Abstraction)通常是我們用來簡化復(fù)雜的現(xiàn)實(shí)問題的方法东亦。
在面向?qū)ο蟪绦蚓幊汤铮?jì)算機(jī)程序會被設(shè)計(jì)成彼此相關(guān)的對象唬渗。對象則指的是類的實(shí)例典阵。它將對象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中镊逝,以提高軟件的重用性壮啊、靈活性和擴(kuò)展性,對象里的程序可以訪問及經(jīng)常修改對象相關(guān)連的數(shù)據(jù)撑蒜。
對象包含數(shù)據(jù)(字段歹啼、屬性)與方法玄渗。
面向?qū)ο蟪绦蛟O(shè)計(jì)可以看作一種在程序中包含各種獨(dú)立而又互相調(diào)用的對象的思想,這與傳統(tǒng)的思想剛好相反:傳統(tǒng)的程序設(shè)計(jì)主張將程序看作一系列函數(shù)的集合狸眼,或者直接就是一系列對計(jì)算機(jī)下達(dá)的指令藤树。面向?qū)ο蟪绦蛟O(shè)計(jì)中的每一個對象都應(yīng)該能夠接受數(shù)據(jù)、處理數(shù)據(jù)并將數(shù)據(jù)傳達(dá)給其它對象拓萌,因此它們都可以被看作一個小型的“機(jī)器”岁钓,即對象。目前已經(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ì)啊央、理解。反對者在某些領(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)方面的知識靠闭。許多流行的編程語言是面向?qū)ο蟮?它們的風(fēng)格就是會透由對象來創(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)
一種編程范式份氧,與命令式編程相對立。
它描述目標(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)行器(編譯器或解釋器)采用了一個固定的算法欺矫,以從這些關(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点楼,允許副作用的存在扫尖。