写点什么

WebDSL:DSL 设计案例

  • 2008-06-29
  • 本文字数:1575 字

    阅读完需:约 5 分钟

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

2008-06-29 23:182303
用户头像

发布了 225 篇内容, 共 74.3 次阅读, 收获喜欢 53 次。

关注

评论

发布
暂无评论
发现更多内容

企业级小程序技术平台与中间件提供商凡泰极客完成近亿元B轮融资

FN0

小程序 小程序化

vivo蓝心大模型登陆火山方舟,一站式方案实现智能普惠

新消费日报

8000-12000奖金等你拿,OpenTiny 开源之夏10大导师齐上阵,带你立刻get 项目详情!!!

OpenTiny社区

Vue 前端 低代码 组件库 OpenTiny

解锁高效创新:IPD策略如何重塑产品开发流程

IPD产品研发管理

项目管理 产品经理 IT IPD 产品研发

一键自动化博客发布工具,用过的人都说好(51cto篇)

程序那些事

工具 自动发布

Python最容易犯的五个错误,你中了几个?

我再BUG界嘎嘎乱杀

Python 编程语言 开发语言

结合多模态 AI 谷歌展示 AR 眼镜原型机;Meta 被曝开发带摄像头的 AI 耳机丨 RTE 开发者日报 Vol.204

声网

企业如何搭建API经济形成二次增长?

幂简集成

API API经济

报名倒计时|来蚂蚁C空间,参与一场开源隐私计算及 AI 技术与应用落地的探讨~

TRaaS

活动报名

一文读懂Pencils Protocol Valut的收益叙事:一鱼多吃

西柚子

宝尊将于2024年5月28日发布2024年一季度未经审计财务业绩

财见

百度百舸 AIAK-LLM 的大模型训练和推理加速实践

Baidu AICLOUD

训练 推理 大模型

代购独立站一键代采:开启全球购物新纪元,无缝连接中国制造与世界市场

Noah

2024-05-15:用go语言,考虑一个整数 k 和一个整数 x。 对于一个数字 num, 在其二进制表示中, 从最低有效位开始, 我们计算在 x,2x,3x 等位置处设定位的数量来确定其价值。

福大大架构师每日一题

福大大架构师每日一题

数据库索引回表困难?揭秘PolarDB存储引擎优化技术

阿里云瑶池数据库

数据库 阿里云 polarDB 分布式,

MyBatis如何通过拦截器修改SQL

源字节1号

开源 软件开发 前端开发 后端开发 小程序开发

万界星空科技电线电缆行业生产管理智能化MES

万界星空科技

mes 万界星空科技 电线电缆行业 电线电缆mes

金蝶发布AI管理助手 重构苍穹AI平台

人称T客

不容错过的邀请:《哈利·波特》全系列中英文版本上线华为阅读

最新动态

MySQL 给用户添加 ALTER VIEW 的权限

华为云开发者联盟

MySQL 数据库 华为云 华为云开发者联盟 企业号2024年5月PK榜

什么是ARP攻击,怎么做好主机安全,受到ARP攻击有哪些解决方案

德迅云安全杨德俊

软件测试学习笔记丨MyBatis 多条件查询和模糊查询

测试人

软件测试

中文域名和英文域名有什么区别?中文域名有哪些优势?

防火墙后吃泡面

Pencils Protocol 宣布再获合作伙伴 Galxe 的投资

加密眼界

WebDSL:DSL设计案例_架构_Jean-Jacques Dubray_InfoQ精选文章