参考自(https://zhuanlan.zhihu.com/p/107947462)[https://zhuanlan.zhihu.com/p/107947462]
DSL 即Domain Specific Language,领域特定语言是一种为特定领域设计的,具有受限表达性的编程语言。
编程语言的发展其实是一个不断抽象的过程,比如从机器语言到汇编语言然后到C之类的高级语言。汇编语言通过助记符代替机器指令操作码,极大的增强了机器语言的可读性和可维护性,但本质上仍是一门面向处理器和寄存器等硬件系统的低级编程语言。高级语言以上层抽象的语句(流程控制、循环等)和数据结构等更趋近自然语言和数学公式的方式解决了这个问题,脱离了对机器指令集的直接关联,大大提升了程序开发的效率。
但在高级语言层面,抽象带来的效率提升似乎有了天花板。无论是从C到Java,抑或是各种编程范式下衍生的抽象度更高的编程语言,解决的都是通用编程问题,它们都有充分的过程抽象和数据抽象,导致大量的概念产生,进而影响了编程效率。
而在一些专有领域的任务处理上其实不需要那么多语言特性,DSL就是在这种矛盾中产生的解决方案。它是为了解决特定任务的语言工具,比如文档编写有markdown,字符串匹配有RegExp,任务控制有 make、gradle,数据查找有SQL,Web样式编码有CSS等等。本质是通过限定问题域边界,从而锁定复杂度,提高编程效率。
DSL有两种不同类型:外部DSL和内部DSL。
DSL**外部DSL**是一种独立的编程语言,需要从解析器开始实现自己的编译工具,实现成本较高。其语法的灵活性更高,更容易达到用户的表现力需求。
外部DSL的直接对应就是GPPL(General Purpose Programming Language,通用编程语言),由于受限语法特性更少,一般不要求图灵完备,所以它实现难度会低于GPPL。
前端常用的模板引擎如mustache以及React、Vue支持的JSX语法都属于外部DSL。
DSL**内部DSL(Embedded DSL or Internal DSL)**是建立在其它宿主语言之上(一般为GPPL)的特殊DSL,与宿主语言共享编译与调试工具等基础设施,学习成本更低,也更容易被集成。在语法上与宿主语言同源,但在运行时上需要做额外的封装。
也可以将内部DSL视为针对特定任务的特殊接口封装风格,比如jQuery就可以认为是针对DOM操作的一种内部DSL。