JavaでのDSLの作成、パート1:ドメイン固有言語とは何ですか?

メイクファイルを作成したり、CSSを使用してWebページを設計したことがある場合は、DSLまたはドメイン固有の言語に遭遇したことがあります。DSLは、特定のタスク用にカスタム設計された、小さくて表現力豊かなプログラミング言語です。この4部構成のシリーズでは、Venkat SubramaniamがDSLの概念を紹介し、最終的にJavaを使用してDSLを構築する方法を示します。この最初の記事では、VenkatがDSLとは何かを説明し、外部DSLと内部DSLの違いを定義します。次に彼は、おそらく気付かずに、あなたが何年も使用している可能性が高いいくつかのDSLを指摘します。

アプリケーションの作成や使用に携わったことがある場合は、その時点で気付いていなくても、ドメイン固有言語またはDSLに既に遭遇している可能性があります。入力データを受信するアプリケーションへのキーワード入力ファイルはDSLです。設定ファイルはDSLです。 makefileは、アプリケーションを構築するためのルールと依存関係を指定するために使用されるDSLです。これらのいずれかを作成した場合は、ドメイン固有言語を作成するための最初のステップをすでに実行しています。

フレーズ内の単語言語は、DSLが特定のセマンティクスを表現するために構文を使用することを期待するように導くかもしれません。Javaのような汎用言語とは異なり、DSLは範囲と機能がかなり制限されています。名前が示すように、DSLは特定のタイプの問題またはドメインに鋭敏に焦点を合わせており、その限られた範囲のコンテキスト内でソリューションの狭いセットを表現することに重点を置いています。そしてそれは良いことです-DSLはシンプルで簡潔です。

さて、それはLです。DとSはどうですか?

DSLのドメインという言葉は、「知識、影響力、または活動の領域または領域」を指します。(詳細については、Eric Evansによるドメイン駆動設計を参照してください。)ドメインに焦点を合わせると、コンテキストが得られます。これは、アプリケーションのモデルを進化させることができる論理フレームワークです。

DSLに固有の単語は、制限されたコンテキストを提供します。それはあなたが物事を関連性があり、集中し、簡潔で、表現力豊かに保つのを助けます。

DSLの成功にはシンプルさが重要です。言語のドメインに精通している人は、それを簡単に理解する必要があります。たとえば、保険数理士が保険の分野でビジネスルールを表現するために使用するDSLを作成している場合、困難で複雑な言語の学習に多くの時間を費やしたくないでしょう。保険リスクに関連する詳細を、簡単に理解、議論、進化、維持できる方法で表現することに集中してもらいたいと考えています。あなたが彼らのために作成するDSLは、彼らの語彙、彼らが仲間と通信するために毎日使用する用語に基づいて構築されなければなりません。あなたは彼らにあなたが提供する構文を使用させたいのですが、彼らは単にいくつかの個別のルールを指定しているように見えるはずです。そして、彼らは本当にプログラミングしている、あるいはある種の言語を使用しているという印象を与えることなくそうすることができるはずです。

優れたDSLを作成することは、栄養価の高い食事を調理するようなものです。子供たちに野菜を気づかずに食べさせたいのと同じように、クライアントにDSLの構文を気にせずに使用してもらいたいのです。

簡潔さは、優れたDSLを作成するためのもう1つの部分です。つまり、簡潔で表現力豊かな構文を選択することを意味します。合理的な範囲内の簡潔さにより、コードの読み取りと保守が容易になります。表現力は、コミュニケーション、理解、スピードを促進するのに役立ちます。たとえば、行列の乗算を理解している人にとってmatrixA.multiply(matrixB);は、matrixA * matrixB。よりも表現力が低く簡潔です。前者は、関数の呼び出しと括弧の使用を含み、威圧的なセミコロンを含みます。後者はすでになじみのある表現です。