2010-10-03 42 views
15

我目前正在參與一些有趣的編程語言研究,到目前爲止,這些研究都圍繞着擴展即將推出的Java 7.0編譯器和一些非常強大的基於程序員生產力的功能。這項工作應該同樣適用於相關的編程語言,例如C#。擴展Mono C#編譯器:是否有任何文檔或先例?

我目前正在爲原型設計C#端口的功能提供選項。我更喜歡開放源代碼選項,以便可以將這項工作的成果與最廣泛的受衆共享。因此,Mono C#編譯器似乎是最明顯的出發點。我是一位經驗豐富的C#開發人員,因此編寫代碼不是問題。我主要關心的是如何以可維護和支持的方式擴展編譯器。在關於這個主題的單聲道常見問題解答(link)中,聲明「Mono已經被用作嘗試C#語言新思路的基礎(有三個或四個編譯器來自Mono的C#編譯器)」。不幸的是,除此之外沒有更多的指標,到目前爲止,谷歌搜索沒有任何改變。

我在想,如果有人有任何關於此的信息。有mcs/gmcs/dmcs是否有標準的可擴展性模型?具體來說,我將在程序的抽象語法樹上執行一些有趣的轉換。是否有標準的機制將功能插入到抽象語法樹生成和類型檢查器之間的編譯器鏈中,然後生成代碼?

到目前爲止,我已經編寫了一些代碼的臨時擴展(主要在代碼生成器中),但這似乎不是一個可維護的解決方案,尤其是考慮到我打算讓我的擴展保持最新Mono的Git主幹儘可能多。此外,如果能夠對我的擴展進行更新,而不必在每次進行更改時都不必重新編譯整個編譯器,那就太好了。我希望能夠將我所有的AST操作封裝到一個單獨的.NET程序集中,該程序集可以通過mcs/gmcs/dmcs動態加載,而無需直接對核心編譯器代碼進行破解。

任何有關擴展Mono C#編譯器的想法或指針都會非常感激!

最新通報(2010年10月23日)

爲響應答覆我的問題,我決定,我將開始以創建編譯器的簡單擴展模型對單的一個分支工作。這是在其早期階段,但在這裏它是在GitHub上:

http://github.com/rcook/mono-extensibility

和主要承諾是:http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01

如果有人有興趣在這個項目上進行合作,請讓我知道!

+1

或者,請查看[Boo](http://boo.codehaus.org/)。編譯器可擴展性是「包」的一部分。 – 2010-10-03 02:37:02

回答

3

不幸的是,我不能充分回答你的問題,但是如果你看一下Miguel de Icaza博客上C#擴展的例子,你會注意到它們全部採用修補程序的形式,而不是插件或擴展。這似乎表明,沒有這樣的API。

注意,所有的這些例子都是比你彷彿更小範圍進行工作:

這些大多是本地化的語法糖,沒有「有趣的」行爲。例如,第四個補丁針對IEnumerable實現了Cω的語法糖,但是沒有任何使語法更有趣的C語義。如果你看看這個補丁,你可以看到它實際上做了愚蠢的語法擴展~TIEnumerable<T>,而不是Cω,其中成員訪問和方法調用被正確提升到流上。

Microsoft Research's Phoenix Compiler Pipeline曾經被明確吹捧爲解決這種可擴展性問題的方法,但它似乎現在主要集中在代碼生成後端的IR級別的優化和分析上。事實上,我甚至不確定這個項目是否還活着。

+2

你可以在這裏找到另一個小補丁(http://evain.net/blog/articles/2010/08/09/a-river-of-t)。也許最好創建一個這些補丁的目錄。 – 2010-10-03 02:38:20

+0

和@Jordão:+1各有用鏈接。爲了共享這裏的鏈接到我的個人博客文章:http://www.clopenset.com/content/instrumenting-il-generation-monos-c-compiler。附加的補丁程序是一種簡單的方法,它允許方法體的檢測,這與我計劃製作的AST /類型檢查程序的修改略有不同,但仍然是一個有趣的實驗。 – 2010-10-03 15:13:03

+0

我已經開始致力於一個可擴展性分支:http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01 – 2010-10-23 23:46:33

3

單聲道C#編譯器有點破解。我花了大約一週的時間弄清楚如何使用分析樹中的信息。編譯器不會產生任何中間表示,代碼生成可能會破壞部分分析樹。 但是,解析器和標記器可能會對您有用,您只需從中取出它。 SharpDevelop還提供C# parser。 SharpDevelop解析器比單聲道C#解析器更易於使用。 如果F#也適合你,我會建議。源代碼比單聲道更清潔,並且可以在開源許可證下使用。

+0

我已經做了一些我自己的黑客攻擊並且同意你的評估。無論如何,我決定分支它:http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01 – 2010-10-23 23:46:56

相關問題