2016-06-08 53 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

否编译器不会减慢程序速度,它会忽略所有注释并获取原始代码。