- Các chuyên gia từng chỉ ra rằng việc có "mã có thể chạy tại thời điểm biên dịch" là một "ý tưởng ngớ ngẩn",
Andrew Kelley, người tạo ra Zig, vẫn tiếp tục tiến lên và hiện thực hóa nó
- Vài năm sau, điều này đã trở thành một trong những tính năng nổi bật nhất của Zig
- Trong Zig, thứ được gọi là
comptime là đoạn mã phải được thực thi tại thời điểm biên dịch
- Nhờ khả năng chạy mã Zig ngay trong quá trình biên dịch, nhà phát triển Zig có thể viết mã generic và thực hiện metaprogramming mà không cần hỗ trợ generics/template
2 bình luận
Ngay từ đoạn đầu đã có vấn đề rồi... Trong lĩnh vực ngôn ngữ lập trình, tính toán tại thời điểm biên dịch là một trong những cách hiện thực metaprogramming, thường được gọi là lập trình đa giai đoạn. Hoàn toàn không phải là một ý tưởng ngớ ngẩn.
Những ngôn ngữ như C++ đã "vô tình" hiện thực lập trình đa giai đoạn thì gặp vấn đề là mã ở mỗi giai đoạn (trong trường hợp này là thời gian biên dịch và thời gian chạy) khác nhau một cách đáng kể (C++ giờ đã có
constexpr, nhưng vẫn còn thiếu trước hụt sau). Zig thì ngay từ đầu đã được thiết kế với lập trình đa giai đoạn trong đầu, nên có ưu điểm là có thể dùng gần như cùng một đoạn mã cho thời gian biên dịch và thời gian chạy, đồng thời cũng mang nhược điểm là có khá ít thứ có thể dự đoán được ở thời điểm biên dịch.Tức là.... có thể hiểu là thông qua
unittestkhông thể tránh khỏi, chạy thử trước ở thời điểm biên dịch,để kéo những thứ có thể trở thành lỗi runtime về thành lỗi biên dịch... đại khái là vậy.
Khi xem qua tài liệu hay phần hỏi đáp, việc nó có thể thay thế C theo kiểu drop-in cũng khá hấp dẫn. Khác với Rust, cú pháp cũng đơn giản hơn nên khá ổn. Tất nhiên sẽ không an toàn bằng Rust, nhưng... có cảm giác sẽ bớt đi cái kiểu overengineering mà tôi thường thấy khi dùng Rust. Go cũng hay được nhắc đến như một đối tượng so sánh, nhưng trong những tình huống mà Zig không có runtime thì rõ ràng sẽ đỡ nặng nề hơn. Đặc biệt nếu cần xuống mức thấp hơn, hoặc không phải xử lý quá nhiều request, thì đây có thể là lựa chọn khiến người ta với tay tới nhiều hơn Go...
Vì vậy tôi nghĩ nếu nó định vị tốt ở khoảng giữa Rust và Go, thì biết đâu lại có thể trở thành một lựa chọn khá ổn.