2009-10-10 5 views
6

E-tablo benzeri bir uygulama yapıyorum, burada bir çok küçük hesaplamanın bir ağaç yapısında birleştirilmesi gerekiyor. Bu hesaplamalar kullanıcı tanımlıdır ve kullanıcının çalışma zamanında bunları girmesi için bir yola ihtiyacım var.DLR'de küçük bir ifade DSL'i temel alın veya F # 'da elden bırakmayın.

Şu anki yaklaşımım, F # içinde küçük bir "ifade DSL" yazmaktır; burada, FParsec ile girdiyi ayrıştırıyorum, ayrıştırılmış bir kaynağa dayalı bir sözdizimi ağacı oluşturun ve sonra ifadeyi değerlendirebilirsiniz. Bu oldukça iyi çalışıyor. Ancak, bunun yerine DLR'deki dili temel almayı düşünüyorum. Bu yola devam etmek için herhangi bir yol var mı? (Girdiyi ayrıştırın, AST'yi kendi başıma Scripting.AST kullanarak üretin ve DLR'nin hesaplamayı yürütmesine izin verin)?

Her hesaplama muhtemelen oldukça küçük olacaktır. Hesaplamalar arasındaki bağımlılık daha üst düzeyde ele alınacaktır.

DLR, ifade için CIL kodu üreteceğinden veya bunun üstünü yiyeceğinden daha iyi bir performans bekleyebilir miyim? Bu var

cevap

7

(ı dil sözdizimi dilim-ve-zar operatörleri ve boyut işleme bir sürü şey eklemek planlıyorum beri IronPython gibi mevcut bir dili kullanarak gelince, muhtemelen zor olacak) Bu kadar geniş anlamda bir soruyu cevaplamak zor, ama burada bazı düşüncelerim var.

Ayrıştırıcıyı oluşturmak için F # tuşlarını kullanın.

FSParsec harika bir kütüphanedir. FSLex ve FSYacc'e karşı biraz kısayım. Her iki durumda da, F # 'da ayrıştırma için özel olarak tasarlanmış kütüphaneler vardır.

DLR sesleriyle kod üretme Tamam.

DLR, dinamik kod üretimi için harika bir platformdur. Bununla birlikte, uygulamanız çok daha spesifiktir. Kendinizi sadece bilgi işlem değerleriyle sınırlıyorsanız, .NET 3.5'ten İfade Ağaçları API'larını kullanmalısınız. Bu API, keyfi kod ifadelerini temsil etmek için tasarlanmıştır. Diğer taraftan DLR, çalışma zamanı veya dinamik dil olarak tasarlanmıştır. Bunun imkansız olduğunu söylemiyorum, sadece iş için doğru bir araç değil.

Oluşturulan kodunuzu derleme.

AST'nizi temsil etmek için DLR ile devam ederseniz, derleme ve yürütme maliyeti büyük olasılıkla ağacı yorumlamaktan çok daha büyük olacaktır. Kodu derleyin: A.) Aynı işlevi/yöntemi birçok kez veya B çalıştırıyorsanız) işlev/yöntem çok karmaşıktır.

C# + DLR, IronPython, F #, ya da üçünün bazı kombinasyonu tüm ses seçeneklerdir. Nihayetinde 'doğru' seçim, işi mümkün olduğunca hızlı bir şekilde gerçekleştiren seçenektir.

+1

Analizleriniz için teşekkür ederiz. Linq ifade ağaçlarını tamamen gözden kaçırdım. Bu API'yi kullanarak ağaçları oluşturmak için ayrıştırıcımı değiştirmeye çalışacağım ve şimdi F # içinde yaptığım saf yorumlama/değerlendirme ile karşılaştırmak için değerlendirmelerine ilişkin bazı performans testleri gerçekleştireceğim. – Rickard

+1

F # Tekliflerini kullanabileceğinizi ve FSharp.PowerPack.Linq kitaplığında F # Quotation ifadesini bir LINQ İfade Ağacına dönüştürebileceğinizi unutmayın.Bununla ilgili bir sürü doküman yok, ancak ilginizi çekebilir. –

İlgili konular