DSL是什麼?Elasticsearch的Query DSL又是什麼?

  • 2021 年 1 月 24 日
  • 筆記

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的某種場景下的某種規範定義而已,並非一種真正的小型編程語言。