6

私はスプレッドシートのようなアプリケーションを構築しています。このアプリケーションでは、多くの小さな計算をツリー構造につなぎ合わせる必要があります。これらの計算はユーザー定義であり、ユーザーが実行時にそれらを入力する方法が必要です。

私の現在のアプローチは、F#で小さな「式DSL」を作成することです。ここでは、FParsecを使用して入力を解析し、識別された共用体に基づいて構文ツリーを構築してから、式を評価できます。これはかなりうまくいきます。

ただし、代わりにDLRに基づいて言語を検討することを考えています。この道を進むことの利点はありますか(入力を解析し、自分の代わりにScripting.ASTのものを使用してASTを生成し、DLRに計算の実行を処理させます)?

それぞれの計算はおそらくかなり小さいでしょう。計算間の依存関係は、より高いレベルで処理されます。

DLRが式のCILコードを生成するので、パフォーマンスが向上することを期待できますか、それともオーバーヘッドがそれを使い果たしますか?

(IronPythonのような既存の言語を使用することに関しては、言語構文に多くのスライスアンドダイス演算子と次元処理のものを追加することを計画しているので、おそらく難しいでしょう)

4

1 に答える 1

7

広い意味での質問にお答えするのは難しいのですが、私の考えをいくつかご紹介します。

F# を使用してパーサーを作成するのは良さそうです。

FSParsec は優れたライブラリです。私は FSLex と FSYacc に偏っています。いずれにせよ、F# には解析用に特別に設計されたライブラリがあり、時間を節約できます。

DLR を使用したコードの生成は問題ないように思えます。

DLR は、動的コード生成のための優れたプラットフォームです。ただし、アプリケーションはより具体的です。値の計算だけに制限している場合は、.NET 3.5 の Expression Trees API を使用する必要があります。この API は、任意のコード式を表すために設計されています。一方、DLR はランタイムまたは動的言語として設計されています。不可能だと言っているのではなく、その仕事に適したツールではないというだけです。

生成されたコードをコンパイルしないでください。

DLR を使用して AST を表す場合、コンパイルと実行のコストは、単にツリーを解釈するよりもはるかに高くなる可能性があります。A.) 同じ関数/メソッドを何度も実行している場合、または B.) 関数/メソッドが非常に複雑な場合は、コードをコンパイルしてください。

C# + DLR、IronPython、F#、または 3 つの組み合わせはすべて適切な選択肢です。最終的に「正しい」選択とは、できるだけ早く仕事を終わらせることです。

于 2009-10-10T17:13:57.073 に答える