InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

WebDSL:DSL设计案例

作者 Jean-Jacques Dubray 译者 郭晓刚 发布于 2008年6月29日

领域
架构 & 设计,
语言 & 开发
主题
领域专用语言 ,
架构
标签
JPA ,
JBoss Seam ,
JSF

Eelco Visser是荷兰Delft University of Technology大学的副教授,他讲授的课程是“程序变换和自动生成(Program Transformation & Generation)”。

他刚刚完成了一篇题为《WebDSL: A Case Study in Domain-Specific Language Engineering》的论文,主题是讨论WebDSL这种领域特定语言的设计和实现。

论文用两章介绍“领域特定语言工程”的过程,用三章评估WebDSL作为Web设计解决方案,讨论相关的DSL设计方法,及研究语言工程中的挑战。

WebDSL是一种领域特定语言,用于开发具有丰富数据模型的动态Web应用。它采用JBoss Seam作为底层的目标架构基础。WebDSL的第一个alpha版本发布于2007年12月。

Eelco将DSL定义为:

  • DSL是一种语言,也就是说,它是由文本或图形标记构成的语句的集合,有着正式定义的语法和语义。
  • DSL是高层次的,由低层次的实现细节和实现平台的具体事物抽象而来。
  • DSL应该支持软件实现。
  • DSL中的概念和抽象与特定的领域相关联。

在Eelco看来,DSL的目标应该是:

……从低层次的重复代码中抽象出来,提高软件工程的生产效率。

通用语言中的传统的抽象机制,如方法和类,已不足以满足建立新的抽象层次的需要。库和框架很适合封装功能,但程序员用来访问那些功能的语言,也就是API,常常都很别扭。

有时候,API允许使用更合适的语言,但却采取了字符串的形式将语句传递给库调用(如SQL查询),宿主语言是不会检查这些语句的语法的,更别提语义了。

他认为我们需要:

……设计和实现DSL的技术,更需要指导如何使用这些技术的方法学。也就是说,我们需要一套指导方针、设计模式和可重用的DSL组件,向开发者演示如何解决一般的语言设计和实现问题。

虽然如此,他说,

Web应用的设计是相当成熟的一个领域……为这个领域开发DSL已经具备了坚实的基础:

  • 任务自动化:即便有了Java Servlets和JSF,Web编程中仍然存在数量可观的重复(boilerplate)代码。
  • 表示法(Notation):当前的平台将多种相当繁琐、且针对不同问题的语言混杂在一起,未能融为一个整体。
  • 检查(Verification):多种Web应用技术之间缺乏整合的另一项后果,是导致缺乏对实现的静态检查。
  • GUI构建:[JSP风格的框架通常]对由模板生成的HTML代码的结构一无所知,因此很容易产生结构不正确的文档。[即使在JSF中,]模板非常繁琐,过于关注低层次的细节。
  • 分析和优化:例如,采用Wiedermann and Cook【译注:请参阅论文的参考文献108】方法优化数据库查询能提高程序的性能,而无需求助于手工调整自动生成的查询。

Eelco总结了三项DSL设计模式:

  • 寻找编程模式
  • 设计核心语言
  • 在核心语言的基础上建立语法抽象

他从定义一种文本的Data Model DSL开始着手设计WebDSL。代码生成器对用Java代码(JPA)定义的实体作变换。接着他开发了一种View/Edit DSL,用来生成JSF页面和Seam session bean。然后在这两种DSL的基础上进一步“扩大WebDSL的覆盖范围”,引入可以自定义的View/Edit页面、数据集合以及复杂的关联关系。

Eelco报告说生成的代码行数与DSL代码的比值超过100,并认为改善代码生成器会有很好的回报。

论文接着讨论了“语言工程范式”和“语言工程中的挑战”,尤其是“模型的变迁”。

根据他的经验,他建议说:

  • 如果对应用领域有深刻的理解,且在领域的系统已经具备相当程度的代码基础,即可开始开发DSL。
  • 第一步观察一些较大的程序段,看是否可以作为一种编程模式。
  • 研究和理解技术,识别共通的模式。尽早建立一个基本的代码生成器。
  • 语法不应太过“特定”。
  • 不要一开始就试图识别出核心语言。那样可能会使设计出的语言过于接近目标技术。
  • 在核心语言的基础上扩展出语法抽象,语法抽象的表述应当简洁。
  • 为库的构建提供便利,比如将代码组织成模块,以及在DSL片断上增加参变抽象(parametric abstraction)。
查看英文原文:WebDSL: Lessons Learned from Creating a DSL

译者 郭晓刚 是InfoQ中文站架构社区编辑,创建并终结过数家软件小企业,翻译过多本技术书籍。

DSL----新的银弹? 发表人 hong yong 发表于
Re: DSL----新的银弹? 发表人 Zhou Yl 发表于
翻译的不是很地道 发表人 janwen lo 发表于
  1. 返回顶部

    DSL----新的银弹?

    发表人 hong yong

    说起来很是诱人,是否能成为新的银弹?

  2. 返回顶部

    Re: DSL----新的银弹?

    发表人 Zhou Yl

    《人月神话》中提过,没有真正的银弹

  3. 返回顶部

    翻译的不是很地道

    发表人 janwen lo

    翻译的不是很地道,读起来别扭

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。