DSL, Domain Specific Language の分類


DSL の種類をまとめました。

DSL とは

DSL は “Domain Specific Language”、 ドメイン固有言語 のことを指します。 任意のプログラムの問題を解決できる、 C, Java, Ruby 等の汎用プログラミング言語と対照的に、 DSL は特定領域の問題を解決することが目的となっています。

DSL には2種類のタイプがあります。 外部DSL と 内部DSL です。 さらに内部DSLは2つのタイプに分かれます。 内部のミニ言語と内部的な言語拡張です。

DSLの分類
DSL 外部DSL
内部DSL ミニ言語
言語拡張

外部DSL

  • 正規表現
  • CSS
  • HTML
  • SQL

外部DSLは完全に独立のものとして扱えます。 外部DSLを実装するのに使用した言語とも独立のものとして扱えます。

外部DSLの問題は、外部DSLの中で汎用プログラミング言語が備えているような機能が使いたくなることです。 これは同様の機能を外部DSLの中で実装するか、ひとつのプログラムを作るときに汎用プログラミング言語と外部DSLを組み合わせて使うという方法で解決できます。 SQLがいい例で、 テキストに関しては多くのプラットフォームで REPLACE が実装されていますし、 また一方で SQL と 何らかのプログラミング言語を組み合わせてソフトウェアを開発します。

内部の分離されたDSL – ミニ言語

  • kotlinx.html (Kotlin)
  • gradle.build (Groovy)

内部の分離されたDSL、ミニ言語は、外部DSLと同じような使われ方をします。 ただし、外部DSLとは異なり、プログラミングの方法やシンタックスがホスト言語によって制限されてきます。 同時に、自らパーサを作る必要がありません。 しかも必要があればホスト言語の機能を使うこともできます。 Kotlin でよく議論される DSL はこのカテゴリに入ります。

外部DSLと同じ目的というだけあって、ホスト言語の知識をほとんど必要としません。 Gradle について 必要となる Groovy の知識はわずかですし、kotlinx.html についても必要となる Kotlin の知識はわずかとなっています。

内部の拡張DSL

  • Ruby on Rails
  • SQLAlchemy (Python)
  • Kotlin 拡張関数

これまで出てきたタイプとは異なるDSLです。 すでに言語が存在するところに、ある問題解決のための拡張機能を追加します。

機能を使うには、ホスト言語についての知識を必要とします。 しかし一方で、専門的な記述方式しかできなかった従来の言語を、より一般的な表現を使えるようにして生産性を上げることができます。

例としては、 Ruby on Rails における present?, blank? があります。 また、 Python の標準の機能を使うようにデータベースへのSQL発行が可能な SQLAlchemy もそのひとつです。