Programmatic programming, Declarative programming and Generative programming
開發式編程,聲明式編程和產生式編程
Author:Anders小明
同步自:http://www.blogjava.net/AndersLin/archive/2006/08/31/66968.html
開發式編程是編碼的,如:Java, C#
聲明式編程是解析的,如:ANT(spring等的xml不一樣,它們是靜態描述型的,不那麼verb)
產生式編程是產生的,如:AOP(AspectJ),DSL(Drools)
開發式編程是彙總的,
聲明式編程是聲明的,
產生式編程是組合的,
聲明式編程和產生式編程看起來很像:
1.聲明式編程需要一個解析器,產生式編程需要一個產生器;
2.產生式編程(正統的)需要一個編輯器,聲明式編程也可以有(如jbpm)。
3.產生式編程有一個元模型,聲明式編程也可以定義。
本質的區別在於:
1.產生式是自底向上,而聲明式是自定向下。即產生式編程用的思路是組合概念(用小粒度的概念組合產生大粒度的概念),
而聲明式編程是解析概念,用統一的概念來理解,把不同差異性交由具體程式解析。
2.聲明式編程的編輯器產生的是xml檔案,將由架構程式解析;而產生式產生程式碼,不做解析運行。
3.由於1,導致中繼資料模型不一樣,產生式是相對細粒度的,而聲明式是粗粒度的(不能直接比較大小,定義的是無差異性的概念)。如Ant,jbpm都是很大的概念。
前段時間javaeye上有關普元的黃柳青談中國軟體開發情況:"目前,國內傳統大型公司專屬應用程式軟體有兩種方式居多:編碼式開發方式和一次開發方式。值得注意的是,兩種方式都有致命的缺陷---編碼式開發方式使得企業級應用軟體的快速開發和實施難以實現;一次性開發持續啟動並執行方式,則導致軟體的嚴重僵化和應用的不適應。儘管有時兩種方式的操作者會彼此攻擊,但在使用者看來,它們之間並無顯著不同"
其說的以及普元做的,就是這三個開發方式。
buaawhl老大說:"Interpreter is over Code Generator。meta programming的最高層次是 語言層級直接解決,比如,smalltalk, ruby, python, 還有其他reflection 支援的非常好的語言。甚至 STL 等 template 技術,也可以算作語言層級。Code Generation 是最低層級的meta programming解決方案。技術含量也最低。這個層級必須超越,才能夠真正達到質變,完全跳出概念炒作的層次。"
我一直以為:其實代碼產生也沒有那麼壞,關鍵在於產生什麼東東,如果是產生結構性的代碼,就很容易被人bs,因為這種代碼是大都可以用template完成的,同時因為這種代碼往往不是最終的產物,就存在同步維護問題。
但如果產生的是功能性代碼,這類代碼是最終執行代碼,那麼通常就把用於設計的代碼看作是最終產物,最明顯的例子是DSL。
一些雜想,歡迎拍磚!