DSL语言的学习方法是什么?如何快速掌握DSL语言的技巧和要点

DSL语言的学习方法是什么?如何快速掌握DSL语言的技巧和要点

本文章谈论的是《每个程序员应该知道的97件事》里的第23件事

领域特定语言

(Domain-Specific Languages)

老规矩,先分.享书里这个章节的大意,再写“命题作文”

每个专业领域的人都会有领域特定的语言,以便于沟通。在程序世界,不同业务领域也会有领域特定的语言。我们会设计和使用许多领域特定的编程言语去帮助业务领域专家去通过程序完成自己的工作。根据语言是否基于宿主语言,领域特定语言(DSL, domain-specific langauge)又可分成内置DSL和外置DSL。

原文推荐:⭐⭐⭐

个人简评:领域特定语言是一个不常提及却一直在使用的方法。看完这篇文章,也许能够帮助我们了解使用业务领域语言去编程的一般实践方式。

领域特定语言:陌生的概念,熟悉的方法

之前有篇文章讲过使用领域语言编程的理念及其意义,而领域特定语言(DSL, domain-specific langauge)是贯彻这个理念的一种方式。

DSL可以分为「内部DSL(Internal DSLs)」和「外部DSL(External DSLs)」。这应该是比较官.方或者被多数人认同的分类方式,比如Martin Fowler在《Domain-Specific Languages》里也是这样分类的,Wikipedia也有提及这个分类方式。

内部DSL是由一种编程语言定义的,不需额外的自定义编译器或者解释器便可编译执行的编程语言。在这个定义下,我们很难去分辨内部DSL和普通的API概念有什么区别。或者说,定义可读性好的且准确描述业务行为的API,可以被看作定义内部DSL的一种方式。有时内部DSL也被称作嵌入式DSL(Embedded DSLs),这似乎比Internal这词更容易理解。

不同的编程语言能描述DSL的程度不一样,因为其定义会受宿主编程语言的语法限制。如原文说的,高抽象的弱类型语言如Ruby和Scala容易定义出接近自然语言的内部DSL,但强类型的语言比如C#和Java的业务领域描述能力较弱。后者在不断改善这一方面,比如支持lamdba表达式,推荐考虑使用method chaining去定义接口,等。

下图是Scala使用内部DSL的一个例子。

上面那段代码没有刻意使用DSL,而下面是使用内部DSL后的优化代码。

很明显使用内部DSL后,业务代码更加简练和贴近自然语言理解下的业务逻辑。

DSL语言的学习方法是什么?如何快速掌握DSL语言的技巧和要点

source: https://scalac.io/encog-dsl-scala-part1/

单从内部DSL的定义,大多数的程序员应该都在使用领域特定语言,无论是在定义领域特定语言,还是在使用领域特定语言定义的接口实现业务功能。

外部DSL,即由一种自定义的解释器或编译器执行的领域特定语言,在程序世界更是常见。网上相关文章经常会以LaTeX,AWK和Makefile为例。现在较为流行的Markdown和YAML也是一种外部DSL。许多支持某特殊业务场景的工具也会定义以XML或者JSON格式去描述业务数据和行为的外部DSL。

在微软工作7年多,我感觉自己使用外部DSL的时间可能不少于直接使用编程语言的时间。基础设施,中间件或平.台能力,应用或服务框架,测试架构或接近方案等,都或多或少都会提供外部DSL作为研发和管理的接口。

注意,混合地使用内部DSL和外部DSL是一种很常见的技术方案,比如使用外部DSL去描述业务逻辑的主流程,而使用内部DSL去描述部分细节的业务逻辑,以满足业务实现的复杂需求,比如平衡易用性和灵活性。

比如过去Cortana的一个技能需要在一个JSON文件定义多轮会话的抽象业务模型(外部DSL),同时低层次(越接近IO层次越低)的业务逻辑便还是得写C#代码进行实现(内部DSL)。过去Bing的业务中间件平.台也是采取类似的方式。

近一两年上面说的两种混合式DSL逐渐被淘汰,被内部DSL的技术方案所取代。对于复杂的业务需求,内部DSL对于开发人员还是更加友好一些,尤其当开发人员大多有较强的技术实力的时候。

DSL的生命周期往往取决于业务场景的生命周期。之前我在Bing的一个answer开发平.台项目工作过大半年;它提供了一种外部DSL,以帮助在Bing上做内容运营的编辑快速上线一些小的页面搜索结果,比如圣诞节快到了要上线一个追踪圣诞老人到哪了的一个搜索页面结果。后来这类需求越来越少或者固化了,对那个项目的工程投入也大幅度减少了。如果我们要提供一个有影响力而且能持久使用的DSL,那么你要考虑好要支撑的业务场景是否能有持续的商业价值。当然,一般来说,我们思考的方向可能是反过来的——我们在考虑如何支撑某个业务场景的时候,会考虑如何使用DSL这种技术方式去完成目标。

注意,领域特定语言是为了在业务领域里的开发者设计的。在这里,了解业务领域是最关键的。至于如何设计良好的领域特定语言,我觉得这往往没有通用的最佳实践指南,比如什么时候该用内部DSL,什么时候该用外部DSL,外部DSL应该用XML,JSON,或者其他格式,等等。开发者用得方便,往往便是最可靠的标准,如之前的文章《问“用户会做什么”》所说。

职业发展

awvs使用教程:高效利用awvs的技巧

2024-2-14 18:24:37

职业发展

CSS教程,如何学习?快速入门、实战教程

2024-2-14 18:43:46

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索