代码生成(Code Generation)本身是一个非常宏大的概念。从某种意义上说,当我们明确了计算的意义之后,所做的一切都只是一系列代码生成的过程,最终的目标是生成某种可执行的机器码。对web程序员来说,代码生成是最熟悉不过的了,每天我们所做的工作就是JSP=>Servlet=>HTML。不过,现在多数人脑海中的代码生成,指的一般只是根据配置输出一个或多个程序文本的过程,最常见的是根据数据库模型生成增删改查相关代码。这种技术其实很少在小型以上的项目中起到积极的作用.因为一般的生成工具都没有实现追加功能,无法适应模型的增量修改。此外一般生成的代码相比于手工书写的代码要更加冗长,需要被直接理解的代码总量不降反升.为图一时之快,所要付出的是长期的维护成本。
在应用开发中,有些领域是非常适合于使用代码生成技术的。例如根据领域模型生成ORM(对象-关系映射)描述,或者根据接口描述生成远程调用代理/存根(Proxy/Stub)等。因为它们实际上只是对同一信息的不同技术形式或者不同技术层面的同义反复而已。这种生成最理想的方式是动态进行,可以随时保持模型的有效性。RoR(RubyOnRails)框架中ActiveRecord技术便是一个成功的范例,它甚至提供了动态生成的DAO函数,减少了一系列的包装调用过程。
代码生成更加深刻的应用是完成高层模型向低层模型的转化,这一过程往往是非平凡(non-trivial)的。在Witrix平台中通过代码生成来支持领域抽象,可以用非常低的成本跨越结构障碍,将自定义的领域模型嵌入到现有的技术体系中。这其中我们的主要工作是解决了生成代码与手工书写代码之间的有效隔离及动态融合问题,确保代码生成可以反复的以增量的方式进行,同时支持最细粒度处对生成的代码进行定制调整。
举一个简单的例子,假设现在需要开发一个三步审批的流程,每一步的操作人可以录入意见,可以选择通过或者回退,可以选择下一步操作的具体操作人,系统自动记录操作时间,每个操作人可以查看自己的操作历史等。虽然在现有技术体系中实现这一功能需要不少代码,但是在业务层面上描述这一功能并不需要很多文字,实际需要提供的信息量很小。显然,建立领域模型是比较适合的做法,可以定义一种DSL(Domain Specific Language)来描述这一模型。
<flow_cp:SeqFlow>
<step id="draft" userField="draferId" dateField="draftTime" waitStatus="drafted" />
<step id="check" userField="checkerId" dateField="checkTime" opinionField="checkOpinion"
waitStatus="sent" />
<step id="approve" userField="approverId" dateField="approveTime"
opinionField="approveOpinion" waitStatus="checked" passStatus="approved" />
</flow_cp:SeqFlow>
以上功能涉及到多个操作场景,实现的时候需要补充大量具体信息,其中很大一部分信息来自于背景知识,例如显示样式,界面布局,前后台通信方式等。以上模型可以进一步抽象为如下标签
<flow_cp:StepFlow3/>
在不同应用中复用以上流程逻辑的时候可能需要局部修正,例如
<flow_cp:StepFlow3>
<step id="check" userField="checker" />
</flow_cp:StepFlow3>
更加复杂的情形是DSL本身提供的抽象无法满足全部需求,而需要在局部补充更多模型之外的信息,例如物品接收单审批通过后自动导入库存等。
在Witrix中,代码生成不是直接产生最终的输出,而是在编译期生成基础模型,它与补充描述通过extends算子进行融合运算之后产生最终输出, 这种融合可以实现基础功能的新增,更改或者删除。典型的调用形式为
<biz-flow>
<extends>
<flow_cp:StepFlow3>
<step id="check" userField="checker" />
</flow_cp:StepFlow3>
</extends>
...
<action id="pass_approve">
....
</action>
</biz-flow>
这里的操作过程可以看作是BizFlow extends SeqFlow<FlowConfig extends StepFlow3Config>,与泛型技术非常类似,只是需要更强的局部结构控制能力。
按照级列理论http://canonical.iteye.com/blog/33824
,我们可以定义一个DSL的级列,整个抽象过程为
Context0 + DSL1 + EXT0 = DSL0
Context1 + DSL2 + EXT1 = DSL1
...
在目前一些通用语言中,也有一些所谓内嵌DSL的方案,可以提供比较简洁的业务描述。但是仅仅建立DSL描述是不充分的,从级列理论的观点看,我们必须提供一种DSL的补充手段,能够在细节处补充DSL模型之外的信息,实现两者的自然融合。同时我们应该可以在不同的抽象层面上独立的进行操作,例如在DSL1和DSL2的层面上都可以通过类似继承的操作实现局部调整,这同时也包括在不同的抽象层面上都能对模型进行合法性校验。
分享到:
相关推荐
JCG是功能强大的Java代码生成器。 与大多数生成器不同,JCG不是基于模板的;而是基于模板的。 在纯Java中使用DSL来生成Java! JCG的目标不是涵盖所有Java语言功能,而是允许创建功能强大,健壮且设计良好的生成器。...
go-codon - 从REST和工作流DSL组合生成Go服务器代码
改进了Simplejee技术栈的Add,Update,SoftDelete和Delete等动词的代码生成物 改进了理论PPT,进行了一些修正 ===============0.7.15=========================== 本版本为InfinityGPGenerator的文档增强版本,支持...
3)请使用本代码生成器的DSL即SGS(标准生成器脚本)完成您的工作 4)不吝反馈jerry_shen_sjf@qq.com 5)支持Java语言的两种技术组合:Simplejee和s2sh 6)生成相应对象的CRUDFLS等常用功能 7)生成完整的Eclipse JEE版...
DSL Builder是一个编译时依赖项,可根据附加到您的Kotlin类和属性的注释自动生成DSL。 通过使用Google的Kotlin符号处理API来连接Kotlin编译器,DSL Builder可以利用Square的KotlinPoet库在Kotlin中处理带注释的类的...
特征快速创建配置好的 Django 项目用于生成 Django 视图和模型的紧凑型 dsl 用于语法高亮显示的 Pycharm 插件自动 django-admin 生成,包括复杂的:多态、内联、可翻译强大的 CRUD 生成器React 应用程序生成器(TODO...
Sculptor是一个简单但功能强大的代码生成平台,该平台提供了一个Quick Start来实现模型驱动软件开发(MDSD)。 Sculptor让你只需关心业务需求,而不是详细技术。你可以使用来自Domain-Driven Design (DDD)用textual ...
Copilot, 一种用于生成硬实时C 代码的( Haskell DSL ) 流 停止正式的副档库现在在 https://github.com/Copilot-Language/系统。 ! Copilot: 流 DSLcab是Haskell中的一个流( 。例如,无限列表) 域特定语言( DSL ),...
带有Python代码生成和分析的TRS和PNS DSL 设置 确保下载了正确的软件。 Python Python3- //www.python.org/downloads/ Python库 确保安装了以下python库。 您可以使用pip install 来安装适当的模块。 麻木 科学的 ...
1)本例为Java代码生成器InfinityGPGenerator0.79版 2)支持自动生成JSON Facade 3)请使用本代码生成器的DSL即SGS(标准生成器脚本)完成您的工作 4)不吝反馈jerry_shen_sjf@qq.com
用于Kotlin的AutoDsl使用注释为您的Kotlin项目自动生成DSL(特定于域的语言)。 目录文档下载下载为Kotlin创建无需AutoDsl的可表达,不可变且类型安全的DSL使用注释为您的Kotlin项目自动生成DSL(特定于域的语言)。...
根据Kubernetes和OpenShift的api API规范生成Kotlin DSL。 想更多地了解Kuberig结帐 。 API生成器项目 将API服务器中的swagger API定义文件放在src \ main \ resources \ swagger.json中。 创建一个包含的build....
用法选择DSL进行代码生成在imgcook编辑器中,可以在“代码生成”面板中为项目选择DSL。 之后,我们将以您选择的语言格式生成您所需的代码。使用第三方DSL 如果您不想使用imgcook提供的官方DSL。 您可以去 ,将第三方...
此外,可以使用自定义代码生成器添加有用的代码生成。 目前只有早期原型准备就绪。 尚不支持自定义生成器。 其中的一部分目前只是开发人员的路线图! 二进制下载 ##Available Features LSGL 支持代码生成,用于...
该框架带有两个代码生成器,这些代码生成器采用Xtext或ANTLR表示的语法并生成两个编辑器变体。 从ANTLR生成Web编辑器使用ANTLR v3JavaScript解析器和词法分析器生成文本编辑器。 您将获得一个针对语言定义量身定制...
Chatito可帮助您使用简单的DSL生成用于训练和验证chatbot模型的数据集。 如果要使用商业模型,开源框架或编写自己的自然语言处理模型来构建聊天机器人,则需要培训和测试示例。 Chatito在这里为您提供帮助。 该...
给定一组描述语言的标记模式和语法规则,DSL 将生成一个解析器。 DSL 基于 LPEG(Lua Parsing Expression Grammars),因此标记和规则以 LPEG 语法进行描述。 DSL 通过添加对编写自定义语言有用的功能来扩展 LPEG,...
为了生成JSON表示并运行验证代码,您需要在开发环境中安装和配置Node.js。 您可以使用安装Node.js: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash 安装完成后,安装Node.js...
专为DSL打造,相对与使用其它常见工具(javacc, antlr等)做DSL解析,代码量急剧下降;上手较为容易,让用户更加关注自身业务内容 需要jdk1.6或以上版本运行,无任何其它依赖 识别LL(*)语法 ...
UML元模型建模与实例生成是软件自动生成技术的重要环节之一,相关理论和技术在领域建模语言DSL中得到广泛应用。元模型自动生成实例技术不仅可以降低软件开发难度和成本,还可以提高软件开发效率。在已有元模型实例...