APIはいつ組み込みDSLと見なされますか?


10

APIと埋め込みドメイン固有言語(DSL)の違いは何ですか?

単なる構文ですか?

OpenGLのようなAPIを検討してください。それはグラフィックDSLとどう違うのですか?

つまり、APIが十分に複雑な場合、それは組み込みDSLと見なすことができますか?


1
DSLの目的は、物事を簡単にすることです。十分に単純な APIをDSLと見なすことができるかどうか尋ねるべきではありませんか?
Doval 2014

私が知りたい/理解したいのは、APIとDSLがどのように区別されているかだと思います。私がそこに複雑に入れているのは、APIを絶えず呼び出している場合、それはむしろドメイン固有であると考えるか、少なくともそれが最初に私がそれについて考えた方法だからです。
Phyllostachys

1
問題は、API組み込みDSLの違いは何ですか?
proskor 2014

回答:


8

区別は難しく、使用する言語によって異なります。それも主観的です。

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であると断言しますが、それらのいくつかは設計が不十分です:-)


4

APIとDSLはまったく異なる概念であり、重複していると言える領域がいくつかあります。

すべてのDSLはコンピューター言語です。それらは、APIを介して渡されるメッセージで使用される可能性がある、解釈、コンパイル、マークアップ、クエリ言語(SQLなど)または(JSONまたはXMLの一部の使用など)データ言語である可能性がありますが、言語でなければなりません。この用語は、目的ではなく性質を表します。

APIは、1つのソフトウェアコンポーネントを他のコンポーネントで使用できるようにするインターフェイスです。用語は性質ではなく目的を説明します。たとえば、API 、DSL ではないオブジェクトメソッドのセットにすることができます。Web APIはDSLを使用する場合があります(または、落ち着いている場合 DSL であると主張するかもしれません)が、ドメイン固有の共有言語は定義の一部ではありません。デバイスのソフトウェアドライバーはCで記述されている場合があり、APIはコンパイル済みライブラリとして配布され、プロトコルは完全にバイナリであり、ライブラリを使用できる任意の言語を使用してクライアントを作成できます。そのAPIの何もDSLと呼ぶことはできません(API関数のシンボリック名のリストはそれをカットしません)。

定義を考えると、類似点しか表示されない理由について少し混乱しています。


コメンターが指摘したように、私は組み込みDSLのみを検討したに違いありません。単語の辞書を作成するForthのようなものを考えてみましょう。私は、DSLを構築するときに、完全な機能を持つアプリケーションに近づくと読みましたが、APIによく似ています。
Phyllostachys

2
これは実際には私の答えには影響しません。それが独自の構文などを持つ言語である場合、それはDSLです。これらの言語機能を欠く複雑なインターフェースはDSLではありません。あなたはおそらくあなたの質問を更新する必要があり、私は私の答えを更新することを検討します。
itsbruce 2014

2
サブ言語はまだ言語です。「独自の」構文を持つ必要はなく、ホスト言語から「借用」できます。
proskor 2014

それでは、プロジェクトがほぼ完了したときにすべてのプロジェクトが独自のDSLになるわけではありませんか(つまり、一般的なプログラミング言語は最終的にDSLになります)。一般的なものからドメイン固有のものまで、一連の並べ替え。
Phyllostachys 2014

4

一般的には違います。DSLは、一部の操作をより便利にするために、意図的に非汎用にしてます。HTMLやロゴなどはもともとドメイン固有の言語でした。

一般に、最も強力なAPIを使用していても、DSLを別の言語に埋め込むことはできません。そのAPIに対してプログラムするものはすべて、ホスト言語での一連の式のように見え、専用言語を使用する場合ほど便利ではありません。

例外は、ライブラリを介して構文をワープする例外的な機会を提供する言語です(C ++のようなオペレーターのオーバーロード、Scalaのような新しいオペレーターの発明、またはソースフィルター付きのPerlのような完全に異なる読み取り構文の事前宣言)。そのような言語を使用し、それらが提供する柔軟性を最大限に活用すると、結果は新しい特殊目的言語のように見える可能性があります(ただし、セマンティクスは、その言語が実際に発明された場合に期待するものと微妙に異なることがよくあります。地面からあなたの目的を果たすために)。


したがって、おそらく、大規模なAPIの単純なラッパーとして機能する文字列(DSL)を解析するものを作成できます。DSLを解析するものからDSLを分離することが差別化だと思います。
Phyllostachys 2014

3
はい、これは「インタープリター」設計パターンと呼ばれ、良い習慣と見なされています。インタープリターコードを1回記述すれば、それ以降、ドメイン固有のコンテンツをはるかに簡単に表現できます。
キリアンフォス2014

「Groovyのような新しいオペレーターを発明する」おそらくあなたはScalaを意味したのでしょう。Groovyでは演算子セットは固定されていますが、C ++のようにオーバーロードできます。
ボルグファンガイア2014

@VorgvanGeir申し訳ありませんが、修正されました。
Kilian Foth 2014

2

ここでは、Martin FowlerによるDslBoundaryから

記事から、私の理解は基本的に埋め込まれたDSLとAPIはそれほど違いはないということです。ただし、ここには少し違いがあります。

  1. APIは、新しい機能の提供を強調しています
  2. DSLは新しい機能を提供するだけでなく、新しい構文とコーディングの新しい方法も提供します。

しかし、外部DSLについて話すと、別の話になります。外部DSLは小さなプログラミング言語のようなものですが、確かに、それはすべての問題を解決するのではなく、特定の問題を解決することを意味する汎用言語ではありません。


1

私はすべてのAPIが組み込みDSLであると思いますが、逆は当てはまりません。すべての組み込みDSLがAPIであるとは限りません。コンポーネントを統合する手段として言語が使用されている場合にのみ、APIと呼ぶことができます。

APIが組み込みDSLと見なされるのはなぜですか?まず第一に、それは言語を形成します。抽象化を形成し、複雑な問題を解決するために(ホスト言語によって)組み合わせることができるプリミティブ要素(タイプと操作)を持っています。たとえば、OpenGL APIを使用して、リアルタイムで3Dシーンをレンダリングできます。コレクションAPIは、オブジェクトのセットなどを操作するアルゴリズムを作成するために使用できます。次に、それは明らかにドメイン固有です。たとえば、Collections APIのドメインはオブジェクトのセットを処理し、OpenGL APIのドメインは3Dレンダリングです。したがって、APIはドメイン固有の言語です。

ただし、すべてのDSLがAPIであるとは限りません。たとえば、一部のDSLは指定されたコンポーネントによって実装されません。すべてのシステムはいくつかの抽象化を定義しており、特定のドメインを扱う抽象化はDSLと見なすことができますが、これらの抽象化の実装が「スワップ可能」であることを意味するものではありません。つまり、APIを形成する必要はありません。それらは可能ですが、常に必要なわけではありません。ただし、実装が「コンポーネント化」されている場合(より適切な用語がないため申し訳ありません)、DSLは実際にAPIになります。


これは単にあなたの意見ですか、それとも何らかの形でバックアップできますか?
gnat 2014

@gnat私は自分のポイントをさらに説明するために私の答えを拡張しました。
proskor 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.