BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

从开发者角度看微软领域特定语言(DSL)工具

| 作者 Hartmut Wilms 关注 0 他的粉丝 ,译者 霍泰稳 关注 1 他的粉丝 发布于 2007年4月1日. 估计阅读时间: 5 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

领域特定语言(DSLs)是架构方面的一个热点。微软开始在自己的软件产品线里支持DSL,并通过最近发布的Visual Studio 2005 SDK集成到它的软件开发流程中。尽管现在已经有许多关于DSL的信息,但它仍然是一个抽象的架构概念。现在看看Mike James博士是如何从一个开发者的角度去理解Visual Studio DSL工具的。

DSL是指软件开发中出于某特定考虑而设计的小的、目标明确的语言。它们的作用是,使用某特定领域里惯用的符号或者表示法对该领域的实体或者流程进行建模。这就是它们区别于那些提供统一符号表示的通用建模语言(如UML)的地方。另外一个区别是UML经常被用作于(定义如此,非只能用于)文档分析或者设计交付,而领域特定语言既可以用作建模工具,还可以用作代码生成器。

在他的文章中,James抱怨说:

……文章、案例、白皮书,甚至视频介绍都是那么糟糕。他们浪费了太多的时间做无用功,而恰恰严重忽视了最明显的问题——使用领域特定语言工具的新手可能会遇到什么问题?大多数案例过于复杂,看上去就像魔术,比如告诉你“现在把下面的XML粘贴到一个新的文件中”,而不解释为什么,以及XML文件是从那儿来的,或者它有什么用等,其实这些远不是新手们所关心的问题。本文不是洋洋洒洒数千言给你解释如何改变一个图表的颜色,而是主要讲述那些文档中缺失的部分,如怎样使用领域特定语言工具从一个定制的图表中实际产生一些代码。一旦你明白了如何去做,那么那些文档看上去才会有点意思。

James解释说微软的DSL工具提供了一种图形化的操作方式。在开始创建一个领域特定语言(DSL)时,是围绕DSL设计器进行的,设计器的功能是设计和产生DSL或者设计依附于可生成代码DSL的模型。开始的时候,设计器的设计器(Designer-Designer)概念听起来有些迷糊,但是当你理解了这一思想后,就很明白了。完整的DSL设计包含两个阶段:

  1. 为你的DSL文法设计相应的图形表示。简单地说,你必须为你的语言设计图形、连接器和底层的元模型(包括文字性属性);
  2. 写代码模板,即使用存储在DSL中的实例(图表)信息产生对应的代码。

文章中,James提供了一个基于微语言(MinimalLanguage)模板(装有SDK)的DSL Hello-World例子。他一点儿也没有提到如何增加图表或者模型部分如何连接到图形上等细节。相反,他花了很多时间解释代码生成的过程。

代码生成是基于TextTemplate(.tt)文件的。这些模板包括直接生成(复制)为访问模型或者用于动态生成的目标或者元代码(meta-code)的代码。James说最小代码和元代码是非常让人困惑的。另外, DSL模型部分所基于的(没有文档的)元类结构(Meta-Class-Structure)概念,对理解这些问题也没有实质性的帮助。

实际上没有类结构的文档说明,只有一些没有用的特定案例。针对文档问题我发现的唯一的解决方法是在DSL设计器里阅读源文件。比如,在最初的项目中如果你打开DomainClasses.cs文件,就会发现那些组成模型的类的定义。
Mike James博士总结说:
现在的DSL工具难以使用,最初的学习曲线也非常陡峭,学习的投入和产出不成正比,很不划算。尽管充满了新的专业术语和时不时让你百思不得其解哪儿出了问题,坦白地说,图形设计器很容易上手。但是,代码生成原理遇到了一直受元代码困扰的代码生成器或者软件工厂问题的障碍。这个问题就是,在表示(as-is)代码和实际执行的代码产生更多代码后,会有一堆恐怖的混合代码。这个组合天生就是那么难以理解,也很难控制。我们真的需要一些更大胆的新想法。
如果要使用微软的DSL工具,需要下载安装Visual Studio 2005 SDK v4.0,而且机子上要安装有Visual Studio 2005专业版或者Visual Studio 2005团队版的某一版本。尽管没有明确说明,在安装VS 2005时还是要确认选择Visual C++环境,因为当前发布的工具是使用VC++项目生成的附属DLL,它存储了DSL的源代码。

注:感谢ThoughtWorks咨询师徐昊对本文翻译的技术审校。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT