写点什么

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

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

关注

评论

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

Dart _ 什么是Stream,安卓开发不得不会

android 程序员 移动开发

Flutter 官方尝试放只“鸽子”来简化Native插件开发,复习指南

android 程序员 移动开发

Flutter 中的 JSON 解析(1),androidsdk环境配置

android 程序员 移动开发

华云大咖说 | 安超DCM运维场景解决方案

华云数据

Flutter 仿掘金推特点赞按钮,kotlin中文版

android 程序员 移动开发

Flutter 如何发布安卓应用?,flutter文档发布组件

android 程序员 移动开发

web技术分享| 一人一天一个可移植的实时聊天系统

anyRTC开发者

大前端 Web 音视频 实时通信 实时聊天

ConstrainLayout 基础教程2,2021Android精选面试实战总结整理

android 程序员 移动开发

Coroutine 基本原理,Android开发大佬的百度美团快手等大厂Offer收割之旅

android 程序员 移动开发

如何打造实时性的弹窗?

神策技术社区

UI sdk Android;

Flutter Android 工程结构及应用层编译源码深入分析,Android面试题及答案2020

android 程序员 移动开发

Dart Flutter 1,flutter页面跳转动画

android 程序员 移动开发

Flutter Candies 一桶天下,kotlin编程软件

android 程序员 移动开发

下一代信息技术论坛云操作系统介绍

架构 操作系统

Flutter RichText支持图片显示和自定义图片效果,经典Android开发教程

android 程序员 移动开发

Dart 层如何 兼容 Android 和iOS平台特性 (1),Android开发面试技巧

android 程序员 移动开发

FART:ART环境下基于主动调用的自动化脱壳方案,androidndk开发教程

android 程序员 移动开发

Flutter _ 日志还能这么打印,太秀了!,android移动应用基础教程

android 程序员 移动开发

Flutter 仿掘金微信图片滑动退出页面效果,写给程序员的Flutter详细教程

android 程序员 移动开发

DialogFragment探索与实现,音视频编解码技术

android 程序员 移动开发

Flutter 与 Compose怎么选?小孩子才做选择,kotlinwindows桌面开发

android 程序员 移动开发

Flutter 中的 JSON 解析,事件分发机制Android

android 程序员 移动开发

Flutter Android 端 FlutterInjector 及依赖流程源码分析

android 程序员 移动开发

Flutter 入门与实战(九),android软件开发前景

android 程序员 移动开发

Flutter 入门与实战(十三),安卓framework层开发

android 程序员 移动开发

ConstraintLayout 1,flutterrow换行

android 程序员 移动开发

Context那些你不知道的事?,张口就来

android 程序员 移动开发

EventBus核心原理其实保存这三张图就可以弄懂了,收藏一下

android 程序员 移动开发

filter、interceptor、aspect不知如何选择,移动应用开发案例教程

android 程序员 移动开发

ConstraintLayout 2,android双击事件响应

android 程序员 移动开发

DateUtils(一个日期工具类),androidauto百度地图

android 程序员 移动开发

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