ルール エンジン用の DSL の作成にはどのテクノロジーを使用しますか?
質問
DSL を作成するためにどのようなテクノロジーをお勧めしますか? .NET のビジネス ルールと検証アプリケーション ブロック?なぜ?
フレームワークのアーキテクチャは、プロダクションによって確立され、実証テストされます。私は、人が読めるルールをコンパイルされたルール実装に変換する .NET プロセッサを作成したいだけです。
私が知っているオプションは次のとおりです。
- のコンパイラ パイプラインを使用する .NETブー
- F# に付属のパーサー ビルダーを使用します - FsLex と FsYacc
残念ながら、DSL 構文 (進化するでしょう) を考慮すると、これらのアプローチはいずれも、DSL 編集用に多かれ少なかれ使いやすい IDE を構築するものを提供しません。
何かアイデアやヒントはありますか?
解決
マイクロソフトの次世代アプリケーション開発プラットフォーム、コードネームオスロの
それは簡単に人々は、彼らが
で作業している問題領域のために意味をなすかの方法で物事を書き留めできるようになり
オスロは「クアドラント」、「M」という名前のモデリング言語という名前のビジュアルデザインツールで構成されているようだ、と「オスロ」リポジトリ(SQL Serverデータベース)は、ルールを格納ます。
私が正しく物事を読めば、あなたはMでモデリング言語を定義することができるように、、定義し、独自のモデリング言語を使って検証ルールを編集し、あなたのビジネスルールを生成し、オスロのリポジトリを使用するアプリケーションを作成するクアドラントを使用そして、.NETの検証アプリケーションブロックます。
他のヒント
ビジネス ルールにグラフィカル言語を使用するのは良い考えではありません。私はそれを避けます ビジネス ルールには if チェックとループがたくさん含まれていますが、それらはうまく視覚化できません。
ビジネス ルールを記述するにはテキスト言語を使用する方がはるかに優れています。
コード編集で驚異的なユーザー エクスペリエンスを得るには、次のことが必要です。
- 優れたエラー回復機能を備えたパーサー
- インクリメンタル再コンパイルを実行する機能
適切なエラー回復により、構文的に不完全な構造からプログラマーの意図を効果的に判断できます。これはインテリジェンスを実装するために非常に重要です。
インクリメンタル再コンパイルを実行できるため、ユーザーの編集に応じて効率的なバックグラウンド コンパイルを実行できるようになります。
エラーを適切に回復する最も簡単な方法は、パーサーを手動で作成することです。そうすれば、構文エラーが存在する場合に何をすべきかを判断するために、いくらでも先読みやアルゴリズム ルールを使用できます。
パーサー ジェネレーターを使用してパーサーを作成すると、構文エラーを処理する際の柔軟性が大幅に失われます。この柔軟性が、優れたインテリジェンス エクスペリエンスとひどいインテリジェンス エクスペリエンスの違いを生み出します。したがって、再帰降下を使用して手動で記述することをお勧めします。
効率的な再コンパイルを実装するには、次のことができる必要があります。1) セマンティック分析をフェーズに適切に分割します (C# などの場合、これは次のようになります:)最初に名前空間と型シンボルを構築し、次に using ステートメントを解決し、次に基本クラスを解決します。2)位相認識依存関係グラフを構築する機能3)依存関係グラフを処理するためのアルゴリズム、およびユーザー編集に応じてその部分を無効にする
本格的なプログラミング言語の場合、再コンパイルの実装は非常に困難になる可能性があります。あなたの場合、ビジネス ルールを記述しているため、はるかに単純になる可能性があります (または、コンパイルが十分に速い場合は、その必要さえないかもしれません)。
したがって、パーサーから始めて、その上にインテリジェンスを構築します。
VS の統合を回避できるのであれば、そうします。VS への統合には多くの配管作業が必要であり、相互運用性が問題を引き起こす可能性があります。パーサーを接続する Windows フォーム エディター コントロールを販売している会社がいくつかあります。VS よりも統合がはるかに簡単です。
もう 1 つの興味深い代替案は、F# 引用符を使用することです。
引用符を使用すると、プログラムの一部をデータとして扱うことができるため、AST を取得して分析し、他の言語に翻訳したり、非標準的な方法で実行したりすることができます。F# の柔軟性と合わせて、多くのことを表現できる必要があるため、ルールを記述するための内部 F# DSL/コンビネーター ライブラリと、ルールを実行するための F# 引用符のトランスレーター/インタープリターを開発する必要があります。
ビジネス ルールがどのようなものになるかはわかりませんが、次のように書くことができます。
let rule = <@
if (exists customer having validEmail) then success
else require whatever
@>
このトピックについての紹介文をブログに書きました。残念ながら、F# CTP には大きな変更がいくつかあり、ソース コードはまだ更新していませんが、このアプローチの可能性と制限についてはよく理解できるはずです。
- CodePlex の F# 引用サンプル - TomasP.Net
DSL の良い例は、F# 単体テスト フレームワークです。
- FsTest の発表 - F# 用のテスト DSL - マシュー・ポドウィソッキ
[編集]これが良いアプローチだと私が考える理由を明確にしたいと思います。
- DSL の編集に Visual Studio を使用する場合 (F# がインストールされた Shell バージョンを無料で使用できます)、非常に優れた編集エクスペリエンスを無料で得ることができます。構文の強調表示だけでなく、考えられる構成を提案する IntelliSense や、DSL の「文法」チェッカーとして機能するバックグラウンドの型チェックも備えています。
- 他のアプローチと比較して、これはおそらく最も実装が簡単なアプローチの 1 つです。
- 唯一の制限は、F# 構文に制限されることです。ただし、独自の言語を設計するのは非常に難しいため、これはそれほど悪いことではないかもしれません。特に F# の柔軟性を考慮すると。
[/編集]
お役に立てれば!
DSL の継ぎ目を構築するための標準ツール アントラー - コンパイラ出力用のターゲット言語を多数備えた強力なレクサー/パーサー ジェネレーターです。C#、Java、C/C++、Python などのバックエンドがあります。(を参照してください。 コード生成ターゲット list) を使用すると、ターゲット言語のコンパイラにカスタム コードを簡単に挿入できます。
非常に強力な IDE (ANTLRWorks) と多くのドキュメントもあります。(チェックアウト ディフェンシブ ANTLR リファレンス ANTLR の著者である Terrence Parr より)他のユーザーの使用に関する参考情報については、 お客様の声 ページ。
IDE の構築の大部分を自分で行う必要がありますが、ANTLR から入手できる堅牢なコンパイラ フレームワークを考慮すると、はるかに簡単になるはずです。これは、ここに掲載されているほとんどのソリューションに当てはまります...
現在、ANTLR で書かれたコンパイラを使用して独自の DSL を C/C++ 出力に前処理していますが、非常に満足しています。広告はもう十分なので、自分で試してみてください:) 楽しんでください!
JetBrainsのメタプログラミングシステムの
これらのDSLでの作業は本当に簡単になるように、あなたは、任意の新しい言語用のカスタム言語エディタや他の制約を定義することができます。従来のプログラミングに精通していないドメインの専門家が簡単にドメイン固有の用語を使用してドメイン固有言語とMPSで作業することができます。
ブー+ OMeta = Boo.OMeta.Parser
現在パーサが開発中であるが、それはすでに複雑な外部DSLの作成に使用することができます。 OMetaは簡単に字句解析器とパーサーを実装するプログラマを可能にする強力なツールです。ブーの拡張可能なコンパイラパイプライン・アーキテクチャは、Boo.OMeta.Parserと標準Boo.Parserを置き換えることができます。構文のほとんどすべての種類とブーの構文を拡張するために使用することができます。 例では、ここを見つけることができます。
私のプロジェクトメタ#では、この問題を解決しようとしている。
あなたは、DSLを編集友好IDEを作成IDEは完全にグラフィカル行い、.NETオブジェクトへのコンパイル(またはグルー言語としてIronPythonのようなものを使用)してください。
ルールは十分に単純であれば、、あなたがグラフィカルにルール全体構造を実装することができます。 ルールが十分複雑な場合は、「人間の可読性が」不可能な目標になります。
いずれにせよ仲介コードを作成する.NETクラスまたはIronPythonのオブジェクトのセットが十分に「人間が読める」でない場合は、その後、チャンスはある、あなたは文法よりもダミープルーフ何かをしたい。
あなただけのプログラマは、ビジネスルールを作成するために使用する上記のいずれかを使用すること自由に感じ、およびVisual StudioのIDEを必要としない程度の構文は最小限にすることができ、簡単な言語を作成したい場合は、言った。