高品质的音视频能力是怎样的? | Qcon 全球软件开发大会·上海站邀请函 了解详情
写点什么

Martin Fowler 揭开了他即将出版的 DSL 新书的面纱

  • 2007-11-28
  • 本文字数:1807 字

    阅读完需:约 6 分钟

Martin Fowler 揭示了他即将出版的关于 DSL 的新书的一些细节,在他的工作进展网站上发布了该书引言部分的第一稿。这本书很可能有一个“复式的”结构,包含一个叙述部分和一个以模式的形式展现若干 DSL 主题的参考部分。

引言草稿提供了 DSL 的一些背景元素。除了他以前的文章,Fowler 又在 Jaoo 2006 大会上以及最近于巴塞罗那举行的一次 TSS 活动中进一步发展了他的思想,在这些基础上,他举出了一个领域特定语言的案例并提出了一些对 DSL 的实现和使用的新见解。

在定义 DSL 是什么的问题上,Flowler 认为目前经常使用的一些特征,例如“关注于领域”、“有限的表现”和“语言本质”是非常模糊的。因此,唯一能够确定 DSL 边界的方法是考虑“一门语言的一种特定用法”和“该语言的设计者或使用者的意图”:

如果 XSLT 的设计者将其设计为 XML 的转换工具,那么我认为 XSLT 是一个 DSL。如果一个用户使用 DSL 的目的是该 DSL 所要达到的目的,那么它一个 DSL,但是如果有人以通用的方式来使用一个 DSL,那么它(在这种用法下)就不再是一个 DSL 了。

以 Fowler 的观点,DSL 首先是一种帮助用户从一个系统中抽象出某些部分的工具。所以“当你意识到你需要一个组件,或者当你已经有了一个组件而你希望简化操作它的方式的时候”,DSL 是有用的。使用 DSL 确实提供了某些益处。DSL 不仅提高了代码的易读性,让开发者可以和领域专家更好的交流,而且是改变执行上下文的一种手段,例如:把逻辑从编译时切换到运行时,或者当命令式编程不是很合适的时候转用声明式计算模型。

在 Fowler 所用的例子中,他在一个框架已经确定好的 API 之上实现 DSL。他强调也可以从 DSL 的设计开始动手。在这种情况下,应该首先定义“一套控制器行为的样本”,并以 DSL 的形式写出来。为了继续实现工作必须既构建框架和 API,同时也构建 DSL 的具体语法。有三种可能的途径:

有些人喜欢同时处理所有这些元素的一小部分:构建一部分组件功能,编写驱动这些功能的 DSL,然后用测试把它们串起来。其他人也许愿意先构建并测试框架,然后在框架之上加上 DSL 层。还有一些人也许喜欢先准备好 DSL,然后再构建库,最后将 DSL 与库装配在一起。

Fowler 还对 DSL 可能的应用提出了预见。一个最显而易见的应用是一个运行的程序可以由解释 —— 程序的即时执行产生 —— 或者由代码生成器产生。为了避免后一种情况带来的汇编层,开发者可以使用诸如 Javascript 的动态语言。在解释阶段有两种处理方法:“一步解释,DSL 中的每条语句立刻被分析和解释”或者“两步解释,首先将输入的 DSL 全部分析并转变为用抽象语言表示的程序,然后执行抽象形式的程序”。 Fowler 强调内部 DSL 通常是解释执行的,然而“目前外部 DSL 的教程通常假设你使用代码生成技术”,尽管 Fowler 的观点是外部 DSL 也应该使用解释执行的方式。

DSL 还可以用来产生可视化的表示,即领域的一个只读投影。这样可以为“很难有可编辑的形式”的任务例如创建一个图表这样的任务提供更多的选择。当“创建一个组件框架的困难工作”完成之后,附加这样的可视化实际上是容易的。

最后但是也很重要的是,Fowler 列出了与 DSL 的使用相关的一些问题。除了通常所诟病的问题 —— 构建的代价,语言不调和的风险,困难的设计 —— 以外,Fowler 强调了迁移的问题。他相信 DSL 的迁移非常类似于 API 的迁移。不同之处是缺乏工具,例如,重构的工具,特别是外部 DSL 尤其缺乏。对于迁移问题,有一些技术也许有用,例如,Migration Execution,Fowler 定义该技术为“令得到产生源代码所需的抽象层变得相对容易,可以具体化你希望作出的任何变化”。

Fowler 提出的另一个议题是需要一贯地当心不要让事情变得太复杂,不要让事情演化为一般性的问题。他提倡为了“特殊和困难的情形”引入另外的语言,将该语言置于基础 DSL 的上层。Fowler 相信与 DSL 使用相关的问题通常是言过其实的,源于“通常人们对于如何构建 DSL 不够熟悉,对于如何将 DSL 融入更广阔的软件开发的全景没有足够的认识”。

要得到这些议题以及相关议题的更多信息,请参考 Fowler’s Work in Progress on the book

查看英文原文 Martin Fowler unveils details of his upcoming DSL book - - - - - -

译者简介: 曹云飞,西安交通大学计算机软件硕士。现就职于 Ethos ,热衷于新技术的钻研,软件架构与敏捷开发,目前从事 Home Control 方面的工作。参与 InfoQ 中文站内容建设,请邮件至 china-editorial[at]infoq.com

2007-11-28 23:53903
用户头像

发布了 47 篇内容, 共 87042 次阅读, 收获喜欢 2 次。

关注

评论

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

“程”风破浪的开发者|OpenHarmony应用开发环境搭建

技能实验室

OpenHarmony “程”风破浪的开发者

uniapp打开地图选择位置

源字节1号

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

Go语言入门04—循环语句

良猿

Go golang 后端 10月月更

遮罩和蒙版有什么区别,视频遮罩怎么用

懒得勤快

node+express操作cookie

木偶

前端 Node Express 10月月更

合约量化策略系统源码开发(技术搭建说明)

l8l259l3365

“程”风破浪的开发者|OpenHarmony的ArkUI的类Web范式开发详解

上进小菜猪

OpenHarmony 10月月更 “程”风破浪的开发者

途游游戏 DevOps 实践|都说「单元测试」好,「AAAC四步法」少不了

极狐GitLab

DevOps 运维 单元测试 CI/CD 代码安全

不可错过!14位安全大拿齐聚!AMD、Arm及Intel等技术专家解读系统安全 | 2022云栖大会

OpenAnolis小助手

开源社区 系统安全 云栖大会 龙蜥安全专场 操作系统峰会

ERP到底是自研还是外采好????

CTO技术共享

10月月更

担时代任务 与国家同频 | 九科信息创始人万正勇:自主可控是中国超级自动化技术发展的必要条件

九科Ninetech

RPA 信创

驾考宝典携手HMS Core统一扫码服务,构建复杂场景中的流畅扫码体验

HMS Core

扫码

【kafka原理】kafka Log存储解析以及索引机制

石臻臻的杂货铺

kafka 10月月更

原来Vue3的computed属性还能这么用啊🔥

渔戈

Vue 前端 10月月更

自主创新、领先一代,星环科技成功登陆科创板

星环科技

大数据 开源

如何进行企业数字化转型?传统企业数字化转型的3大底层逻辑

优秀

企业数字化转型

促双碳|AIRIOT智慧能源管理解决方案

AIRIOT

物联网 智慧能源

BH1750 光照传感器文档详解 及 驱动设计

矜辰所致

传感器 stm32 I2C协议 10月月更 BH1750

强烈推荐!腾讯T8架构师手写的SpringBoot分布式架构笔记

小小怪下士

Java 分布式 后端 springboot

生产环境P0级事故,整个项目组被罚

CTO技术共享

Go语言入门03—条件语句

良猿

Go golang 后端 10月月更

golang中的map

六月的

Go map

常见恶意软件类型及危害

郑州埃文科技

网络安全 恶意软件 办公安全

pt尾递归优化

hellocoder2029

JavaScript

为什么vue3要选用proxy,好处是什么?

hellocoder2029

JavaScript

前端懒加载和预加载

hellocoder2029

JavaScript

秒杀活动!!!! 如何撑住10W QPS

CTO技术共享

10月月更

Mysql数据库基础之数据库的安装与配置

渔戈

MySQL 数据库 10月月更

一文彻底搞懂前端缓存机制

hellocoder2029

JavaScript

数字云栖,邀您共享极致计算与创新进化的科技盛宴

阿里云视频云

阿里云 边缘计算 云栖大会

分布式事务-CAP理论

zarmnosaj

10月月更

Martin Fowler揭开了他即将出版的DSL新书的面纱_架构_Sadek Drobi_InfoQ精选文章