速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

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

关注

评论

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

中小微企业如何简单便捷、低成本实现数字化?360视觉云有妙招

ToB行业头条

酷开科技 × StarRocks:统一 OLAP 分析引擎,全面打造数字化的 OTT 模式

StarRocks

如何避免无效的沟通

观测云

GaussDB(for Redis)安全性相关设置体验【华为云至简致远】

科技怪咖

一键进入华为云会议,长期免费值得所有开发团队有一套【华为云至简致远】

科技怪咖

基于DMS的数仓智能运维服务,知多少?

华为云开发者联盟

数据库 后端 监控 智能运维

如何面向对象编程?程序员:我也要先有"对象"啊

华为云开发者联盟

Python 编程 后端 开发

基于Java的插件化集成项目实践

阿提说说

微服务 插件化

绝无此例!用实例演示如何使用Spring搭建微服务框架

Java永远的神

spring 面试 微服务 springboot SpringCloud

「一篇终结JVM」:Java面试必问十个JVM核心知识点梳理

Java全栈架构师

Java 程序员 面试 程序人生 JVM

完整的搭建内网穿透ngrok详细教程(有图有真相)

Geek_32c728

签约计划第三季

【技术白皮书】第二章:OCR智能文字识别回顾——自然语言文本发展历程

合合技术团队

深度学习 AI OCR 自然语言 信息抽取

从零开始搭建MySQL主从复制架构

杨杰灵

Java MySQL 主从复制

国内首发可视化智能调优平台,小龙带你玩转KeenTune UI

OpenAnolis小助手

开源 龙蜥社区 sig KeenTune 一键式性能调优

秀到飞起!Alibaba全新出品JDK源码学习指南(终极版)限时开源

Java全栈架构师

程序员 程序人生 jdk源码 Java 面试 架构师

基于云ModelArts的PPO算法玩“超级马里奥兄弟”【华为云至简致远】

科技怪咖

开源一夏 | 十分钟 教你IDEA 远程debugger SpringBoot项目

Geek_32c728

开源 8月月更

视频人脸识别和图片人脸识别的关系

夏夜许游

人脸识别 视频人脸识别

华为ECS云服务器上安装Docker及部署Redis详细教程【华为云至简致远】

科技怪咖

企业如何选择低代码开发平台

力软低代码开发平台

高效的组织信息共享知识库是一种宝贵的资源

Geek_da0866

融云「音视频架构实践」技术专场【内含完整PPT】

融云 RongCloud

音视频技术

ICDAR比赛技术分享

之家技术

算法 人工只能 竞赛 ICDAR

可复现、开放科研、跨学科合作:数据驱动下的科研趋势及应用方案

ModelWhale

数据分析 代码复现 开放生态 协同软件 科研成果

面试不再被吊打!这才是Redis分布式锁的七种方案的正确打开方式

程序员小毕

Java 架构 面试 分布式 分布式锁

浅谈Service Mesh对业务系统的价值

HelloGeek

微服务 云原生 server mesh 微服务治理

为何微博又双叒叕崩溃了?

华仔

CC2530_ZigBee+华为云IOT:设计一套属于自己的冷链采集系统

华为云开发者联盟

IoT 华为云 冷链

云图说丨初识华为云微服务引擎CSE

华为云开发者联盟

微服务 云服务 华为云

关于 Intel 在 micro-vm 快速启动的探索及实例演示 | 第 36-38 期

OpenAnolis小助手

云原生 cpu 开源社区 sig 龙蜥大讲堂

【技术白皮书】第一章:OCR智能文字识别新发展——深度学习的文本信息抽取

合合技术团队

自然语言处理 深度学习 AI OCR 信息抽取

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