2016-06-08 16 views
5

Câu hỏi này đã được hỏi nhiều lần ở đây về ngôn ngữ diễn giải hoặc R nhưng tôi không tìm thấy bất kỳ điều gì về ngôn ngữ được biên dịch, cụ thể là C#.Các bình luận có làm chậm một ngôn ngữ được biên dịch không?

Theo những gì tôi đọc nó có vẻ là không đáng kể nhưng nó vẫn gây ra một rất ít retard trên ngôn ngữ giải thích: Do comments slow down an interpreted language?

gì về ngôn ngữ biên soạn ?! họ có làm chậm quá trình biên dịch nhưng không thực hiện?

+7

Nhận xét bị tước khỏi mã được biên dịch, chúng không thể làm chậm chương trình đã biên dịch của bạn. – Gar

+1

afaik: không. ý kiến ​​nhận được cạo bởi trình biên dịch. Ngoài ra, xem: http://stackoverflow.com/questions/821510/comments-compiled-into-exe-in-net – garglblarg

+2

Tất cả các ý kiến ​​có thể làm là làm chậm trình biên dịch (nó sẽ phân tích cú pháp mã nguồn và cắt các bình luận tắt). –

Trả lời

10

Khi bạn biên dịch chương trình, trình biên dịch thực hiện:

  • Lexical Analysis (tokenization)
  • Phân tích cú pháp (phân tích)
  • Semantic Analysis (quy tắc ngôn ngữ kiểm tra)
  • [Intermediate] Code Generation
  • Tối ưu hóa mã (tùy chọn)

Đối với các nhận xét, chúng phải được trích xuất làm mã thông báo trên giai đoạn Phân tích Lexical và bỏ qua trên giai đoạn Phân tích cú pháp (phân tích cú pháp). Vì vậy, bạn có thể làm chậm trình biên dịch , chứ không phải mã được tạo.

Nhiều giải thích ngôn ngữ thường làm đầu tiên hai hoặc ba giai đoạn và chỉ sau đó thực hiện, vì vậy comments không nhất thiết làm chậm thậm chí giải thích ngôn ngữ.

+1

Điều đáng lưu ý là điều này cũng đúng với hầu hết các ngôn ngữ * diễn giải * hiện đại. Vì vậy, ngay cả các ngôn ngữ diễn giải cũng sẽ không thấy chậm từ nhận xét (ngoại trừ trong giai đoạn phân tích đầu tiên, bất kể dòng mã nào, chỉ xảy ra một lần). –

+0

Tôi sẽ không nói tối ưu hóa mã là tùy chọn. Mỗi trình biên dịch hiện đại đều có tối ưu hóa mã. Đây là giai đoạn biên dịch rất quan trọng. –

+0

Đó là một trong những lý do chính tại sao nó là vấn đề cho dù bạn có thể viết mã Assembler nhanh hơn cho một số phần quan trọng sau đó trình biên dịch sẽ tối ưu hóa mã thường xuyên của bạn. –

4

Trình biên dịch có những giai đoạn:

  • từ vựng phân tích phân tích
  • Cú pháp
  • phân tích ngữ nghĩa
  • Tạo máy mã độc lập
  • Mã tối ưu hóa
  • Tạo mã cuối cùng

Trong Phân tích Lexical, nhận xét bị bỏ qua, về cơ bản giống như bạn không viết gì cả.

Vì vậy, không, chúng không ảnh hưởng đến hiệu suất theo bất kỳ cách nào.

+0

Nhận xét không bị bỏ qua. Mỗi nhận xét được thay thế bằng một ký tự khoảng trắng. – chux

+0

Điều đó không đúng. Lexer sẽ có quy tắc trống khi biểu thức chính quy cho bình luận được tìm thấy. Vì vậy, bạn không thay thế nó bằng một ký tự không gian, mà chỉ đơn giản là không có điểm. Nhận xét chỉ bị bỏ qua. –

+1

Có lẽ thông số C sai? "Mỗi nhận xét được thay thế bằng một ký tự khoảng trắng". C11dr §5.1.1.2 3. Khi bạn "không thay thế nó bằng một ký tự khoảng trắng, điều đó đơn giản là không có điểm", tham khảo của bạn là gì để hỗ trợ điều đó? '-/* abc */- a' giống với' - -a', không phải '--a'. – chux

2

Comment sẽ được loại trừ từ phân tích từ vựng giai đoạn

nhưng nếu mã với ý kiến ​​được phân tích trong từ vựng phân tích giai đoạn nó có thể mất nhiều thời gian hơn so sánh như mã mà không bình luận nhưng bình luận không ảnh hưởng đến thực hiện thời gian

Tại sao bạn không tự mình thử, hãy xem ví dụ bên dưới và chạy nó.

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

Không trình biên dịch không làm chậm chương trình, nó bỏ qua tất cả nhận xét và lấy mã thô.

Các vấn đề liên quan