2012-04-22 39 views
8

Đánh giá chức năng thời gian biên dịch (CTFE) hoạt động như thế nào? Tôi đang cố gắng hiểu cách trình biên dịch, trong khi nó đang chạy, tạo ra một cái gì đó không tồn tại (ví dụ, một hàm) và thực thi nó. Tôi đã quen với ý tưởng rằng mã nguồn trở thành một tệp nhị phân thông qua trình biên dịch, và sau đó nhị phân được thực hiện. Vì vậy, làm thế nào để một mã nguồn trở thành một cái gì đó có thể thực thi được trong khi trình biên dịch đang chạy và nó có thể chạy nó? Có một chức năng thực sự được tạo ra và chạy, hoặc là nó chỉ là một mô phỏng của một cuộc gọi chức năng?CTFE hoạt động như thế nào?

Trả lời

11

CTFE sử dụng trình thông dịch được tích hợp vào trình biên dịch - giống như những gì bạn mong đợi từ một ngôn ngữ thông dịch như Python. Khi bạn biên dịch một cái gì đó như thế này:

bool not(bool arg) { 
    return !arg; 
} 
void main() { 
    enum compileTime = not(true); // not() called at compile time 
    bool runTime = not(true);  // not() called at runtime 
} 

Trình biên dịch trải qua các giai đoạn thông thường/lexing/phân tích và vv. Khi gặp phải compileTime (hoặc bất kỳ cấu trúc nào khác đòi hỏi một giá trị thời gian biên dịch), nó sẽ cố gắng đánh giá những gì nằm ở phía bên tay phải của biểu thức. Trong trường hợp của một hằng số nó làm những gì bạn mong đợi và lưu trữ một hằng số. Nếu nó gặp một cuộc gọi chức năng, nó sẽ bắt đầu trình thông dịch CTFE. Trong ví dụ đã cho, nó biết các đối số là gì, và những gì các câu lệnh trong hàm làm, nó đi qua từng bước và diễn giải từng đối số. Nếu nó không thể diễn giải câu lệnh tại thời gian biên dịch nó sẽ phát hành một lỗi thời gian biên dịch. Trong ví dụ đơn giản này, nó chỉ phủ nhận tham số, nhưng CTFE có khả năng diễn giải các cấu trúc, các lớp, các vòng lặp và nhiều hơn nữa, được ghi lại ở đây - http://dlang.org/function#interpretation.

+4

Lưu ý rằng tất cả (hoặc hầu hết) trong số đó là một người thực hiện chi tiết tation. Bất kỳ triển khai nào có cùng hiệu ứng cuối cũng sẽ hoạt động. – BCS

1

đây thực chất là hình thức tiên tiến của constant folding nơi trình biên dịch tính toán giá trị được sử dụng để không phải xảy ra khi chạy (các thao tác không thể xảy ra tại thời gian biên dịch (IO, bộ nhớ cấp phát, ...) nó thất bại)

CTFE là đặc biệt ở chỗ nó có thể được thực hiện rõ ràng (bằng cách gán cho một enum ví dụ) và nó sẽ cố gắng để đánh giá hàm do người dùng định nghĩa

trong thực tế điều này có thể thực hiện bằng một thông dịch viên xây dựng trong trình biên dịch

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