Elasticsearch黑鸟教程25:DSL是什么?Elasticsearch的Query DSL又是什么?
站长点评:DSL这个名字听起来很吓人,但是当你搞明白了它是什么的时候,定会哑然一笑。
1、DSL简介
DSL 其实是 Domain Specific Language 的缩写,中文翻译为领域特定语言。而与 DSL 相对的就是 GPL,这里的 GPL 并不是我们知道的开源许可证(备注:GNU通用公共许可证简称为GPL),而是 General Purpose Language 的简称,即通用编程语言,也就是我们非常熟悉的 Java、Python 以及 C 语言等等。
与 GPL 相对,DSL 与传统意义上的通用编程语言 C、Java 以及 Python 完全不同。通用的计算机编程语言是可以用来编写任意计算机程序的,并且能表达任何的可被计算的逻辑,同时也是图灵完备的。而DSL 并不是图灵完备的,它们的表达能力有限,只是在特定领域解决特定任务的。最常见的 DSL 包括 Regex 正则表达式以及 HTML & CSS:
(1)Regex正则表达式仅仅指定了字符串的 Pattern,其引擎就会根据 Pattern 判断当前字符串跟正则表达式是否匹配。正则表达式有自己的语法规范(元字符,运算符的优先级等),犹如一门微型语言,嵌入到通用编程语言 C、Java 以及 Python等里面。
(2)HTML 和 CSS 只是对 Web 界面的结构语义和样式进行描述,虽然它们在构建网站时非常重要,但是它们并非是一种编程语言,我们可以认为 HTML 和 CSS 是在 Web 中的领域特定语言。
(3)SQL也属于DSL,虽然可以定义变量和函数,但是不能编写任意的计算机程序,它就无法实现界面编程,而C、Java 以及 Python都可以。这就是DSL的特点,只面向特定领域。
2、DSL分类
DSL分为外部DSL及内部DSL两种。外部DSL有自己的特定语法、解析器和词法分析器等等,它们往往是一种小型的编程语言。与之相对的则是内部DSL。内部DSL其实更像是种别称,它代表一类特别API及使用模式。
James Gosling曾经说过:每个配置文件最终都会变成一门编程语言。一开始您可能只会用它表示一点点东西,慢慢地您便会想要一些规则,而这些规则则变成了表达式,后来您可能还会定义变量,进行条件判断等等,而最终它就变成了一种奇怪的编程语言,这样奇怪的语言就是 DSL 。
内部DSL,正像之前提到的那样,它往往只是代表了一系列特别的API及使用模式,例如Elasticsearch里面的Query DSL:
{
"query":{
"match_all":{}
}
}
由此可以看出来,内部DSL就是json的某种场景下的某种规范定义而已,并非一种真正的小型编程语言。
3、DSL总结
DSL这个名字听起来很吓人,但是当你搞明白了它是什么的时候,定会哑然一笑,我们被计算机科学家的“独到的创造力”给搞蒙了。也许,这就是一种抽象,也是一种创新,正是靠着抽象和创新,技术才能逐渐的发展和进化。收起我们的嘲讽吧,让我们为技术先贤点个赞!