DSL 领域特定语言

一、DSL介绍

DSL(Domain Specific Language)是针对某一领域,具有受限表达性的一种计算机程序设计语言。 常用于聚焦指定的领域或问题,这就要求 DSL 具备强大的表现力,同时在使用起来要简单。说到DSL,大家也会自然的想到通用语言(如Java、C等)。

为什么没有一种语言同时 兼具『简洁』和『业务表达』能力呢?

从信息论本质上来讨论这个问题,每个语言的程序都可以抽象为一个字符串,每个字符串由有限数量的合法字符组成,它在运行时会实现某个功能,因而可以看作是一种需求的信源编码。每种需求可以映射到一个或多个正确的程序,但一个程序肯定只对应到一种需求,因而程序包含的信息熵不低于需求的信息熵。而程序中不仅仅需要描述需求的信息,还需要包含 可读性、辩识度,如果是静态语言还需要 静态检查等额外信息。 这里也可以看出来,为什么DSL是特定领域的语言了。

二、DSL分类

最常见的分类方法是按照DSL的实现途径来分类。马丁·福勒曾将DSL分为内部和外部两大类,他的分类法得到了绝大多数业界人士的认可和沿袭。内部与外部之分取决于DSL是否将一种现存语言作为宿主语言,在其上构建自身的实现。

2.1、内部DSL

也称内嵌式DSL。因为它们的实现嵌入到宿主语言中,与之合为一体。内部DSL将一种现有编程语言作为宿主语言,基于其设施建立专门面向特定领域的各种语义。例如:Kotlin DSL、Groovy DSL等;

2.2、外部DSL

也称独立DSL。因为它们是从零开始建立起来的独立语言,而不基于任何现有宿主语言的设施建立。外部DSL是从零开发的DSL,在词法分析、解析技术、解释、编译、代码生成等方面拥有独立的设施。开发外部DSL近似于从零开始实现一种拥有独特语法和语义的全新语言。构建工具make 、语法分析器生成工具YACC、词法分析工具LEX等都是常见的外部DSL。例如:正则表达式、XML、SQL、JSON、 Markdown等;

三、 DSL示例

3.1 内部DSL

HTML: 通过自然语言编写

在Groovy中,通过DSL可以用易读的写法生成XML

import groovy.xml.MarkupBuilder

def s = new StringWriter()
def xml = new MarkupBuilder(s)
xml.html{
    head{
        title("Hello")
        script(ahref:'https://xxxx.com/vue.js')
    }
    body{
        p("Excited")
    }
}
println s.toString()

最后将生成

<html>
  <head>
    <title>Hello</title>
    <script ahref='https://xxxx.com/vue.js' />
  </head>
  <body>
    <p>Excited</p>
  </body>
</html>

这里相对于Groovy这样的动态语言,最为不同的就是xml.html这个并不存在的方法居然可以通过编译并运行,它内部重写了invokeMethod方法,并进行闭包遍历,少写了许多POJO对象,效率更高。

3.2 外部DSL

以plantUML为例,外部DSL不受限于宿主语言的语法,对用户很友好,尤其是对于不懂宿主语言语法的用户。但外部DSL的自定义语法需要有配套的语法分析器。常见的语法分析器有:YACC、ANTLR等。

四、 DSL & DDD(领域驱动)

DDD和DSL的融合有三点:面向领域、模型的组装方式、分层架构演进。DSL 可以看作是在领域模型之上的一层外壳,可以显著增强领域模型的能力。

 它的价值主要有两个,一是提升了开发人员的生产力,二是增进了开发人员与领域专家的沟通。外部 DSL 就是对领域模型的一种组装方式。

五、 DSL不是银弹

前开篇也提到了,在信息量不变的情况下,代码行数越短,它的“潜规则”信息量就越多,那么如何排查?如何定位?如何扩展?成为一个好的DSL需要考量的点。好的DSL难点在于:

  • DSL只是一种声明式的编程语言,无法承载大量业务。

  • DSL语句与编译生成的“字节码”的过程是黑盒的,不但对内部工作不明朗,如果报错的话,不但堆栈行数无法与源码对应上,而且无法“断点”或者“日志”。

  • DSL对设计者要求高,需要会一个领域有通透的理解,设计时要克制『增加各种特性』,DSL还要文档齐全,支撑充分,甚至要开源以帮助使用者定位。

  • 12
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
领域特定语言 (Domain-specific Language, DSL) 是为特定领域设计的一种编程语言,旨在简化特定领域的问题建模和解决过程。与通用编程语言相比,领域特定语言关注于解决特定领域的问题,具有更高的表达能力和易用性。 PDF (Portable Document Format) 是一种由Adobe公司开发的用于电子文档交换的文件格式。PDF文件可以包含文本、图像、多媒体等元素,并且具有跨平台、可读性好、内容保护等特点。因此,领域特定语言与PDF结合使用可以带来以下好处: 首先,通过使用领域特定语言,可以定义和生成用于处理PDF文件的代码。这使得操作PDF文件变得更加简单和高效。例如,可以使用领域特定语言定义一套操作PDF文档的特定命令,进而生成执行这些命令的代码。这种方式可以大大减少处理PDF文件时的代码量和复杂度。 其次,领域特定语言可以根据具体需求将PDF文件转换为可视化的领域模型。通过将PDF文件映射为领域模型,我们可以更方便地对PDF文件进行操作和分析。例如,可以使用领域特定语言将PDF文件中的表单与数据库进行关联,实现自动数据提取和数据更新等功能。 此外,领域特定语言还可以为PDF文件的生成提供便利。通过定义特定领域的模板和生成规则,可以使用领域特定语言快速生成符合需求的PDF文件。这对于需要频繁生成PDF报告、合同和表单的场景非常有用。 总之,领域特定语言与PDF结合使用可以提高PDF文件的处理效率和代码可读性,简化PDF文件的操作和分析过程,并加快生成PDF文件的速度。这使得使用领域特定语言处理PDF文件成为了一种高效便捷的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值