程式設計範式
Programming paradigm
範,模範、典範也。範式即模式、方法。常見的程式設計範式有:函數式程式設計、程式程式設計、面向對象程式設計、指令式程式設計等。
在面向對象程式設計的世界,程式是一系列互相作用(方法)的對象(Class Instances),而在函數式程式設計的世界,程式會是一個無狀态的函數組合序列。
不同的程式設計語言也會提倡不同的“程式設計範型”。一些語言是專門為某個特定的範型設計的,如Smalltalk和Java支援面向對象程式設計。而Haskell和Scheme則支援函數式程式設計。現代程式設計語言的發展趨勢是支援多種範型,如 C#、Java 8+、Kotlin、 Scala、ES6+ 等等。
1.指令式程式設計(Imperative programming)
計算機的硬體負責運作使用指令式的風格來寫的機器碼。計算機硬體的工作方式基本上都是指令式的。大部分的程式設計語言都是基于指令式的。進階語言通常都支援四種基本的語句:
(1)運算語句
一般來說都表現了在存儲器内的資料進行運算的行為,然後将結果存入存儲器中以便日後使用。高階指令式程式設計語言更能處理複雜的表達式,産生四則運算和函數計算的結合。
(2)循環語句
容許一些語句反複運作數次。循環可依據一個預設的數目來決定運作這些語句的次數;或反複運作它們,直至某些條件改變。
(3)條件分支
容許僅當某些條件成立時才運作某個區塊。否則,這個區塊中的語句會略去,然後按區塊後的語句繼續運作。
(4)無條件分支
容許運作順序轉移到程式的其他部分之中。包括跳躍(在很多語言中稱為Goto)、副程式和Procedure等。
循環、條件分支和無條件分支都是控制流程。
早期的指令式程式設計語言,例如彙編,都是機器指令。雖然硬體的運作更容易,卻阻礙了複雜程式的設計。
1954年開始開發的FORTRAN,是第一個編譯型的程式設計語言,支援命名變量、複雜表達式、副程式和其他一些功能。後來的二十年中,大量的其他進階指令式程式設計語言被發明出來。
在1980年後,面向對象程式設計有迅速的發展;面向對象程式設計語言均有着指令式的風格,但引入了類和對象的核心概念,從此程式設計進入了 OOP 時代。
2.面向對象程式設計(Object-oriented programming,OOP)
怎樣為一個模糊不清的問題找到一個最恰當的描述(問題描述)? 抽象(Abstraction)通常是我們用來簡化複雜的現實問題的方法。
在面向對象程式程式設計裡,計算機程式會被設計成彼此相關的對象。對象則指的是類的執行個體。它将對象作為程式的基本單元,将程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性,對象裡的程式可以通路及經常修改對象相關連的資料。
對象包含資料(字段、屬性)與方法。
面向對象程式設計可以看作一種在程式中包含各種獨立而又互相調用的對象的思想,這與傳統的思想剛好相反:傳統的程式設計主張将程式看作一系列函數的集合,或者直接就是一系列對計算機下達的指令。面向對象程式設計中的每一個對象都應該能夠接受資料、處理資料并将資料傳達給其它對象,是以它們都可以被看作一個小型的“機器”,即對象。目前已經被證明的是,面向對象程式設計推廣了程式的靈活性和可維護性,并且在大型項目設計中廣為應用。此外,支援者聲稱面向對象程式設計要比以往的做法更加便于學習,因為它能夠讓人們更簡單地設計并維護程式,使得程式更加便于分析、設計、了解。反對者在某些領域對此予以否認。
當我們提到面向對象的時候,它不僅指一種程式設計方法。它更多意義上是一種程式開發方式。在這一方面,我們必須了解更多關于面向對象系統分析和面向對象設計(Object Oriented Design,簡稱OOD)方面的知識。許多流行的程式設計語言是面向對象的,它們的風格就是會透由對象來創出執行個體。
重要的面向對象程式設計語言包含Common Lisp、Python、C++、Objective-C、Smalltalk、Delphi、Java、Swift、C#、Perl、Ruby 與 PHP等。
面向對象程式設計中,通常利用繼承父類,以實作代碼重用和可擴充性。
3.聲明式程式設計(Declarative programming)
一種程式設計範式,與指令式程式設計相對立。
它描述目标的性質,讓計算機明白目标,而非具體過程。
聲明式程式設計不用告訴計算機問題領域,進而避免随之而來的副作用。
而指令式程式設計則需要用算法來明确的指出每一步該怎麼做。
聲明式程式設計通常被看做是形式邏輯的理論,把計算看做推導。
聲明式程式設計因大幅簡化了并行計算的編寫難度,自2009起備受關注。
常見的聲明式程式設計語言有:
資料庫查詢語言(SQL,XQuery)
正規表達式
邏輯程式設計
函數式程式設計
組态管理系統等。
聲明式程式設計透過函數、推論規則或項重寫(term-rewriting)規則,來描述變量之間的關系。它的語言運作器(編譯器或解釋器)采用了一個固定的算法,以從這些關系産生結果。
很多文本标記語言例如HTML、MXML、XAML和XSLT往往是聲明式的。函數式程式設計,特别是純函數式程式設計,嘗試最小化狀态帶來的副作用,是以被認為是聲明式的。不過,大多數函數式程式設計語言,例如Scheme、Clojure、Haskell、OCaml、Standard ML和Unlambda,允許副作用的存在。