对DSL和GPL的初步认识

摘要:
与GPL相对,DSL与传统意义上的通用编程语言C、Python以及Haskell完全不同。而有限的表达能力就成为了GPL和DSL之间的一条界限。外部DSL有自己的特定语法、解析器和词法分析器等等,它们往往是一种小型的编程语言,甚至不会像GPPL那样需要源文件。与之相对的则是内部DSL。外部DSL一般会直接针对特定的领域设计,而不考虑其他方面。

DSL:以极其高效的方式描述特定领域的对象、规则和运行方式的语言。

需要有特定的解释器与其配合。

高效简洁的领域语言,与通用语言相比能极大降级理解和使用难度,同时极大提高开发效率的语言。

能够描述特定领域的世界观和方法论的语言。

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

而有限的表达能力就成为了 GPL 和 DSL 之间的一条界限。

谈谈 DSL 以及 DSL 的应用(以 CocoaPods 为例)
https://zhuanlan.zhihu.com/p/22824177

而今天要介绍的 DSL 就可以真正的提升生产力,减少不必要的工作,在一些领域帮助我们更快的实现需求。

DSL 是什么?
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 并不是图灵完备的,它们的表达能力有限,只是在特定领域解决特定任务的。

A computer programming language of limited expressiveness focused on a particular domain.

另一个世界级软件开发大师 Martin Fowler 对于领域特定语言的定义在笔者看来就更加具体了,DSL 通过在表达能力上做的妥协换取在某一领域内的高效。

而有限的表达能力就成为了 GPL 和 DSL 之间的一条界限。

几个栗子
最常见的 DSL 包括 Regex 以及 HTML & CSS,在这里会对这几个例子进行简单介绍

Regex
正则表达式仅仅指定了字符串的 pattern,其引擎就会根据 pattern 判断当前字符串跟正则表达式是否匹配。
SQL
SQL 语句在使用时也并没有真正的执行,我们输入的 SQL 语句最终还要交给数据库来进行处理,数据库会从 SQL 语句中读取有用的信息,然后从数据库中返回使用者期望的结果。
HTML & CSS
HTML 和 CSS 只是对 Web 界面的结构语义和样式进行描述,虽然它们在构建网站时非常重要,但是它们并非是一种编程语言,正相反,我们可以认为 HTML 和 CSS 是在 Web 中的领域特定语言。
Features
上面的几个?明显的缩小了通用编程语言的概念,但是它们确实在自己领域表现地非常出色,因为这些 DSL 就是根据某一个特定领域的特点塑造的;而通用编程语言相比领域特定语言,在设计时是为了解决更加抽象的问题,而关注点并不只是在某一个领域。

上面的几个例子有着一些共同的特点:

没有计算和执行的概念;
其本身并不需要直接表示计算;
使用时只需要声明规则、事实以及某些元素之间的层级和关系;
虽然了解了 DSL 以及 DSL 的一些特性,但是,到目前为止,我们对于如何构建一个 DSL 仍然不是很清楚。

构建 DSL
DSL 的构建与编程语言其实比较类似,想想我们在重新实现编程语言时,需要做那些事情;实现编程语言的过程可以简化为定义语法与语义,然后实现编译器或者解释器的过程,而 DSL 的实现与它也非常类似,我们也需要对 DSL 进行语法与语义上的设计。

总结下来,实现 DSL 总共有这么两个需要完成的工作:

设计语法和语义,定义 DSL 中的元素是什么样的,元素代表什么意思
实现 parser,对 DSL 解析,最终通过解释器来执行

设计原则和妥协
DSL 最大的设计原则就是简单,通过简化语言中的元素,降低使用者的负担;无论是 Regex、SQL 还是 HTML 以及 CSS,其说明文档往往只有几页,非常易于学习和掌握。但是,由此带来的问题就是,DSL 中缺乏抽象的概念,比如:模块化、变量以及方法等。

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

由于抽象能力的缺乏,在我们的项目规模变得越来越大时,DSL 往往满足不了开发者的需求;我们仍然需要编程语言中的模块化等概念对 DSL 进行补充,以此解决 DSL 并不是真正编程语言的问题。

DSL的分类
DSL不是什么新鲜的玩意儿,我们平时经常接触的SQL,CSS,正则表达式等等都属于DSL。有的DSL可能更加专注于一个方面,例如Mathematica,LOGO等等。这些语言的目标都是特定的领域,与之相对的则是GPPL(General Purpose Programming Language,通用目的编程语言)。Martin Fowler将DSL分为外部DSL及内部DSL两种。外部DSL有自己的特定语法、解析器和词法分析器等等,它们往往是一种小型的编程语言,甚至不会像GPPL那样需要源文件。与之相对的则是内部DSL。内部DSL其实更像是种别称,它代表一类特别API及使用模式。

XSLT,SQL等等都可以算作是外部DSL。外部DSL一般会直接针对特定的领域设计,而不考虑其他方面。James Gosling曾经说过:每个配置文件最终都会变成一门编程语言。一开始您可能只会用它表示一点点东西,慢慢地您便会想要一些规则,而这些规则则变成了表达式,后来您可能还会定义变量,进行条件判断等等,而最终它就变成了一种奇怪的编程语言,这样的情况屡见不鲜。

而内部DSL,正像之前提到的那样,它往往只是代表了一系列特别的API及使用模式,例如LINQ查询语句及Ruby on Rails中的Active Record声明代码等等。内部DSL可以使用一系列API来“伪装”成一种DSL,它往往会利用一些“流畅化”的技巧,例如像jQuery那样把一些方法通过“点”连接起来,而另一些也会利用元编程的方式。内部DSL还有一些优势,例如可以访问语言中的代码或变量,以及利用代码补全,重构等母语言的所有特性。

https://www.cnblogs.com/feng9exe/p/10065973.html

免责声明:文章转载自《对DSL和GPL的初步认识》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇测试与开发如何有效沟通,QC11(HP ALM 11)的简单使用记录java获取网络时间下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mac 下 ts 环境 配置

1. 打开iterm ,输入 sudo npm install -g typescript 2. 复制 安装的 路径 3. 输入 vim ~/.bash_profile 4.export PATH=${PATH}:/Users/farben/.npm-global/lib/node_modules/typescript/bin/ 5.按esc 退出,:wq...

shell 常用脚本维护笔记

Centos7.5 IP地址维护 #!/usr/bin/bash IPADDR=$(ifconfig|grep inet|sed '2,$d'|awk '{print $2}') GATEWAY=$(ifconfig|grep inet|sed '2,$d'|awk '{print $2}'|awk -F "." '{print $1"."$2"."$3"...

linux 系统 解决php -v查看到版本于phpinfo()打印的版本不一致问题

发现问题的原因:   安装zip扩展后,配置成功,但是使用gitlab合并的时候发生错误,经检查,使用phpinfo打印出来的php版本为7.1,而使用linux度服务器 运行 php -v的版本却是5.4,故怀疑加载的php.ini文件不一致 解决方案        首先查找一下linux上有几个php.ini。结果发现有两个:       使用命令来查...

Haskell 差点儿无痛苦上手指南

趁着自己重装Linux 虚拟机的机会,把安装 haskell 的过程记录一下,顺便帮那些还犹豫徘徊在haskell门外的读者入门。 基本概念: Haskell : 是一门通用函数式语言,差点儿能够进行不论什么种类的开发,包含命令行,GUI,数据库,Web.源码能够跨平台: Linux,Mac, Windows, FreeBSD 等. Haske...

VSCode搭建node + typescript开发环境

我们一起来喜欢TypeScript 现在写js不用TypeScript,伦家可能会觉得你是外星人。 是的,TypeScript很大程度增强了代码的可读性,可跟踪性,可维护性和减少了bug。 那么没有理由不适用TypeScript进行js开发,但是回归本质,要根据实际出发,不是盲目的一来直接上TS。 我参与过一些使用TS开发的项目,也发现使用TS出现的问题...

Gradle 升级的一些坑

Android gradle plugin 从2.2.3更替为3.6.0 Gradle 版本从 3.5 更替为 6.4.1 序号 报错 原因 解决 1 Could not get unknown property 'apkVariantData' for object of type com.android…… Gradle 3.0 的 api...