web-dev-qa-db-ja.com

コードがドメイン固有の言語と見なされる場合

今日、同僚との興味深い議論。 Close()、Abort()、Dispose()を正しく処理するWCFのチャネルのラッパーを作成します。代わりにこのラッパーが使用されます。

同僚は、これはドメイン固有の言語を作成するようなものだと主張しました。彼はその考えに反対し、本質的に間違っていると考えたすべてのソフトウェア開発者に取り組む特定の方法を課すと述べた。彼はむしろ「using」キーワードをオーバーロードします。 (現在、AFAIK、これはC#では不可能です)

それで、そうですか?クラスのセットを作成し、他のライブラリからのクラスの代わりにそれらを厳密に使用して(つまり、チャネルの使用を禁止して)、DSLを作成しますか?

「コード」はいつDSLになりますか?私は常にDSLを独自の文法、キーワード、パーサー、トークナイザーなどを備えた新しい言語として理解していました。

class ChannelWrapper : IDisposable
{
    void Dispose(bool disposing)
    {
        ...
        try {
            channel.Close();
        }
        catch (CommunicationException) {
            channel.Abort();
        }
        catch (TimeoutException) {
            channel.Abort();
        }
    }
}
4
Diana

これはDSLではなく、単なるAPIです。

APIは、使用のためのビルディングブロックのセットを提供しますwithinアプリケーションプログラマが使用している言語。他のプログラマーが使用するanotherプログラミング言語内で使用するビルディングブロックのセットである場合、それはbindingsのセットです。

ドメイン固有の言語新しく発明された言語であり、通常はプログラミング言語よりも単純なもので、多くの場合non-programmer役立つコンテンツを表現できます。 HTMLは複雑すぎてDSLとは言えません。多くの小さなツールの構成ファイル形式は、ドメイン固有の言語のより良い例です。

4
Kilian Foth

External DSL(独自の構文とセマンティクスを持つ別個の言語)との違いに触れています内部DSL(「ホスト」言語の構文とセマンティクスに実際に拘束されているにもかかわらず、APIを使用することで別の言語のように感じるようにAPIを創造的に設計する方法)。

後者の場合は、Embedded DSLという用語が聞こえることもあります(さらにわかりにくいので、と省略して表示されます[〜# 〜] edsl [〜#〜])と[〜#〜] dsl [〜#〜]前者。これは基本的には文化的な違いです。 Rubyコミュニティは内部DSL /外部DSLの用語を使用していますが、HaskellコミュニティはEDSL/DSLの用語を使用しています。しかし、Embedded DSLあいまいです。たとえば、正規表現がPerlに「埋め込まれている」、またはLINQがC♯に埋め込まれているなど、別の言語に埋め込まれた言語のように聞こえるためです。

国境がどこにあるのかという質問については...すべての言語はAPIであり、すべてのAPIは言語です。 APIが「優れている」ほど、「言語に近い」と感じられます。 API設計言語設計です。

これは特にOOに当てはまります。アランケイのOOのビジョンに戻ると、それは後にARPAnetになり、次にインターネットになるものに強く触発されます。互いに分離(カプセル化)され、独自のプライベートメモリ(インスタンス変数)を持つコンピューター(オブジェクト)は、メッセージを送信する(仮想メソッドを呼び出す)ことによって互いに通信します。実際、彼は、今日「仮想メソッド呼び出し」と呼ばれているものに「メッセージング」という用語を使用しました。オブジェクトのAPIは、まだ非公式に「プロトコル」と呼ばれていますが、Objective-Cでは、たとえば言語としても特徴。

したがって、ネットワークのメタファーと用語は、OO思考に深く根付いています。Smalltalkのごく初期の実装では、メソッド(またはオブジェクト)さえありませんでした。システムを流れるメッセージストリームがありました。そして、これらのストリームは解析、解釈、書き直され、再ルーティングされました。次に、いくつかのパターンが現れました:1)「メッセージの海」に密接に関連する「もの」のクラスターがあり、これらは後に「オブジェクト」になります。 、および2)メッセージの先頭がいくつかの列挙されたアクションのセットを示し、メッセージの残りがそのアクションをパラメータ化するという独特のパターンがあり、これらは後で「メソッド」と「メッセージ」になりました。

上記のメッセージの解析と解釈につ​​いてどのように話しましたか?それは言語実装のように聞こえませんか?実際、OOシステム内の各オブジェクトを独自の言語のインタプリタとして解釈できます!

ただし、APIは実際には「language-y」とはまったく感じられないことに注意してください。すべてのAPIは言語(およびその逆)であると述べましたが、それが一般にそのように認識されるかどうかについてはまだ疑問があります。たとえば、Rake、Gemspecs、RSpec、またはRails RubyのルーティングAPIについて考えた場合、人々がそれらを見ると、直観的に言語が表示され、後でそれが実際には「Rubyコード」だけです。OTOH、私がコードを見ると、C seeが表示されます。何も変わらないので、言語のように「感じ」ません。

したがって、tl; dr

  1. 同僚の意味は内部DSL、あなたの意味は外部DSL
  2. aPIと言語の間に明確な境界はなく、優れたAPIは言語のように設計されています
  3. 言語はオブジェクト指向の構造に深く根付いています。オブジェクトは本質的にインタープリターです
7
Jörg W Mittag