關於強制式(命令式)語言和聲明式語言的區別


在閱讀Alfred V.Aho等的大作Compilers Principles,Techniques and Tools是看到如下一段話:

Another  classification of  languages  uses  the  term  imperative  for  languages in  which  a program  specifies  how  a  computation  is to  be done  and  declarative for languages  in  which  a  program  specifies  what  computation  is  to  be  done. Languages such as  C,  C++, C#, and Java  are  imperative languages .  In imper­ative languages there is  a notion of  program state  and  statements that  change the  state.  Functional  languages  such  as  ML  and  Haskell  and  constraint  logic languages such  as  Prolog are often considered to be declarative languages.

講到的是強制式語言(imperative languages,部分國內學者譯為命令式語言、指令式語言)和聲明式語言(declarative languages),同時還提到了函數式語言Functional  languages)和約束邏輯式語言(constraint  logic languages)的概念。關於后兩者如果有時間會在以后和大家進行探討,今天暫時先說明一下前兩者。

命令式編程(Imperative programming),即利用命令式語言進行編程的方式,是一種描述計算機所需作出的行為的編程范型。命令式編程語言使用變量和更復雜的語句,但仍依從相同的范型。食譜和行動清單,雖非計算機程序,但與命令式編程有相似的風格:每步都是指令,有形地控制世界情況。因為命令式編程的基礎觀念,不但概念上比較熟悉,而且較容易具體表現於硬件,所以大部分的編程語言都是指令式的。如上述的C,  C++, C#Java大部分的命令式高級編程語言都支持四種基本的語句:運算語句、循環語句、條件分支語句、無條件分支語句。

運算語句一般來說都表現了在存儲器內的數據進行運算的行為,然后將結果存入存儲器中以便日后使用。高級命令式編程語言更能處理復雜的表達式,可能會產生四則運算和函數計算的結合。其中循環、條件分支和無條件分支都是控制流程。

循環語句容許一些語句反復運行數次。循環可依據一個默認的數目來決定運行這些語句的次數;或反復運行它們,直至某些條件改變。

條件分支語句容許僅當某些條件成立時才運行某個區塊。否則,這個區塊中的語句會略去,然后按區塊后的語句繼續運行。

無條件分支語句容許運行順序轉移到程序的其他部分之中。包括跳躍(在很多語言中稱為Goto)、副程序和Procedure等。

早期的命令式編程語言都是計算機本身的機械語言。在這些語言中,指示非常簡單,令硬件的運行更容易,卻阻礙了復雜程序的設計。1954年開始開發的FORTRAN,是首個在復雜程序的設計中除掉機器碼的編程語言。它是編譯型的編程語言,容許命名變量、復雜的表達式、副程序和其他功能,這些功能現在在指令式語言中都非常普遍。后來的二十年中,可以看到大量的其他高級命令式編程語言出現。在1980年后,面向對象編程有迅速的發展;面向對象編程語言均有着指令式的風格,但增添了支持對象的功能。

聲明式編程(Declarative programming),即利用聲明式語言進行編程的方式,與命令式編程相對立。它描述目標性質,讓計算機明白目標,而非流程。聲明式編程不用告訴計算機問題領域,從而避免隨之而來的副作用。而指令式編程則需要用算法來明確的指出每一步該怎么做。它通常被看做是形式邏輯的理論,把計算看做推導。聲明式編程因大幅簡化了並行計算的編寫難度,自2009起備受關注。聲明式語言包括數據庫查詢語言(SQL,XQuery),正則表達式,邏輯編程,函數式編程和組態管理系統。這種編程方式通過函數、推論規則或項重寫(term-rewriting)規則,來描述變量之間的關系。它的語言運行器(編譯器或解釋器)采用了一個固定的算法,以從這些關系產生結果。目前,聲明式編程語言通常用作解決人工智能和約束滿足問題。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM