APIと埋め込みドメイン固有言語(DSL)の違いは何ですか?
単なる構文ですか?
OpenGLのようなAPIを検討してください。それはグラフィックDSLとどう違うのですか?
つまり、APIが十分に複雑な場合、それは組み込みDSLと見なすことができますか?
APIと埋め込みドメイン固有言語(DSL)の違いは何ですか?
単なる構文ですか?
OpenGLのようなAPIを検討してください。それはグラフィックDSLとどう違うのですか?
つまり、APIが十分に複雑な場合、それは組み込みDSLと見なすことができますか?
回答:
区別は難しく、使用する言語によって異なります。それも主観的です。
clojureでは、DSLのように見えるAPIを定義できます。たとえば、hiccupを使用すると、htmlを生成できます。
(html [:span {:class "foo"} "bar"])
これは、lisp構文を持つDSLと見なすことができます。html
マクロである可能性があるという事実は、s-expressionsを使用してhtmlテンプレートライブラリを作成している場合と同じ力を与えます(sxmlを参照)
Pythonでは、同じAPIは次のようになります。
html(["span", {"class" : "foo"}, "bar"])
htmlは関数です。最初にその引数が評価され、次に関数呼び出しが行われます。Python構文がより具体的で、Pythonのセマンティクスがより厳密であるという事実は、この式が言語に依存しないDSLとして解釈することがより困難であることを意味します。
古典的な言語表現は、データ構造のようなツリーと、そのノードで再帰的に呼び出されるeval関数です。LISP言語では、このツリー構造が非常にはっきりしているため、ネストされた関数呼び出しは、組み込みの言語機能と区別できません。これが、LISPコミュニティがほとんどすべてのDSLについて語っている理由です。
プログラミングは、有用な抽象化を提供することだと思います。ビルドしたすべてのもの(ライブラリーまたはアプリケーションのUI)を、人々が複雑な問題を解決するのに役立つ言語要素として見ることは、ほとんどのものを設計するための効果的な方法であることがわかりました。この観点から、私はすべてのライブラリーがDSLであると断言しますが、それらのいくつかは設計が不十分です:-)
APIとDSLはまったく異なる概念であり、重複していると言える領域がいくつかあります。
すべてのDSLはコンピューター言語です。それらは、APIを介して渡されるメッセージで使用される可能性がある、解釈、コンパイル、マークアップ、クエリ言語(SQLなど)または(JSONまたはXMLの一部の使用など)データ言語である可能性がありますが、言語でなければなりません。この用語は、目的ではなく性質を表します。
APIは、1つのソフトウェアコンポーネントを他のコンポーネントで使用できるようにするインターフェイスです。用語は性質ではなく目的を説明します。たとえば、API は、DSL ではないオブジェクトメソッドのセットにすることができます。Web APIはDSLを使用する場合があります(または、落ち着いている場合は DSL であると主張するかもしれません)が、ドメイン固有の共有言語は定義の一部ではありません。デバイスのソフトウェアドライバーはCで記述されている場合があり、APIはコンパイル済みライブラリとして配布され、プロトコルは完全にバイナリであり、ライブラリを使用できる任意の言語を使用してクライアントを作成できます。そのAPIの何もDSLと呼ぶことはできません(API関数のシンボリック名のリストはそれをカットしません)。
定義を考えると、類似点しか表示されない理由について少し混乱しています。
一般的には違います。DSLは、一部の操作をより便利にするために、意図的に非汎用にしています。HTMLやロゴなどはもともとドメイン固有の言語でした。
一般に、最も強力なAPIを使用していても、DSLを別の言語に埋め込むことはできません。そのAPIに対してプログラムするものはすべて、ホスト言語での一連の式のように見え、専用言語を使用する場合ほど便利ではありません。
例外は、ライブラリを介して構文をワープする例外的な機会を提供する言語です(C ++のようなオペレーターのオーバーロード、Scalaのような新しいオペレーターの発明、またはソースフィルター付きのPerlのような完全に異なる読み取り構文の事前宣言)。そのような言語を使用し、それらが提供する柔軟性を最大限に活用すると、結果は新しい特殊目的言語のように見える可能性があります(ただし、セマンティクスは、その言語が実際に発明された場合に期待するものと微妙に異なることがよくあります。地面からあなたの目的を果たすために)。
ここでは、Martin FowlerによるDslBoundaryから
記事から、私の理解は基本的に埋め込まれたDSLとAPIはそれほど違いはないということです。ただし、ここには少し違いがあります。
しかし、外部DSLについて話すと、別の話になります。外部DSLは小さなプログラミング言語のようなものですが、確かに、それはすべての問題を解決するのではなく、特定の問題を解決することを意味する汎用言語ではありません。
私はすべてのAPIが組み込みDSLであると思いますが、逆は当てはまりません。すべての組み込みDSLがAPIであるとは限りません。コンポーネントを統合する手段として言語が使用されている場合にのみ、APIと呼ぶことができます。
APIが組み込みDSLと見なされるのはなぜですか?まず第一に、それは言語を形成します。抽象化を形成し、複雑な問題を解決するために(ホスト言語によって)組み合わせることができるプリミティブ要素(タイプと操作)を持っています。たとえば、OpenGL APIを使用して、リアルタイムで3Dシーンをレンダリングできます。コレクションAPIは、オブジェクトのセットなどを操作するアルゴリズムを作成するために使用できます。次に、それは明らかにドメイン固有です。たとえば、Collections APIのドメインはオブジェクトのセットを処理し、OpenGL APIのドメインは3Dレンダリングです。したがって、APIはドメイン固有の言語です。
ただし、すべてのDSLがAPIであるとは限りません。たとえば、一部のDSLは指定されたコンポーネントによって実装されません。すべてのシステムはいくつかの抽象化を定義しており、特定のドメインを扱う抽象化はDSLと見なすことができますが、これらの抽象化の実装が「スワップ可能」であることを意味するものではありません。つまり、APIを形成する必要はありません。それらは可能ですが、常に必要なわけではありません。ただし、実装が「コンポーネント化」されている場合(より適切な用語がないため申し訳ありません)、DSLは実際にAPIになります。