11 | DSL:你也可以设计一门自己的语言
郑晔
你好!我是郑晔。
在前面,我们花了三讲的篇幅探讨程序设计语言,一方面是为了增进我们对程序设计语言的理解,另一方面,也希望从中学习到软件设计方面做得好的地方。除了借鉴一些语言特性之外,我们还能怎样应用程序语言,来帮我们做设计呢?
讲到程序设计语言模型时,我说过,程序设计语言的发展趋势,就是离计算机本身越来越远,而离要解决的问题越来越近。但通用程序设计语言无论怎样逼近要解决的问题,它都不可能走得离问题特别近,因为通用程序设计语言不可能知道具体的问题是什么。
这给具体的问题留下了一个空间,如果我们能把设计做到极致,它就能成为一门语言,填补这个空间。注意,我这里用的并不是比喻,而是真的成为一门语言,一门解决一个特定问题的语言。
这种语言就是领域特定语言(Domain Specific Language,简称 DSL),它是一种用于某个特定领域的程序设计语言。这种特定于某个领域是相对于通用语言而言的,通用语言可以横跨各个领域,我们熟悉的大多数程序设计语言都是通用语言。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
领域特定语言(DSL)是针对特定领域的程序设计语言,相对于通用语言,DSL能更好地满足特定领域的业务需求,降低理解的门槛。DSL分为外部DSL和内部DSL,内部DSL体现更多的是表达能力,将作者的意图体现了出来。设计DSL时,重点是要体现出意图,这也是很多程序员忽略的地方。好的设计要迈向DSL,从编写有表达性的代码起步。内部DSL的开发成本更低,与日常工作结合得更加紧密,即便不去设计一个内部DSL,这种写代码的方式也会对代码质量的提高大有助益。通过DSL,可以更好地满足特定领域的需求,降低理解的门槛,提高软件设计的效率。 DSL的发展趋势是离计算机本身越来越远,而离要解决的问题越来越近。好的设计要迈向DSL,从编写有表达性的代码起步。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《软件设计之美》,新⼈⾸单¥59
《软件设计之美》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(31)
- 最新
- 精选
- 蓝士钦SQL也是一种DSL,他屏蔽了计算机存储的底层实现,提供了易于操作数据的接口。 一些ORM框架对SQL这些DSL进行了进一步的封装提供了声明式注解,相当于构建在DSL之上的DSL翻译器。面向对象编程将面向关系的DSL进行更高层次的封装,使得在编程这个特定领域更加易于使用。
作者回复: 很好的分享!
2020-06-1736 - 小学一年级普通程序员的关注点只在于功能如何实现,而优秀的程序员会懂得将不同层次的代码分离开来,将意图和实现分离开来,而实现可以替换。 老师 意图和实现具体指什么还是不太明白,
作者回复: 意图,做什么,实现,怎么做。 意图可以理解成方法命名,实现可以理解成方法里的每行代码。 意图可以理解成接口定义,实现可以理解成实现类。
2020-06-2821 - 被雨水过滤的空气高级编程语言是低级编程语言的DSL。
作者回复: 哈哈,确实可以这么理解。
2020-06-1813 - 泡泡龙我觉得markdown应该算一个
作者回复: 嗯,好有趣的角度!
2020-06-1713 - Atong许多同学的评论里列举了许多场景,例如UML,markdown虽不能执行,不能算是DSL。但其中将意图和实现分离的理念,应该是一致的。 DSL的一个深意是在于描述意图而不是描述过程。 那其实取名字也可以理解为一种意图的表现。例如菜单上的蓝莓蛋糕,就是一种意图描述,而不是过程描述:我要一个蛋糕,然后上面要加上一些蓝莓。
作者回复: 这个理解很赞!
2020-09-049 - Jxin1.k8s和docker-compose的yml文件,就是声明试编程。算是外部dsl。 2.本章疑问: dsl和接口有何异同点? 首先dsl和接口都做了一件事,就是意图和实现的分离。但是dsl的语义(意图)是可以灵活组织的,而接口的语义基本靠接口命名和方法命名来阐述,在灵活性上明显是不足的。 如何去实现dsl?第一感觉就是建造者模式。这里实现就有分支。第一种是将要执行的业务逻辑(实现)写在dsl实体bean内部。在所有业务功能都由实体内部属性决定时,这是可行的(领域模型的行为);第二种是将执行的业务功能注入要创建的dsl实体,然后回调。毕竟复杂业务流程的组织不该是单个实体能够囊括的,而且我们的功能代码大部分还是面向过程的(java就是一个service注入一个service,然后嵌套调用);第三种就是将dsl实体作为入参传入接口方法,然后通过其属性调整业务流向,控制代码逻辑。这种方式我认为是开发维护成本最低的(面向过程不好,但他简单呀,不需要什么设计知识背书,懂语法就能看懂),但是我在某本书看到过,“程序的逻辑不该由入参去控制”。是定制多个接口方法。还是提供统一方法由入参调度逻辑,真的不好说孰好孰劣。
作者回复: 后面我们就来谈结构化编程和面向对象编程。
2020-06-1727 - 蜗牛不会飞Quartz等调度框架常用的Cron表达式也是一种DSL吧
作者回复: 嗯,还真是。
2020-07-016 - happychapdrone.io用的.drone.yml,jenkins用的pipefile都算是轻量级的dsl。uml算不算是一种重量级的dsl呢?
作者回复: UML可能不算,因为它不能执行。
2020-06-176 - 阳仔DSL是为了解决某个特定领域的程序设计语言。 作为一个客户端APP开发者,最常用到的莫过于gradle。 现在JAVA后端程序主要是通过pom配置构建,它其实就是通过xml来实现DSL, 我觉得后端程序通过gradle构建也将会成为主流。它比xml更加灵活,表达性更强 要设计一个DSL就要构建一个模型,通过接口将能力暴露出来。 如何暴露接口就可以分为内部DSL和外部DSL,内部DSL使用编程语言如JAVA来实现,外部则使用类似xml语言来实现,或者自己设计语法 实现内部DSL要将意图与实现区分开,这在程序设计中一个重要的原则
作者回复: 非常好的总结!
2020-06-175 - 行与修lambda,网络协议描述算不算是dsl呢?
作者回复: DSL 首先是一门语言,能够执行的那种。单独的 Lambda 和协议都是不可执行的。
2020-06-174
收起评论