写点什么

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:182326
用户头像

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

关注

评论

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

数据出境是什么意思?我国数据出境合规要求是什么?

行云管家

数据 数据安全 堡垒机 数据出境

手慢无!阿里云神作《Spring Boot进阶原理实战》真的太全了!

Java 微服务 Spring Boot 框架

什么是“语法糖”?Java中有哪些常见糖?

Java你猿哥

Java ssm Java工程师 语法糖

机器学习算法(九): 基于线性判别模型的LDA手写数字分类识别

汀丶人工智能

人工智能 数据挖掘 机器学习 LDA算法

AI + Kubernetes 赋能DevSecOps 的思考

HummerCloud

人工智能 Kubernetes DevOps

接通率维持66%以上,为什么火山引擎VeDI能让企业智能外呼不再难?

字节跳动数据平台

营销 用户增长 业务增长 客户数据 企业号 3 月 PK 榜

弯道超车!阿里高工新产Java面试速成指南,面试骚操作都在里面了

Java你猿哥

Java 面试 面经 Java工程师 春招

厉害了!阿里内部都用的Spring+MyBatis源码手册,实战理论两不误

Java你猿哥

spring 面试 Spring Boot mybatis 面经

数据库 CI/CD 工具 -- Bytebase 介绍

Se7en

最佳实践 | 用腾讯云智能语音打造智能对话机器人

牵着蜗牛去散步

腾讯云 腾讯 语音识别 语音合成 智能对话机器人

置顶两个月!《程序员如何向架构师转型》神作在Github持续霸榜

Java 程序员 系统设计 架构师

运动健康路线导入,助力用户轻松导航

HarmonyOS SDK

HMS Core

干货分享|袋鼠云数栈离线开发平台在小文件治理上的探索实践之路

袋鼠云数栈

大数据 平台开发

太厉害了!腾讯T4大牛把《数据结构与算法》讲透了,带源码笔记

Java你猿哥

Java 数据结构 算法 数据结构算法 左程云

用注解的方式优雅实现Ression分布式锁

Java 分布式锁 Ression

低代码平台搭建CRM 加速重构业务模式

力软低代码开发平台

LED透明屏私人定制势不可挡

Dylan

电子 LED显示屏 屏幕

微服务架构下你不得不知的3种部署策略

Java 架构 微服务

是找茬? 还是装 B?阿里面试每轮必问的“Spring Boot”意义何在?

三十而立

Dubbo 正式支持 Spring 6 & Spring Boot 3

Java你猿哥

Java spring Spring Boot dubbo ssm

MySQL 语句中 where 条件后为什么写上1=1 , 是什么意思?

Java你猿哥

Java MySQL sql 后端 ssm

马鞍山等级测评机构有哪些?有几家?在哪里?

行云管家

等保测评 等级测评 马鞍山

Bytebase vs Flyway

Bytebase

数据库 版本控制 变更

2023字节、腾讯、阿里等6家大厂Java开发面试真题+高频面试题总结

小小怪下士

Java java程序员 java面试 Java面试题

在 Kubernetes 中部署应用交付服务(第 2 部分)

NGINX开源社区

nginx Kubernetes

不懂就问:MySQL delete 表数据,磁盘空间为什么没有被释放?

Java你猿哥

Java MySQL 数据库 innodb Java工程师

阿里巴巴为什么不建议直接使用@Async注解?

Java你猿哥

Java ssm java8 Async Java工程师

凭借左程云(左神)的这份 “程序员代码面试指南”我入职了字节

Java你猿哥

Java 算法 数组 二叉树 面经

从 1000+ 参赛项目突围,涛思数据荣获 ITEC 2022 全球创业赛成长组二等奖

TDengine

tdengine 物联网 时序数据库 数字经济 大数据 开源

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