2013/12/30

DSL(Domain Specific language) vs GPL(General Purpose Language)

DSL 不是 Digital Subscriber Line,也跟家裡面 ADSL 沒有關係,而是 Domain Specific language 的縮寫。GPL 也不是 General Public License,而是 General Purpose Language 的縮寫。

專有名詞的縮寫

學習專業知識,一開始都會被專業的縮寫搞亂,也要能將這些專有名詞縮寫脫口而出,才能嚇唬人,突顯自己的專業。DSL 不是比較常聽到的 Digital Subscriber Line,而是 Domain-specific language 中文有些人翻譯為領域特定語言,但依照中文的習慣,要念成特定領域語言,為了遵循英文原文的順序,還是應該改成「領域專用語言」比較順口。

跟 DSL 對應的語言為 GPL,GPL 也不是常常聽到的 General Public License ,而是 General Purpose Language 的縮寫,舉個簡單的例子來說,Java、C 都屬於 GPL,而 HTML、SQL、MathML、Unix Shell Script、groovy 等等語言都算是 DSL。

其實大家最常遇到的,最常見的,會是各式各樣的 DSL,而不是 GPL,嚴格地來說,沒有一種語言會是 GPL,形成某一種語言之後,就會馬上變成是 DSL了,因為總會有某一些應用,是無法簡單地用 Java、C 這樣的 GPL 所描述的,那究竟怎麼判斷,那一種語言是屬於 GPL 呢?

GPL 如何分類?

開發人員的逆襲: Domain-Specific Languages 裡面提到:Karl Frank 認為,DSL泛指任何特定領域的語言,甚至連 C#、Java 都算是特定領域的語言,因為它們都是針對特定目的(軟體開發),用於特定場合的語言。就軟體開發這塊領域而言,C#、Java 可運用於各類型的軟體開發,所以我們通常將它們視為GPL。

但其實在分辨 GPL 的時候,必須還要再加上子分類,必須先知道是那一種類別的 GPL,從 Is UML a domain specific language (DSL)? 的討論得知,當我們在討論 Programming Language 的時候,C、Java 就是一種 General Purpsose Programming Language,而討論 Modeling Langage 的時候,UML就是一種 General Purpose Modeling Language,而 XML 是一種 General Purpose Markup Language。

Java 跟 Groovy 的關係,就像是 Erlang 跟 Erlang OTP 的關係一樣,Erlang 可類比 Java,而 OTP 並不屬於 GPL,他是一種 DSL,適用的領域是 high concurrency 與 distributed 的伺服器運算環境。

Compiler

講到程式語言,就馬上會回想起十幾年前學習的 Compiler,當時老師教的是 Lex(Lexical Analyzar) 與 Yacc(Yet Another Compiler Compiler) ,雖然是有學過,也可以很順口地落出 lex and yacc,但也僅只於此,再深入的東西也都忘光沒有了。你可以自行參閱 Lex 與 Yacc 介紹以lex/yacc實作算式計算機

如果想要做個新的語言編譯器,a list of compiler books — 汗牛充棟的編譯器參考資料 列出了一堆相關書籍,但我想我應該不會跳進那個大坑洞裡。

在 Java 領域中,就必須要認識 ANTLR,ANTLR 是 ANother Tool for Language Recognition 的縮寫,從 使用 Antlr 開發領域語言 得知,ANTLR 是用來開發一種 DSL 的工具。

大概的過程就是先撰寫語法定義 Compiler.g,定義好語法之後,用 ANTLR 產生詞法分析器和語法分析器,使用這個分析器,就可以用來驗證,我們輸入的語言expression,到底有沒有符合這個語言的定義規則,ANTLR支援,可以將分析器生成為 Java,C#,C,Python,JavaScript 等多種語言。

另外還有個工具 Antlrworks,可將 .g 的語法定義檔案,用視覺化的方式呈現出來。

為什麼要了解 DSL?

當你進入 IT 的領域,想要學習使用關聯式資料庫時,別人就會建議你去學SQL,想要當個 SE,就會建議你要學習 shell script,想要學習網頁程式設計,就會建議要學習 Javascript、HTML、CSS 等等東西,每一種語言都是一種工具,是前人為了特定的目的,而定義出來的一種特殊的語言。

重要的是,當我們學習某一種語言的時候,要很清楚的知道,這個語言的使用範圍跟目的。雖然也會有意外的創新發生,例如原本設定在網頁上使用的 JavaScript,轉身一變,成了運作在 nodejs 之下的一種熱門的 Server Side 語言。

DSL 的目標是要為了解決商務業務邏輯與特殊應用領域,跟GPL之間的距離,對於系統設計者來說,先了解 DSL 的理念與技術,才能以最適當的方式,設計出一套最適合的 DSL 語言,當然,所有的設計,都必須符合「恰當」的要求,不能為了設計而設計,以免變成了畫蛇添足,甚至是增加負擔的 DSL。