Programmatic programming, Declarative programming and Generative programming
開發式編程,聲明式編程和產生式編程
Author:Anders小明
開發式編程是編碼的,如: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。
一些雜想,歡迎拍磚!