Programmatic programming, Declarative programming and Generative programming
開(kāi)發(fā)式編程,聲明式編程和產(chǎn)生式編程

Author:Anders小明

開(kāi)發(fā)式編程是編碼的,如:Java, C#
聲明式編程是解析的,如:ANT(spring等的xml不一樣,它們是靜態(tài)描述型的,不那么verb)
產(chǎn)生式編程是生成的,如:AOP(AspectJ),DSL(Drools)

開(kāi)發(fā)式編程是聚合的,
聲明式編程是聲明的,
產(chǎn)生式編程是組合的,

聲明式編程和產(chǎn)生式編程看起來(lái)很像:
1.聲明式編程需要一個(gè)解析器,產(chǎn)生式編程需要一個(gè)生成器;
2.產(chǎn)生式編程(正統(tǒng)的)需要一個(gè)編輯器,聲明式編程也可以有(如jbpm)。
3.產(chǎn)生式編程有一個(gè)元模型,聲明式編程也可以定義。

本質(zhì)的區(qū)別在于:
1.產(chǎn)生式是自底向上,而聲明式是自定向下。即產(chǎn)生式編程用的思路是組合概念(用小粒度的概念組合生成大粒度的概念),
而聲明式編程是解析概念,用統(tǒng)一的概念來(lái)理解,把不同差異性交由具體程序解析。
2.聲明式編程的編輯器生成的是xml文件,將由框架程序解析;而產(chǎn)生式生成程序代碼,不做解析運(yùn)行。
3.由于1,導(dǎo)致元數(shù)據(jù)模型不一樣,產(chǎn)生式是相對(duì)細(xì)粒度的,而聲明式是粗粒度的(不能直接比較大小,定義的是無(wú)差異性的概念)。如Ant,jbpm都是很大的概念。

前段時(shí)間javaeye上有關(guān)普元的黃柳青談中國(guó)軟件開(kāi)發(fā)情況:"目前,國(guó)內(nèi)傳統(tǒng)大型企業(yè)應(yīng)用軟件有兩種方式居多:編碼式開(kāi)發(fā)方式和一次開(kāi)發(fā)方式。值得注意的是,兩種方式都有致命的缺陷---編碼式開(kāi)發(fā)方式使得企業(yè)級(jí)應(yīng)用軟件的快速開(kāi)發(fā)和實(shí)施難以實(shí)現(xiàn);一次性開(kāi)發(fā)持續(xù)運(yùn)行的方式,則導(dǎo)致軟件的嚴(yán)重僵化和應(yīng)用的不適應(yīng)。盡管有時(shí)兩種方式的操作者會(huì)彼此攻擊,但在用戶(hù)看來(lái),它們之間并無(wú)顯著不同"

其說(shuō)的以及普元做的,就是這三個(gè)開(kāi)發(fā)方式。

buaawhl老大說(shuō):"Interpreter is over Code Generator。meta programming的最高層次是 語(yǔ)言級(jí)別直接解決,比如,smalltalk, ruby, python, 還有其他reflection 支持的非常好的語(yǔ)言。甚至 STL 等 template 技術(shù),也可以算作語(yǔ)言級(jí)別。Code Generation 是最低級(jí)別的meta programming解決方案。技術(shù)含量也最低。這個(gè)級(jí)別必須超越,才能夠真正達(dá)到質(zhì)變,完全跳出概念炒作的層次。"

我一直以為:其實(shí)代碼生成也沒(méi)有那么壞,關(guān)鍵在于生成什么東東,如果是生成結(jié)構(gòu)性的代碼,就很容易被人bs,因?yàn)檫@種代碼是大都可以用template完成的,同時(shí)因?yàn)檫@種代碼往往不是最終的產(chǎn)物,就存在同步維護(hù)問(wèn)題。
但如果生成的是功能性代碼,這類(lèi)代碼是最終執(zhí)行代碼,那么通常就把用于設(shè)計(jì)的代碼看作是最終產(chǎn)物,最明顯的例子是DSL。

一些雜想,歡迎拍磚!