2010-06-04 44 views
10

在他在NET 5.0(或「未來版本」)中討論的Anders Hejlsberg的.NET 4.0演示文稿中,他們正在研究「編譯器即服務」模型。編譯器即服務有什麼好處

Anders Hejlsberg的狀態:[source] [1] 「我們希望打開我們的編譯器,以便它可以調用編譯一段代碼並獲取表達式樹和/或IL的API。整個場景的主機,例如應用程序可編程性,交互式提示,用戶編寫的重構以及其中嵌入C#島的小島特定語言。「

我很努力地找到真正有用的真實世界示例。我錯過了這裏的主要概念嗎?或者這真的會使語言受益?

[1]:http://www.simple-talk.com/opinion/geek-of-the-week/anders-hejlsberg-geek-of-the-week/編譯器作爲服務

+2

遞歸自修正遺傳算法如何?我只是在附近流行一些流行語?也許。或者,也許我們更接近天網...... – Randolpho 2010-06-23 19:32:32

回答

4

對於一些問題,編寫一個能夠生成解決實際問題的程序的程序會更容易。其中特別有用的一個領域是爲編譯器構建解析器。

在其他情況下,您可以動態生成代碼,以便在使用特定數據類型時提供最佳性能,並通過反映其元數據來了解您在運行時學習的屬性。我可以給你的一個例子是我的Modelshredder項目。它的基本功能是獲取對象的所有字段和屬性,並將它們的值打包到對象數組中。

我對這個問題的第一種方法是使用Reflection.Emit手動編碼MSIL注射。第二種方法更具動態性,依賴於表達式樹,它可以在運行時有效地構建和編譯,以提供與我手動編碼的MSIL注入相同的功能。你可以看到在MoreLinq主幹中實現的功能(只需看一下Modelshredder網站,這裏有一個鏈接)。將編譯器作爲服務實際上允許我提高抽象級別併發出C#代碼,然後將其編譯爲MSIL。

已經提出了域特定語言的情況,同時我認爲像C#這樣的命令式語言並不適合「命令行」場景,而不適用於更大的腳本。 有一個基於F#DSL的整潔make系統,名爲FAKE,它借鑑了編譯器即服務的許多概念。在VisualStudio中,F#交互式窗口使用了類似的概念(它是這種方式嗎?)。

4

如何,這可能是有用的是用於用戶擴展遊戲甲現實世界的例子。大多數現代遊戲允許通過腳本語言(可能相對較慢)或通過需要開發平臺的編譯DLL(以及使用它的知識)來實現某種用戶可擴展性。這將允許用戶使用C#編寫遊戲擴展,這些擴展將在運行時由遊戲編譯,而不需要用戶自己編譯它。它也允許通過在遊戲控制檯窗口中輸入C#代碼來測試新的想法,而不必爲每一個小的改變重新開始遊戲。目前這種類型的東西只有通過嵌入式解釋腳本語言纔可能實現。

+1

不僅僅是遊戲。許多業務邏輯可以嵌入爲原始的C#代碼,如果你想要,你應該能夠在運行時改變它們。 – 2010-06-20 06:53:32

2

我認爲還有一個例子是複製保護。您可以在您的計算機上安裝一段獨特的代碼,在安裝時生成該代碼以將程序綁定到CPU ID。

假設我使用您的序列號作爲納稅計算的參數。該程序的副本很容易做,完全沒用。

0

此外,它使編寫具有類似Linqpad功能的程序非常簡單。

另一個使用案例可以用於使用存儲在數據庫中的源代碼塊,並根據配置調用特定的數據,類似於現在可以調用Workflow Foundation的方式。這可以幫助CRM,ERP和其他數據倉庫應用程序的工作流程自動化(儘管如果濫用,這將構成史詩反托拉斯)。

相關問題