• home > theory > engineering > model >

    从DDD到DSL的一些认知总结

    Author:zhoulujun Date:

    DSL 其实是 Domain Specific Language 的缩写,中文翻译为领域特定语言(下简称 DSL);而与 DSL 相对的就是 GPL,这里的 GPL

    DSL 其实是 Domain Specific Language 的缩写,中文翻译为领域特定语言(下简称 DSL);而与 DSL 相对的就是 GPL,这里的 GPL 并不是我们知道的开源许可证,而是 General Purpose Language 的简称,即通用编程语言,也就是我们非常熟悉的 Objective-C、Java、Python 以及 C 语言等等。

    Wikipedia 对于 DSL 的定义还是比较简单的:

    A specialized computer language designed for a specific task.

    为了解决某一类任务而专门设计的计算机语言。

    与 GPL 相对,DSL 与传统意义上的通用编程语言 C、Python 以及 Haskell 完全不同。

    • 通用的计算机编程语言是可以用来编写任意计算机程序的,并且能表达任何的可被计算的逻辑,同时也是 图灵完备 的。

    • DSL 并不是图灵完备的,它们的表达能力有限,只是在特定领域解决特定任务的。

    另一个世界级软件开发大师 Martin Fowler 对于领域特定语言的定义在笔者看来就更加具体了:

    DSL 通过在表达能力上做的妥协换取在某一领域内的高效

    设计原则和妥协

    DSL 最大的设计原则就是简单,通过简化语言中的元素,降低使用者的负担

    因为简单, 所以也非常易于阅读,在其擅长的领域内编码是非常高效的。

    无论是 Regex、SQL 还是 HTML 以及 CSS,其说明文档往往只有几页,非常易于学习和掌握。但是,由此带来的问题就是,DSL 中缺乏抽象的概念,比如:模块化、变量以及方法等。

    抽象的概念并不是某个领域所关注的问题,就像 Regex 并不需要有模块、变量以及方法等概念。

    由于抽象能力的缺乏,在我们的项目规模变得越来越大时,DSL 往往满足不了开发者的需求;

    我们仍然需要编程语言中的模块化等概念对 DSL 进行补充,以此解决 DSL 并不是真正编程语言的问题。

    在当今的 Web 前端项目中,我们在开发大规模项目时往往不会直接手写 CSS 文件,而是会使用 Sass 或者 Less 为 CSS 带来更强大的抽象能力,比如嵌套规则,变量,混合以及继承等特性。

    也就是说,在使用 DSL 的项目规模逐渐变大时,开发者会通过增加抽象能力的方式,对已有的 DSL 进行拓展;但是这种扩展往往需要重新实现通用编程语言中的特性,所以一般情况下都是比较复杂的。

    从DDD范畴来讲,有一个通用语言,解决的是有一套通用语言能让领域专家和开发人员面对复杂业务需求很多专有名词都能达到认证上的统一。

    DDD范畴来讲DSLDSL与DDD的关系



    简单的实现一个DSL的步骤

    对于 GPL 来说,往往存在文件读取、词法分析、语法解析、语义分析、中间代码生成、编译为目标代码、对目标代码进行链接等过程。

    参考这篇文章理解编译过程: https://craftinginterpreters.com/a-map-of-the-territory.html

    而 DSL 语言往往比较简单,中间过程往往只需要得到抽象语法树(AST),并将其转换为目标代码,或者使用目标代码读取 AST 完成某些业务目标即可。 甚至将 AST 转换为目标代码的过程大多可以使用模板引擎完成。


    要完整实现一个DSL,需要以下步骤:

    1. 定义DSL的语法和语义:DSL语言需要有自己的语法和语义,以便用户能够使用该语言来表达自己的意图。语法定义通常使用BNF或EBNF表示。

    2. 实现DSL的解析器:DSL解析器是将DSL代码解析为计算机可执行的指令的程序。解析器通常使用词法分析器和语法分析器来实现。

    3. 实现DSL的执行器:DSL执行器是将DSL代码转化为实际的计算机操作的程序。执行器通常使用解释器或编译器实现。

    可以参考: 

    懂前端的你也可以轻松定义自己业务的DSL https://cloud.tencent.com/developer/article/2238663

    前端DSL与AST深入浅出实战 https://ke.segmentfault.com/course/1650000018003974/section/1500000017988859

    系统设计 | 设计和解析 DSL https://shaogefenhao.com/posts/architecture/dsl.html#使用-antlr-实现数学表达式





    参考文章:

    谈谈 DSL 以及 DSL 的应用(以 CocoaPods 为例) https://draveness.me/dsl/

    理解DSL https://wyuanhpp.github.io/2020/06/30/理解DSL/

    前端 DSL 实践指南(上)—— 内部 DSL https://zhuanlan.zhihu.com/p/107947462

    大白话之DSL(领域特定语言) https://zhuanlan.zhihu.com/p/551787676



    转载本站文章《从DDD到DSL的一些认知总结》,
    请注明出处:https://www.zhoulujun.cn/html/theory/engineering/model/9085.html