2012-03-23 51 views
3

我在.NET(4.0)上實現了一個小型DSL,並且我正在使用表達式樹來將DSL轉換爲可執行代碼的塊。在.NET上實現DSL

DSL是預定義的,因爲我們正在實現對傳統文件格式的支持。

表達樹是這個工作最適合的工具嗎?

回答

5

如果要生成新類型,則表達式樹無用。對於大多數典型的DSL,你必須建立類型。所以,一個好的舊System.Reflection.Emit可能是一個更好的選擇。

+0

感謝您的回答,@ SK邏輯。請你稍微擴展一下。爲什麼表達式樹「沒有用處,除非想生成新類型」,「Reflection.Emit」將如何更好地服務於我? – 2012-03-23 21:18:41

+0

@GregB,我的意思是相反 - 表達式樹不能用於生成新類型。你只能將它們編譯成代表。想象一下,某種ORM的DSL,它將數據庫映射到對象的層次結構。它必須爲該對象發出類型,並且只能用Reflection.Emit來完成。 – 2012-03-26 15:38:25

1

您可能會看看Boo,更具體地說,它是在Rhino.DSL上構建的。爲了得到Boo帶來的印象,Ayende's posts是一個很好的開局。

一個新的面向對象的靜態類型的編程語言與Python的啓發語法和特別注重語言和編譯器擴展的通用語言基礎:

噓由其inceptors描述。

所以基本上,它是C#的替代品:也是編譯的,但更靈活,可以動態設置新的語言結構。表達樹只是所涉及的一小部分。

通過把Boo放在你的管道中,就像Rhino.DSL一樣,你釋放了很多通用性,甚至不需要臃腫或性能豬(它仍然編譯運行的字節碼)。

如果你看看the unit tests on Rhino.DSL,你會對可能發生的事情有一個快速的印象。

雖然有一點需要注意:所有提到的存儲庫目前都非常不活躍(去年沒有活動),但恕我直言,不會降低其實際使用。

希望這可能會幫助你。