DSLとは

>Ruby関連のツールではRubyで書かれたDSLがよく使われます。先ほど説明した`RakefileもRubyを使ったDSL`です。しかし、そもそもDSLとは何でしょうか？ そして、なぜRubyで書かれたDSLがよく登場するのでしょうか？

### 人間と機械に読みやすい言語 DSL
>`DSLとは"Domain Specific Language"の略`で、`「ドメイン固有言語」（または「ドメイン特化言語」）`と訳されます。これを筆者の言葉でもう少し噛み砕いて説明するなら、「`何か特別な目的を実現するために定義された、人間(=非技術者)にとって読みやすく、機械にとっても処理しやすいテキストフィルの記述ルール`」になります。
P424

https://gihyo.jp/book/2017/978-4-7741-9397-7

>DSL（Domain Specific Language）は、ドメイン固有言語と訳されてます。DSLは、Java、C#などの汎用言語とは違い、`ある特定の種類の問題に特化したコンピュータ言語`です。

https://gihyo.jp/admin/feature/01/dsl/0001#:~:text=DSL%EF%BC%88Domain%20Specific%20Language%EF%BC%89%E3%81%AF%E3%80%81%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%9B%BA%E6%9C%89%E8%A8%80%E8%AA%9E%E3%81%A8%E8%A8%B3%E3%81%95%E3%82%8C%E3%81%A6%E3%81%BE%E3%81%99%E3%80%82DSL%E3%81%AF%E3%80%81Java%E3%80%81C%23%E3%81%AA%E3%81%A9%E3%81%AE%E6%B1%8E%E7%94%A8%E8%A8%80%E8%AA%9E%E3%81%A8%E3%81%AF%E9%81%95%E3%81%84%E3%80%81%E3%81%82%E3%82%8B%E7%89%B9%E5%AE%9A%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%AE%E5%95%8F%E9%A1%8C%E3%81%AB%E7%89%B9%E5%8C%96%E3%81%97%E3%81%9F%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%99%E3%80%82

### 構造化
>classやdefのようなキーワードや、丸括弧やセミコロンのような`記号類など、余計な情報が多すぎて元のRakefileにあったシンプルさや文書っぽさは失われ`ていますね。
`Rubyではメソッド呼び出しのため丸括弧（()）が省略できます`。また命令の区切りは改行になるのでいちいちセミコロン（；）をつける必要もありません。また、`トップレベルに命令を羅列できる`ので、main関数やmainクラスでプログラム全体を囲む必要もありません。ブロックも情報を構造化（入れ子）にする用途に使うと便利です。

### 
>Rubyにはこうした特徴があるため、`Rubyのプログラムをあたかも設定ファイルやテキストドキュメント`のように使うことができます。そして、`「人間が読みやすいテキスト」がそのまま「Rubyのプログラム」になっている`ため、ツールやライブラリを作る開発者にとっても非常に都合が良いのです。

>Rubyを使っているとDSL、つまり「`設定ファイルのようなRubyプログラム`」や「`ドキュメントのようなRubyプログラム`」がいろいろなところに登場します。この後で説明される`BundlerのGemファイルも`そうですし、`テスティングフレームワークのRspecも`そうです。`Railsや各種gemで使われる設定ファイルも`「一見すると設定用のテキストファイルっぽいが、実はRubyプログラムそのもの」であるケースがよくあります。

* `設定ファイルのようなRubyプログラム`」や「`ドキュメントのようなRubyプログラム`とはどんなコードだろうか？

>このようにRubyはDSLを通じて、人間と機械のスムーズな橋渡しを担ってくれているのです。

https://gihyo.jp/book/2017/978-4-7741-9397-7

# DSLの必要性
>Ruby on Railsの登場以降、メタプログラミングという言葉を良く聞くようになりました。`メタプログラミングというと、マクロ、コードの自動生成、テンプレート`を上げることができます。
>
>DSLは、メタプログラミングで使われます。メタプログラミングは、一般的なプログラムとはまったく違った方法をとっているので、その概念、仕組みを知る必要があります。
>
>メタプログラミングとは、ロジックを直接コーディングするのではなく、`あるパターンをもったロジックを生成する高位ロジックを定義`する方法のこと。主に対象言語に埋め込まれたマクロ言語によって行われる。

https://gihyo.jp/admin/feature/01/dsl/0001#:~:text=Ruby%20on%20Rails,%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E8%A1%8C%E3%82%8F%E3%82%8C%E3%82%8B%E3%80%82

# （2）メタプログラミング：
>一般的なプログラムでは実現することができなかった次の2つの点を実現することができます。
>
>a．プログラムの再利用
b．データを自然な形で扱えるようにする
つまり、DSLを作ることで「プログラムを生成するプログラムを書く」ことが容易に解決できます。
>
>まず、プログラムを生成する仕様を決めます。クラス名は、ファイル名から取得します。要素名（フィールド）は、1行目に記述されている列名から取得します。この`プログラムを動的に生成`します。動的に生成されたプログラムにアクセスすることで、CSVファイルから取得したデータにアクセスすることが可能になります。
>
>しかし、`このプログラムは、CSVファイルからデータを取得し、提供することのみを解決してくれます。これが、“⁠DSL（ドメイン固有言語）⁠”と言われる所以`です。この例のDSLは、一般的に内部DSLもしくは組み込みDSLと言われてます（後述「内部DSLと外部DSL」を参照⁠）⁠。
>
>この例を作る際に参考にしたのが、Ruby on RailsのActiveRecordです。

https://gihyo.jp/admin/feature/01/dsl/0001#:~:text=%EF%BC%882%EF%BC%89%E3%83%A1%E3%82%BF,%E3%81%AEActiveRecord%E3%81%A7%E3%81%99%E3%80%82

# DSLの種類
### 内部DSL
>言語自身で強力なDSLを記述する事のできるLispは、「⁠プログラム可能なプログラミング言語」と言われてます。この手法をとっているDSLは、内部DSLもしくは、組み込みDSLと言われてます。
>
>RubyはLispの血統であることから、Ruby、Ruby on Railsを使って書かれたコードの中には、多くの内部DSLが含まれてい ます。以下のサンプルコードは、内部DSLを使って書かれてます。ここで重要なのは、Rubyのシンタックスを違反することなく書かれている、ということです。このことにより、ホスト言語のパワーと既存のツールのすべてを利用することができます。

https://gihyo.jp/admin/feature/01/dsl/0001#:~:text=%E3%81%A8%E5%A4%96%E9%83%A8DSL-,%E5%86%85%E9%83%A8DSL,%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82,-%E3%83%AA%E3%82%B9%E3%83%88%E3%80%80%E5%86%85%E9%83%A8DSL

### 外部DSL
>ホスト言語とは異なる言語（XML、Makefileのような独自形式）で作成されたDSLは、外部DSLと呼ばれてます。UNIX伝統のリトル言語がそれに相当します。外部DSLの最大のメリットは、DSL設計者が自由にフォーマットを決められるということです。しかし、この方法を採用すると、フォーマットをパースする処理を書かねばなりません。
>
>また、この手法を使ったDSLは、GUIツールを提供していることが多いのも大きな特徴です。Eclipseには、外部DSLをサポートする多くのプラグイン（Seasar2、Spring、Hibernate、JBoss Rules など）が既に存在してます。

https://gihyo.jp/admin/feature/01/dsl/0001#:~:text=%E3%83%9B%E3%82%B9%E3%83%88%E8%A8%80%E8%AA%9E%E3%81%A8,%E3%81%97%E3%81%A6%E3%81%BE%E3%81%99%E3%80%82

# 感想
DSLでメタプログラミングができてある`パターンをもったロジックを生成する`を実現させることができる