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。

一些杂想,欢迎拍砖!