2011-03-31 16 views
29

年前有人問why c# doesn't allow incremental compilation like Java。 El Skeet表示這是關於Java輸出.class文件而不是程序集的。如何能有人做一個像Java一樣的C#增量編譯器?

既然它的2011和Mono編譯器即服務這樣的常識已經發布,那麼需要做些什麼才能爲c#增加一個編譯器呢?

編輯:大家敲打有關如何,這是沒有問題的,這裏離我掛線是從喬恩斯基特報價:

你是在暗示你永遠不會發現自己在等待一個構建?即使15秒 秒?如果構建過程需要15秒鐘,並且您希望在一小時內完成20次(我當然會這麼做),這意味着我正在浪費5分鐘時間。休息5分鐘是一件事 - 這是一個很好的方式 放鬆等 - 但被持續15秒20次可以非常令人沮喪。它不夠長,無法做任何有用的事情(除了 也許喝了一口酒),但它足以刺激。

我懷疑兩個因素促成煩惱的水平,我覺得這 其他人顯然不: 1)TDD真正依靠更快的週轉 2)當與Java在Eclipse中工作,這樣的延遲是非常罕見的

+0

可能是因爲沒有人真的需要它嗎? – Andrey 2011-03-31 15:45:10

+0

人們需要它。相信你我。 – mcintyre321 2011-03-31 15:50:44

+0

爲什麼?請提供一個場景。我想不出任何...這可能意味着,我沒有幻想;-) – 2011-03-31 15:52:34

回答

10

如果沒有完成,那麼只有一個原因:努力做到這一點比可能的好處更高。

微軟肯定不會這樣做,因爲成本太高:.net代碼居住在組件中,沒有人會改變它。是的,程序集會阻止逐類增量編譯。沒有人會停止使用組件。

這裏是我的答案爲什麼沒有人需要它。您可以將構成單個項目的類分佈到多個程序集中並逐個編譯它們。它實際上是漸進式編譯,但並不像逐類漸進式編譯那樣精細。而當你的架構正確設計時,彙編級增量編譯就足夠了。

編輯:好的,我下載了Mono C#編譯器來看看它可以使它增量。我認爲這不是很難。基本上它執行以下步驟:1)解析文件2)編譯3)創建程序集。在編譯完類型之後,你可以掛鉤到某個地方,然後保存到某種中間文件中。然後重新編譯只更改的。所以這是可能的,但對於Mono團隊來說這不是高優先級問題。

編輯2:我發現this interesting thread人們在討論單向C#編譯器的Incremental編譯。這是相當舊的,但關鍵的解釋可能是仍然有效:

樂興和正常解析非常 快,只在代碼被解析的 的大小依賴。語義 分析通常是最花時間 耗時的步驟爲裝載引用 組件和各地的龐大 元數據進行篩選,以解決符號和類型 是真正的編譯器的肉, 還,新的「編譯」的代碼是 「附加」到這個元數據/ AST什麼 增加解決 符號隨時間的複雜性。首先在內存中完成的代碼排列是 ,因此速度很快。 保存到磁盤很慢,但取決於 發出的代碼大小。

對於漸進式編譯,緩存 元,就會使一切非常 快,因爲通常很少會被 從一個編輯改成其他的 。但gmcs將不得不 使 元數據/ AST的部分無效,不構成 的

編輯3:C#編譯器有在1.0和1.1版/incremental選項,但它是removed:在1.0和1.1版的C#的發現

的/增量標誌編譯器現在被認爲已經過時。

編輯4:米格爾奧德伊卡薩給出明確的答案(12)爲什麼單編譯器將不增量:

有很多很多地方 GMCS只是沒有設計在 上編輯和繼續場景。

如果有人想使這個他們 論文題目,那就是我沒意見,但 變化量都在太多的領域太 大。我不想 甚至想打擾他們。

我沒有列出的東西的原因是 ,因爲它們將在編譯器 無處不在。當你試用它們時,你肯定會遇到 ;-)

所以他認爲這是一項比一個人的論文更大的任務。 Mono有更多更出色和更實際的任務。

+1

程序集如何防止按類逐步編譯?在我看來,限制來自工具鏈的設計 - csc.exe輸出完成的程序集,所以沒有單獨的鏈接程序。除了所付出的努力之外,還有什麼可以阻止某人編寫一個C#編譯器來生成那些必須使用單獨的鏈接器打包到程序集中的目標文件? – 2011-03-31 18:28:24

+0

@Sean U實際上有一個:al.exe(http://msdn.microsoft.com/en-us/library/c405shex(VS.80).aspx),但C#編譯器不使用它。 – Andrey 2011-03-31 19:51:13

+1

當然,但正如你所說,Visual Studio附帶的編譯器都不依賴它;他們直接編譯成程序集。我的問題是,是否有任何理由爲什麼csc.exe必須輸出完整的程序集? – 2011-03-31 19:57:57