什么是DSL?
DSL(Domain Specified Language)領(lǐng)域?qū)S谜Z(yǔ)言。
DSL是為了解決問(wèn)題描述者(使用者)和解決者(構(gòu)建者)之間的溝通方式產(chǎn)生的盏触,即一種在特定領(lǐng)域?qū)<液蛯?shí)現(xiàn)者之間雙方都能順利溝通的“共同語(yǔ)言”渗蟹。
常見(jiàn)的DSL
廣義上块饺,絕大部分編程語(yǔ)言都是DSL,是在計(jì)算機(jī)領(lǐng)域程序員和計(jì)算機(jī)之間的“共同語(yǔ)言”雌芽;常見(jiàn)的DSL主要有:軟件構(gòu)建領(lǐng)域 Ant授艰、UI 設(shè)計(jì)師 HTML、硬件設(shè)計(jì)師 VHDL膘怕。我們這里主要討論狹議的DSL想诅。
DSL的特點(diǎn)
用于專門(mén)領(lǐng)域,不能用于其他領(lǐng)域
表現(xiàn)力有限岛心,提供給問(wèn)題描述者使用
不描述解答域来破,僅描述問(wèn)題域
DSL與通用編程語(yǔ)言的區(qū)別
DSL 供非程序員使用,供領(lǐng)域?qū)<沂褂?br>
DSL 有更高級(jí)的抽象忘古,不涉及類似數(shù)據(jù)結(jié)構(gòu)的細(xì)節(jié)
DSL 表現(xiàn)力有限徘禁,其只能描述該領(lǐng)域的模型,而通用編程語(yǔ)言能夠描述任意的模型
DSL 分類
要理解DSL 分類需要先理解一個(gè)概念髓堪∷椭欤“元語(yǔ)言抽象”。
它是指通過(guò)一種語(yǔ)言來(lái)構(gòu)建另一種語(yǔ)言干旁。比如 Java 就是構(gòu)建在 C 上的語(yǔ)言驶沼。
其中,從什么語(yǔ)言構(gòu)建而來(lái)争群,這種構(gòu)建來(lái)源的語(yǔ)言稱為“宿主語(yǔ)言”回怜。
根據(jù)是否從宿主語(yǔ)言構(gòu)建而來(lái),DSL 分為:
內(nèi)部 DSL(從一種宿主語(yǔ)言構(gòu)建而來(lái))
外部 DSL(從零開(kāi)始構(gòu)建的語(yǔ)言换薄,需要實(shí)現(xiàn)語(yǔ)法分析器等)
還有一種屬于外部DSL的“非文本DSL”玉雾,即盡量使用圖形化表述。比如 JetBrains 的 MPS轻要。
我們通常所用的框架實(shí)際上就是一種內(nèi)部 DSL复旬。比如 Rails 框架就是基于 Ruby 的用于 Web 開(kāi)發(fā)領(lǐng)域的內(nèi)部 DSL。
如何構(gòu)建 DSL
能夠完整描述領(lǐng)域
簡(jiǎn)單易用
隱藏實(shí)現(xiàn)細(xì)節(jié)
flutter_dynamic 是一種解決Flutter動(dòng)態(tài)創(chuàng)建應(yīng)用的DSL冲泥,其很好地解決了產(chǎn)品與開(kāi)發(fā)之間動(dòng)態(tài)描述功能需求的問(wèn)題驹碍。