跳转到内容

领域特定语言:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
无编辑摘要
 
(未显示10个用户的18个中间版本)
第1行: 第1行:
{{Unreferenced|time=2022-01-06T05:01:21+00:00}}
{{expand language|en}}
{{expand language|en}}
'''領域特定語言'''(英語:domain-specific language),簡稱'''DSL''',是專門針對特定應用{{link-en|領域 (軟體工程|Domain (software engineering)|領域}}的[[计算机语言]],和可以用在多種領域的{{link-en|通用語言|general-purpose language}}(GPL)恰好相反。像[[HTML]]專門用在[[網頁設計]]上,就屬於領域特定語言,也有些領域特定語言只用在一個或幾個軟體上,例如{{le|MUSH|MESH}}軟體碼。領域特定語言還可以依使用的語言分類,像是領域特定的 [[標記語言]]、領域特定的[[建模語言]](或更廣義的{{le|規格語言|specification languages}})以及領域特定的[[程式語言]]。從電腦發明開始,就已出現特定用途的電腦語言。而「領域特定語言」一詞是隨著[[特定域建模]](domain-specific modeling)的興起,才開始廣為使用。簡單的領域特定語言(特別是只有單一應用程式使用的領域特定語言),有時也會稱為'''迷你語言'''。
'''領域特定語言'''({{lang-en|Domain-specific language}},[[縮寫]]:'''DSL'''),也稱為'''特定域語言''',是專門針對特定應用[[領域 (軟體工程)|領域]]<ref group="註解">此處的領域也可能是指业务领域(business area),例如壽險政策、戰鬥模擬、薪資計算、帳單管理等</ref>的[[计算机语言]],和可以用在多種領域的{{link-en|通用電腦語言|general-purpose language|通用語言}}(GPL)恰好相反。像[[HTML]]專門用在[[網頁設計]]上,就屬於領域特定語言,也有些領域特定語言只用在一個或幾個軟體上,例如{{le|MUSH|MESH}}軟體碼。領域特定語言還可以依使用的語言分類,像是領域特定的[[標記語言]]、領域特定的[[建模語言]](或更廣義的[[規格語言]])以及領域特定的[[程式語言]]。從電腦發明開始,就已出現特定用途的電腦語言。而「領域特定語言」一詞是隨著[[特定域建模]](domain-specific modeling)的興起,才開始廣為使用。簡單的領域特定語言(特別是只有單一應用程式使用的領域特定語言),有時也會稱為'''迷你語言'''。

領域特定語言和通用語言之間沒有明確的界線,因為可能某计算机语言原來有一些適用於特定領域的特徵,但也可以應用在更通用的範圍,相反的,也有可能某计算机语言理論上可以用在多種領域,但實務上只用在特定領域中。像[[Perl]]一開始是設計為文字處理語言以及[[膠水語言]](和[[AWK]]、[[外壳脚本|shell script]]的領域相同),但後來成為通用的程式語言。相反的,[[PostScript]]是[[圖靈完備性|圖靈完備]]的語言,但實際上只用作[[頁面描述語言]](領域特定語言)。

==用途==
設計及使用適合的語言,是{{le|領域工程|domain engineering}}中重要的一環,作法可能是選擇適合此領域的現有語言(可能是某個領域特定語言或通用電腦語言),也可能是開發一種新的領域特定語言。[[面向语言的程序设计]]會把為了描述問題而創建特定語言一事,視為問題解決流程的標準步驟之一。假如用一種新的領域特定語言描述某種問題,會比用現有語言描述更加清楚,而且這種問題又常常出現,那麼創建此一領域特定語言(以及配合的軟體)就是值得的。領域特定語言可以針對特定的問題領域、特定的問題表示方式、特定的解決方案技術,或是某一領域的其他層面。
===用在設計和實現上===
领域特定语言是在設計和實現上有特定目的的語言(或是宣告的語法或是文件)。领域特定语言可以是視覺對話語言(visual diagramming language),例如{{le|Generic Eclipse Modeling System|Generic Eclipse Modeling System}}中建立的語言,可以是程式化抽象,例如[[Eclipse Modeling Framework]],也可以是文字語言。例如,命名列工具[[grep]]中[[正则表达式]]語法,可以在文字中尋找特殊排列規則的文字。[[sed]]工具定義了匹配和取代正则表达式的語法。一般來說,這些小工具可以在[[殼層]]內整合使用,以達到複雜的系統工作。

有時领域特定语言和[[腳本語言]]之間沒有清楚的分界,不過领域特定语言多半沒有處理檔案系統的低階功能、跨行程控制、以及一些全功能程式語言或腳本語言必須有的功能。許多领域特定语言不會編譯成[[字节码]]或是可執行檔,而會轉換為許多不同的媒體格式。像GraphViz可以輸出[[PostScript]]、[[GIF]]檔、[[JPEG]]檔等。[[Csound]]則會編譯成聲音檔。像是POV-Ray之類的光線追蹤(ray-tracing)领域特定语言會轉換為圖形檔。像是[[SQL]]之類的電腦語言會有種特殊的情形:SQL是針對特定領域(存取和維護關聯資料庫)的,所以的確是领域特定语言,也常會其他應用程式呼叫,但SQL的關鍵字及函數比許多腳本語言都多,一般也會視為是獨立的語言,有可能是因為在程式中資料庫使用的普及性,以及要成為此語言專家需要有的掌握程度。

許多领域特定语言也有提供API,因此可以在其他程式執行時呼叫此API,不影響原程式的流程,此運作方式類似程式的函式庫,和腳本語言之間的差異就更小了。
===程式開發工具===
有些领域特定语言會隨著時間擴展,加入全功能的程式開發工具,因此更增加了該語言是否是领域特定语言的問題難度。

在[[模型驱动工程]]中,有許多领域特定语言的例子,像是用斷言說明模型的{{le|Object Constraint Language|Object Constraint Language|OCL}}、或是领域特定的轉換语言{{le|QVT|QVT}},不過[[统一建模语言]](UML)反而是通用的建模語言。

有一個類推可以說明超小型語言及领域特定语言:超小型語言像是刀,有許多不同的使用方式,從切食物到鋸樹都可以。领域特定语言像是電鑽,也有很多不同的使用方式,不過都是用來在東西上鑽洞上。通用特定语言是完整的完整的工作台,有許多特別用來進行特定工作的工具。程式設計師使用领域特定语言的方式類似他們看工具台,知道他們需要一個較好的電鑽,而且找到一個剛好適用的领域特定语言。

==優點和缺點==
領域特定語言的一些優點如下<ref name='Mernik05'>Marjan Mernik, Jan Heering, and Anthony M. Sloane. When and how to develop domain-specific languages. ''ACM Computing Surveys'', 37(4):316–344, 2005.{{doi|10.1145/1118890.1118892}}</ref><ref name='Spinellis01'>Diomidis Spinellis. [http://www.spinellis.gr/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html Notable design patterns for domain specific languages] {{Wayback|url=http://www.spinellis.gr/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html |date=20210123103011 }}. ''Journal of Systems and Software'', 56(1):91–99, February 2001. {{doi|10.1016/S0164-1212(00)00089-3}}</ref>:

* 領域特定語言可以使解決方案以較簡潔的方式呈現,而且達到問題域上的抽象層次。意思就是領域專家自身可以理解、驗證、修改,甚至開發領域特定語言的程式。不過,可以達到此程度的例子不多<ref name="Freudenthal">{{cite journal|last=Freudenthal|first=Margus|title=Domain Specific Languages in a Customs Information System|journal=IEEE Software|pages=1|date=1 January 2009|doi=10.1109/MS.2009.152}}</ref>。
* 領域特定語言可以達到領域層次的[[计算机安全]]。只要其語言構造(language construct)是安全的,以此寫的所有程式碼可以視為是安全的{{Citation needed|date=2022年10月}}。
* 領域特定語言有助於將商業資訊系統的開發,從傳統的軟體開發者轉到領域專家身上,此一群體人數較多,對此一領域有較深入知識,但程式技術較為不足<ref>{{cite journal|last1=Aram|first1=Michael|last2=Neumann|first2=Gustaf|title=Multilayered analysis of co-development of business information systems|journal=Journal of Internet Services and Applications|date=2015-07-01|volume=6|issue=1|doi=10.1186/s13174-015-0030-8|s2cid=16502371|url=http://www.jisajournal.com/content/pdf/s13174-015-0030-8.pdf|doi-access=free|access-date=2022-10-08|archive-date=2015-09-07|archive-url=https://web.archive.org/web/20150907000339/http://www.jisajournal.com/content/pdf/s13174-015-0030-8.pdf|dead-url=no}}</ref>。
* 若領域特定語言的scope較小,會比較容易學習。

領域特定語言的一些缺點如下:

* 學習新語言的成本。
* 應用範圍受限。
* 設計、實現及維護領域特定語言以及開發工具([[集成开发环境]])的成本。
* 尋找、設定及維護適當的語言scope。
* 設計領域特定語言時,需在領域專門的語言構造,以及通用的語言構造之間取捨平衡。
* 相較於程式設計師撰寫的程式碼,領域特定語言的[[算法效率|效率]]可能會比較低。
* 同一領域可能有計多種非標準語言,例如不同保險公司開發、使用的領域特定語言<ref>{{cite web|url=http://adams-project.org/standrts09/proceedings/miotto_vardanega_standrts09_final.pdf|title=On the integration of domain-specific and scientific bodies of knowledge in Model Driven Engineering|first=Eric|last=Miotto|access-date=2010-11-22|archive-url=https://web.archive.org/web/20110724223732/http://adams-project.org/standrts09/proceedings/miotto_vardanega_standrts09_final.pdf|archive-date=2011-07-24|url-status=dead}}</ref>。
* 非技術背景的領域專家不容易自行撰寫或修改領域特定語言的程式<ref name="Freudenthal"/>。
* 領域特定語言和(用通用語言撰寫的)IT系統其他模組不易整合。
* 特定領域特定語言的專家人數較少,會帶來人力成本的增加。
* 不容易找到相同領域特定語言的程式碼範例。

== 註解 ==
<references group="註解"/>
==相關條目==
==相關條目==
<!---*[[Language workbench]]-->
*{{le|語言工作檯|Language workbench}}
*[[架構描述語言]]
*[[架構描述語言]]
<!--*[[Domain-specific entertainment language]]
<!--*[[Domain-specific entertainment language]]-->
*[{Language for specific purposes]]-->
*{{le|專門用途語言|Language for specific purposes}}
*[[行話]]
*[[行話]]
*{{le|元語言抽象|Metalinguistic abstraction}}
*{{le|元語言抽象|Metalinguistic abstraction}}
*{{le|程式設計領域|Programming domain}}
*{{le|程式設計領域|Programming domain}}
==參考資料==
{{reflist}}
{{编程语言类别}}
{{编程语言类别}}
{{電腦科學}}
{{電腦科學}}
[[Category:特定领域语言]]
[[Category:特定领域语言]]
[[Category:编程语言分类]]
[[Category:编程语言分类]]
{{tech-stub}}

2024年2月8日 (四) 08:46的最新版本

領域特定語言(英語:Domain-specific language縮寫DSL),也稱為特定域語言,是專門針對特定應用領域[註解 1]计算机语言,和可以用在多種領域的通用語言英语general-purpose language(GPL)恰好相反。像HTML專門用在網頁設計上,就屬於領域特定語言,也有些領域特定語言只用在一個或幾個軟體上,例如MUSH英语MESH軟體碼。領域特定語言還可以依使用的語言分類,像是領域特定的標記語言、領域特定的建模語言(或更廣義的規格語言)以及領域特定的程式語言。從電腦發明開始,就已出現特定用途的電腦語言。而「領域特定語言」一詞是隨著特定域建模(domain-specific modeling)的興起,才開始廣為使用。簡單的領域特定語言(特別是只有單一應用程式使用的領域特定語言),有時也會稱為迷你語言

領域特定語言和通用語言之間沒有明確的界線,因為可能某计算机语言原來有一些適用於特定領域的特徵,但也可以應用在更通用的範圍,相反的,也有可能某计算机语言理論上可以用在多種領域,但實務上只用在特定領域中。像Perl一開始是設計為文字處理語言以及膠水語言(和AWKshell script的領域相同),但後來成為通用的程式語言。相反的,PostScript圖靈完備的語言,但實際上只用作頁面描述語言(領域特定語言)。

用途

[编辑]

設計及使用適合的語言,是領域工程英语domain engineering中重要的一環,作法可能是選擇適合此領域的現有語言(可能是某個領域特定語言或通用電腦語言),也可能是開發一種新的領域特定語言。面向语言的程序设计會把為了描述問題而創建特定語言一事,視為問題解決流程的標準步驟之一。假如用一種新的領域特定語言描述某種問題,會比用現有語言描述更加清楚,而且這種問題又常常出現,那麼創建此一領域特定語言(以及配合的軟體)就是值得的。領域特定語言可以針對特定的問題領域、特定的問題表示方式、特定的解決方案技術,或是某一領域的其他層面。

用在設計和實現上

[编辑]

领域特定语言是在設計和實現上有特定目的的語言(或是宣告的語法或是文件)。领域特定语言可以是視覺對話語言(visual diagramming language),例如Generic Eclipse Modeling System英语Generic Eclipse Modeling System中建立的語言,可以是程式化抽象,例如Eclipse Modeling Framework,也可以是文字語言。例如,命名列工具grep正则表达式語法,可以在文字中尋找特殊排列規則的文字。sed工具定義了匹配和取代正则表达式的語法。一般來說,這些小工具可以在殼層內整合使用,以達到複雜的系統工作。

有時领域特定语言和腳本語言之間沒有清楚的分界,不過领域特定语言多半沒有處理檔案系統的低階功能、跨行程控制、以及一些全功能程式語言或腳本語言必須有的功能。許多领域特定语言不會編譯成字节码或是可執行檔,而會轉換為許多不同的媒體格式。像GraphViz可以輸出PostScriptGIF檔、JPEG檔等。Csound則會編譯成聲音檔。像是POV-Ray之類的光線追蹤(ray-tracing)领域特定语言會轉換為圖形檔。像是SQL之類的電腦語言會有種特殊的情形:SQL是針對特定領域(存取和維護關聯資料庫)的,所以的確是领域特定语言,也常會其他應用程式呼叫,但SQL的關鍵字及函數比許多腳本語言都多,一般也會視為是獨立的語言,有可能是因為在程式中資料庫使用的普及性,以及要成為此語言專家需要有的掌握程度。

許多领域特定语言也有提供API,因此可以在其他程式執行時呼叫此API,不影響原程式的流程,此運作方式類似程式的函式庫,和腳本語言之間的差異就更小了。

程式開發工具

[编辑]

有些领域特定语言會隨著時間擴展,加入全功能的程式開發工具,因此更增加了該語言是否是领域特定语言的問題難度。

模型驱动工程中,有許多领域特定语言的例子,像是用斷言說明模型的OCL英语Object Constraint Language、或是领域特定的轉換语言QVT英语QVT,不過统一建模语言(UML)反而是通用的建模語言。

有一個類推可以說明超小型語言及领域特定语言:超小型語言像是刀,有許多不同的使用方式,從切食物到鋸樹都可以。领域特定语言像是電鑽,也有很多不同的使用方式,不過都是用來在東西上鑽洞上。通用特定语言是完整的完整的工作台,有許多特別用來進行特定工作的工具。程式設計師使用领域特定语言的方式類似他們看工具台,知道他們需要一個較好的電鑽,而且找到一個剛好適用的领域特定语言。

優點和缺點

[编辑]

領域特定語言的一些優點如下[1][2]

  • 領域特定語言可以使解決方案以較簡潔的方式呈現,而且達到問題域上的抽象層次。意思就是領域專家自身可以理解、驗證、修改,甚至開發領域特定語言的程式。不過,可以達到此程度的例子不多[3]
  • 領域特定語言可以達到領域層次的计算机安全。只要其語言構造(language construct)是安全的,以此寫的所有程式碼可以視為是安全的[來源請求]
  • 領域特定語言有助於將商業資訊系統的開發,從傳統的軟體開發者轉到領域專家身上,此一群體人數較多,對此一領域有較深入知識,但程式技術較為不足[4]
  • 若領域特定語言的scope較小,會比較容易學習。

領域特定語言的一些缺點如下:

  • 學習新語言的成本。
  • 應用範圍受限。
  • 設計、實現及維護領域特定語言以及開發工具(集成开发环境)的成本。
  • 尋找、設定及維護適當的語言scope。
  • 設計領域特定語言時,需在領域專門的語言構造,以及通用的語言構造之間取捨平衡。
  • 相較於程式設計師撰寫的程式碼,領域特定語言的效率可能會比較低。
  • 同一領域可能有計多種非標準語言,例如不同保險公司開發、使用的領域特定語言[5]
  • 非技術背景的領域專家不容易自行撰寫或修改領域特定語言的程式[3]
  • 領域特定語言和(用通用語言撰寫的)IT系統其他模組不易整合。
  • 特定領域特定語言的專家人數較少,會帶來人力成本的增加。
  • 不容易找到相同領域特定語言的程式碼範例。

註解

[编辑]
  1. ^ 此處的領域也可能是指业务领域(business area),例如壽險政策、戰鬥模擬、薪資計算、帳單管理等

相關條目

[编辑]

參考資料

[编辑]
  1. ^ Marjan Mernik, Jan Heering, and Anthony M. Sloane. When and how to develop domain-specific languages. ACM Computing Surveys, 37(4):316–344, 2005.doi:10.1145/1118890.1118892
  2. ^ Diomidis Spinellis. Notable design patterns for domain specific languages页面存档备份,存于互联网档案馆). Journal of Systems and Software, 56(1):91–99, February 2001. doi:10.1016/S0164-1212(00)00089-3
  3. ^ 3.0 3.1 Freudenthal, Margus. Domain Specific Languages in a Customs Information System. IEEE Software. 1 January 2009: 1. doi:10.1109/MS.2009.152. 
  4. ^ Aram, Michael; Neumann, Gustaf. Multilayered analysis of co-development of business information systems (PDF). Journal of Internet Services and Applications. 2015-07-01, 6 (1) [2022-10-08]. S2CID 16502371. doi:10.1186/s13174-015-0030-8可免费查阅. (原始内容存档 (PDF)于2015-09-07). 
  5. ^ Miotto, Eric. On the integration of domain-specific and scientific bodies of knowledge in Model Driven Engineering (PDF). [2010-11-22]. (原始内容 (PDF)存档于2011-07-24).