阿里、微众、PingCAP专家分享如何解决可观测性带来的埋点成本上升、观测数据割裂等挑战。戳 了解详情
写点什么

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

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

关注

评论

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

Elasticsearch document 的 _source 元数据

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

深度解读设备的“万能语言”鸿蒙系统的分布式软总线能力

华为云开发者联盟

鸿蒙 操作系统 智能设备 HarmonyOS 分布式软总线

悟透前端 | ECMAScript 6的Map映射

devpoint

json 大前端 map ES6

图说丨京东《技术重构社会供应链——未来科技趋势白皮书》

京东科技开发者

京东 智能供应链

连云港:“云底座”构建智慧教育的未来图景

浪潮云

一文带你搞懂从动态代理实现到Spring AOP

华为云开发者联盟

spring jdk 容器 aop 动态代理

2021年数字货币时代加速到来

CECBC

数字人民币

点位盘,点位盘开发,点位盘合约交易。

v16629866266

谈谈敏捷开发中的文档

张老蔫

28天写作

懂分析、会预测,你见过这样的华为云DAS吗?

华为云开发者联盟

人工智能 sql 数据管理系统 智能运维 华为云DAS

刷屏的微信8.0(文末附安卓下载链接) | 视频号 28 天 (15)

赵新龙

28天写作

数据库运维家中常备:上限约400MB/s,比COPY等工具还好用的数据利器

华为云开发者联盟

数据 GaussDB 数据迁移 gds FDW

Soul 学习笔记---使用 nacos 实现数据同步上篇(七)

fightingting

Soul网关

软件测试--cookie学习

测试人生路

软件测试

项目管理系列(7)-PMO有啥用

Ian哥

28天写作

在胡萝卜和大棒失效的当下,如何焕发员工的热情?

一笑

团队管理 管理 驱动力量 28天写作

Soul 源码阅读 02|WebSocket建立连接的过程

哼干嘛

接到需求,你要先做哪件事?

熊斌

学习 需求分析 28天写作

数字货币呼之欲出,但这些套路须警惕!

CECBC

数字货币

HPC on Volcano:容器在气象行业HPC高性能计算场景的应用

华为云原生团队

大数据 容器 云原生 k8s 分布式计算

2020年终总结:回顾、反思、期待

书旅

年终总结

MDF智能合约APP开发|MDF智能合约软件系统开发

系统开发

Linux:为什么性能工具需要 BPF 技术

博文视点Broadview

人类为啥要睡觉?

Justin

心理学 28天写作 睡眠

【CSS】内圆角(box-shadow、outline)

德育处主任

html5 大前端 Web CSS小技巧 28天写作

数字货币交易所系统开发|数字货币交易所软件APP开发

系统开发

Nine Ring九环智能合约软件开发|Nine Ring九环智能合约APP系统开发

系统开发

如何理解新技术带来的新资产类别?

CECBC

区块链

基于用户画像/AB测试的产品定价

无誉

AWS CDK | IaC 何必只用 Yaml

郭旭东

AWS 基础设施即代码 IaC

联动链金-魔方支付体系整理

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