Triển khai hàm lúc biên dịch (CTFE)

Trình biên dịch D có khả năng triển khai các hàm trong quá trình biên dịch mã nguồn chương trình. Khả năng này gọi là Compile Time Function Evaluation, viết tắt CTFE.

Thông thường, khi bạn định nghĩa một hàm, hàm đó chỉ được gọi đến và triển khai (thi hành) lúc chương trình đang chạy. D mở rộng khả năng gọi hàm đến thời điểm biên dịch mã nguồn, trước khi chương trình hoạt động.

Khả năng CTFE được kích hoạt không nhờ vào biểu thức đặc biệt nào, mà do trình biên dịch D quyết định dựa trên những giá trị đã được biết lúc biên dịch.

// giá trị căn bậc hai được tính lúc biên dịch
// mã nguồn. Mã máy ứng với mã nguồn sau
// không gồm lệnh gọi hàm nào.
static val = sqrt(50);

Các từ khóa static, immutable hay enum sẽ báo trình biên dịch thử kích hoạt CTFE nếu được. Kỹ thuật này có điểm hay là bạn không cần viết lại mã nguồn của hàm để dùng CTFE:

int n = doSomeRuntimeStuff();
// giống ví dụ đầu, nhưng lần này CTFE
// không gọi hàm nào được, do giá trị n
// chưa có lúc biên dịch
auto val = sqrt(n);

Ví dụ xuất sắc của việc dùng CTFE có trong thư viện std.regex. Kiểu ctRegex dùng mixin chuỗi và CTFE để tự động hóa việc phát sinh và tinh chỉnh các biểu thức chính quy (regular expression) lúc biên dịch mã nguồn của bạn. Phần mã nguồn cơ sở của ctRegex cũng được dùng lại cho regex là phiên bản xử lý các biểu thức chính quy ở lúc chạy chương trình (run-time).

auto ctr = ctRegex!(`^.*/([^/]+)/?$`);
auto tr = regex(`^.*/([^/]+)/?$`);
// ctr và tr có thể dùng như nhau, nhưng ctr
// sẽ nhanh hơn, do hiệu quả của CTFE.

Dù CTFE không thể kích hoạt với mọi thứ trong D, khả năng CTFE của trình biên dịch có xu hướng mở rộng trong các phiên bản về sau.

Nâng cao

rdmd playground.d