NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

Java进阶(二十八)SimpleDateFormat格式化日期问题

No Silver Bullet

Java 9月月更

会当“零”绝顶!天翼云零信任产品利刃出鞘

天翼云开发者社区

安全

SQL为什么历经半个世纪却经久不衰?

雨果

sql

MobTech短信验证ApiCloud端SDK

MobTech袤博科技

API 短信验证

融云云盘,不止于存储

融云 RongCloud

云盘 云存储

如何选择靠谱的西安培训机构?

小谷哥

天翼云全场景业务无缝替换至国产原生操作系统CTyunOS!

天翼云开发者社区

系统

工赋开发者社区 | 从零开始的新跨平台浏览器:Ladybird 正式起飞

工赋开发者社区

易观千帆 | 2022年7月银行APP活跃用户规模盘点:江浙沪城商行表现亮眼

易观分析

App 金融 银行

参加Java培训能学到开发技术吗?

小谷哥

人工智能、机器学习与深度学习的区别在哪里?

Finovy Cloud

人工智能 深度学习

数据湖管理及优化

阿里云大数据AI技术

大数据 spark 数据湖 企业号九月金秋榜

JAVA开发培训哪家比较好

小谷哥

DataLeap的Catalog系统近实时消息同步能力优化

字节跳动数据平台

大数据 kafka 数据治理 实时同步 数据研发

常见堡垒机小知识汇总-行云管家

行云管家

安全 IT 堡垒机 IT运维

自学Java和java培训哪个好就业

小谷哥

【微信小程序】页面导航详解

陈橘又青

9月月更

Wallys /QCA9880 vs QCA9882/802.11ac Solution/MU-MIMO

wallys-wifi6

QCA9880 QCA9882

QA如何高效参与技术设计评审

转转技术团队

质量管理 测试 技术设计质量把控

年轻一代程序员:社牛、不卷、玩开源

腾源会

开源 腾源会

面了个阿里拿38k出来的,让我见识到了基础顶端

程序知音

Java java面试 后端技术 秋招 八股文

限时开源!阿里P8架构师手写Spring全家桶核心知识学习笔记

了不起的程序猿

Java spring 编程 程序员 Spring全家桶

过等保是浪费钱吗?一定要过等保吗?

行云管家

等级保护 过等保 等保2.0

ApacheCon Asia 2022 精彩回顾 | 如何让更多人从大数据中获益?

Apache DolphinScheduler

Java之static关键字的应用【工具类、代码块和单例】

Fire_Shield

static 9月月更 实际应用

2022年8月中国网约车领域月度观察

易观分析

网约车

10CSS动画案例,学会了惊艳所有人

大师兄

CSS 前端 9月月更

阿里巴巴“高并发”天花板教程《基础+实战+源码+面试+架构》

程序知音

Java 高并发 阿里 多线程与高并发 java架构

技术分享| 分布式系统中服务注册发现组件的原理及比较

anyRTC开发者

音视频 分布式系统

信用卡市场发展洞察:浦大喜奔APP探索大零售融合经营体系

易观分析

金融 银行 信用卡

Java培训学生可以学到哪些开发技术呢

小谷哥

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