2016-06-08 64 views
5

這個問題在這裏已經被多次提及過關於解釋型語言或者R的問題,但是我沒有找到任何有關編譯語言的東西,特別是C#。請注意減慢編譯語言嗎?

根據我讀什麼,似乎是微不足道的,但它仍然引起上解釋語言一個非常小的滯後: Do comments slow down an interpreted language?

什麼編譯語言?他們是否只放慢了編譯過程而不是執行?

+7

評論已從編譯的代碼中刪除,它們不能減慢編譯的程序。 – Gar

+1

afaik:nope。評論被編譯器刮掉。另外,請參閱:http://stackoverflow.com/questions/821510/comments-compiled-into-exe-in-net – garglblarg

+2

所有的評論可以做的是放慢編譯器(它應該解析源代碼並剪切註釋關閉)。 –

回答

10

當你編譯程序,編譯器實際上做:

  • 詞法分析(分詞)
  • 語法分析(解析)
  • 語義分析(語言規則檢查)
  • [中級]代碼生成
  • 代碼優化(可選)

至於評論,他們應該是提取作爲詞法分析階段和退出在語法分析(解析)階段。所以你可以減慢編譯器,但不能生成代碼

很多解釋型語言往往先做兩個或三個階段,然後才執行,所以評論不一定減慢甚至解釋型語言

+1

值得注意的是,幾乎所有現代*解釋*語言都是如此。因此即使是解釋型語言也不會看到從註釋中減慢速度(除了解析的第一階段,無論代碼流如何,它只發生一次)。 –

+0

我不會說代碼優化是可選的。每個現代編譯器都有代碼優化。這是編譯非常重要的階段。 –

+0

這是一個主要原因之一,因爲它是否可以爲某些關鍵部分編寫速度更快的彙編代碼值得懷疑,然後編譯器會優化您的常規代碼。 –

4

編譯器有以下幾個階段:

  • 詞法分析
  • 語法分析
  • 語義分析
  • 生成機器無關的代碼
  • 代碼優化
  • 生成最終代碼

詞法分析,註釋被跳過,它基本上就像你沒有寫任何東西。

所以不,他們不會以任何方式影響性能。

+0

評論不會被跳過。每個評論由 替換爲一個空格字符。 – chux

+0

這是不正確的。當正則表達式發現註釋時,Lexer會有空的規則。所以你不要用一個空格字符替換它,這根本就沒有意義。評論被忽略。 –

+1

也許C規範是錯誤的? 「每個評論都被一個空格字符所取代。」 C11dr§5.1.1.23.至於你的「不要用一個空格字符來代替它,那根本就沒有意義」,那麼你提到什麼支持呢? ' -/* abc */- a'與' - -a'相同,而不是'--a'。 – chux

2

評論將從詞法分析階段排除

但如果有註釋代碼詞法分析階段進行解析它可能需要更多的時間進行比較的代碼,而無需評論,但意見不影響執行時間

爲什麼你不試試自己,看看下面的例子,並運行它。

class Program 
{ 
    static void Main(string[] args) 
    { 
     DateTime StartTime; 
     DateTime EndTime; 
     TimeSpan ExecutionTime; 

     StartTime = DateTime.Now; 
     for (int i = 0; i < 10000;) 
     { 
      i++; 
      for (int j = 0; j < 100000;) 
      { 
       j++; 
      } 
     } 
     EndTime = DateTime.Now; 
     ExecutionTime = (EndTime - StartTime); 

     Console.WriteLine("Phase 1 without comment done."); 
     Console.WriteLine("Phase 1 start time : " + StartTime.ToString()); 
     Console.WriteLine("Phase 1 end time : " + EndTime.ToString()); 
     Console.WriteLine("Phase 1 Execution Seconds : " + ExecutionTime.TotalSeconds); 

     Console.WriteLine("\r\n---------------------------------------------\r\n"); 

     StartTime = DateTime.Now; 
     for (int i = 0; i < 10000;) 
     { 
      i++; 
      for (int j = 0; j < 100000;) 
      { 
       j++; 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
       // SOME COMMENT. 
      } 
     } 
     EndTime = DateTime.Now; 
     ExecutionTime = (EndTime - StartTime); 

     Console.WriteLine("Phase 2 with comment done."); 
     Console.WriteLine("Phase 2 start time : " + StartTime.ToString()); 
     Console.WriteLine("Phase 2 end time : " + EndTime.ToString()); 
     Console.WriteLine("Phase 2 Execution Seconds : " + ExecutionTime.TotalSeconds); 

     Console.ReadKey(); 
    } 
} 
0

否編譯器不會減慢程序速度,它會忽略所有註釋並獲取原始代碼。