簡體   English   中英

擴展Mono C#編譯器:有沒有任何文檔或先例?

[英]Extending the Mono C# compiler: is there any documentation or precedent?

我目前正在參與一些有趣的編程語言研究,到目前為止,該研究主要圍繞使用一些非常強大的基於程序員生產力的功能擴展即將推出的Java 7.0編譯器。 該工作應同樣適用於相關的編程語言,如C#。

我目前正在尋找原型化C#端口功能的選項。 我更喜歡開源選項,以便可以與最廣泛的受眾分享這項工作的成果。 因此,Mono C#編譯器似乎是最明顯的起點。 我是一位經驗豐富的C#開發人員,所以編寫代碼不是問題。 我主要關心的是以可維護和支持的方式擴展編譯器。 在關於這個主題的單聲道常見問題解答( 鏈接 )中,聲稱“Mono已被用作嘗試C#語言的新思想的基礎(有三個或四個編譯器派生自Mono的C#編譯器)”。 不幸的是,沒有比此更多的指示,到目前為止,谷歌的搜索沒有任何改變。

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

到目前為止,我已經為代碼編寫了一些特別的擴展(主要是在代碼生成器中),但這似乎不是一個可維護的解決方案,特別是考慮到我打算讓我的擴展更新為Git主干單聲道盡可能多。 此外,能夠更新我的擴展,而不必每次進行更改時都重新編譯整個編譯器,這將是很好的。 我希望能夠將我的所有AST操作包裝到一個可以由mcs / gmcs / dmcs動態加載的.NET程序gmcs而不必直接破解核心編譯器代碼。

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

更新(2010年10月23日)

在回答我的問題時,我決定開始研究Mono的一個分支,以便為編譯器創建一個簡單的可擴展性模型。 這是在它的早期階段,但它在GitHub:

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

主要提交是: http//github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01

如果有人有興趣合作這個項目,請告訴我!

不幸的是,我無法充分回答你的問題,但如果你看看Miguel de Icaza博客上的C#擴展示例,你會發現所有這些都采用補丁的形式,而不是插件或擴展。 這似乎表明沒有這樣的API。

請注意,所有這些示例的范圍都比您似乎正在處理的范圍小得多:

這些大多是局部的語法糖,沒有“有趣”的行為。 例如,第四個補丁為IEnumerable實現了Cω的語法糖,但是沒有任何Cω的語義使這個語法變得有趣。 如果你看一下補丁你可以看到它實際上是愚蠢的語法擴展~TIEnumerable<T> ,而不是Cω,其中成員訪問和方法調用在流上正確解除。

微軟研究院的鳳凰編譯器管道曾經被明確地吹捧為這種可擴展性問題的解決方案,但它現在似乎主要集中在代碼生成后端的IR級別上的優化和分析。 事實上,我甚至不確定這個項目是否還活着。

單聲道C#編譯器有點像黑客。 我花了大約一周的時間來弄清楚如何使用解析樹中的信息。 編譯器不會產生任何中間表示,代碼生成可能會破壞部分解析樹。 仍然,解析器和標記器可能對您有用,您只需從那里獲取它。 SharpDevelop還提供了一個C#解析器 SharpDevelop解析器比單聲道C#解析器更容易使用。 如果F#也適合你,我建議。 源代碼比單聲道更清晰,可在開源許可下使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM