大多數程序員考慮編程時,他們都要設想用于編寫應用程序的 命令式樣式和技術。最受歡迎的通用編程語言(包括 Python 和其它面向對象的語言)在樣式上絕大多數都是命令式的。另一方面,也有許多編程語言是 聲明性樣式,包括函數語言和邏輯語言,還包括通用語言和專用語言。
讓我們列出幾個屬于各個種類的語言。許多讀者已經使用過這些工具中的許多工具,但不見得考慮過它們之間的種類差別。Python、C、C++、Java、Perl、Ruby、Smalltalk、Fortran、Basic 和 xBase 都是簡單的命令式編程語言。其中,一些是面向對象的,但那只是組織代碼和數據的問題,而非基本編程樣式的問題。使用這些語言,您 命令程序執行指令序列:把某些數據 放入(put)變量中;從變量中 獲取(fetch)數據; 循環(loop)一個指令塊 直到(until)滿足了某些條件; 如果(if)某個命題為 true,那么就進行某些操作。所有這些語言的一個妙處在于:便于用日常生活中熟悉的比喻來考慮它們。日常生活都是由做事、選擇、再做另一件事所組成的,期間或許會使用一些工具。可以簡單地將運行程序的計算機想象成廚師、瓦匠或汽車司機。
諸如 Prolog、Mercury、SQL、XSLT 這樣的語言、EBNF 語法和各種格式的真正配置文件,都 聲明某事是這種情況,或者應用了某些約束。函數語言(比如 Haskell、ML、Dylan、Ocaml 和 Scheme)與此相似,但是它們更加強調陳述編程對象(遞歸、列表,等等)之間的內部(函數)關系。我們的日常生活(至少在敘事質量方面)沒有提供對這些語言的編程構造的直接模擬。然而,對于那些可以用這些語言進行描述的問題來說,聲明性描述 遠遠比命令式解決方案來得簡明且不易出錯。例如,請研究下面這個線性方程組:
清單 1. 線性方程式系統樣本
10x + 5y - 7z + 1 = 017x + 5y - 10z + 3 = 05x - 4y + 3z - 6 = 0
這是個相當漂亮的說明對象(x、y 和 z)之間幾個關系的簡單表達式。在現實生活中您可能會用不同的方式求出這些答案,但是實際上用筆和紙“求解 x”很煩,而且容易出錯。從調試角度來講,用 Python 編寫求解步驟或許會更糟糕。
Prolog 是與邏輯或數學關系密切的語言。使用這種語言,您只要編寫您知道是正確的語句,然后讓應用程序為您得出結果。語句不是按照特定的順序構成的(和線性方程式一樣,沒有順序),而且您(程序員或用戶)并不知道得出的結果都采用了哪些步驟。例如:
清單 2. family.pro Prolog 樣本
/* Adapted from sample at:<http://www.engin.umd.umich.edu/CIS/course.des/cis479/prolog/>This app can answer questions about sisterhood & love, e.g.:# Is alice a sister of harry??-sisterof( alice, harry )# Which of alice' sisters love wine??-sisterof( X, alice ), love( X, wine)*/sisterof( X, Y ) :- parents( X, M, F ), female( X ), parents( Y, M, F ).parents( edward, victoria, albert ).parents( harry, victoria, albert ).parents( alice, victoria, albert ).female( alice ).loves( harry, wine ).loves( alice, wine ).
新聞熱點
疑難解答