Zig 0.17.0 ra mắt: Hệ thống build viết lại, trình liên kết ELF mới và bước tiến lớn tới phiên bản 1.0
Zig 0.17.0 vừa được phát hành sau 5 tháng phát triển với 925 commit từ 206 cộng tác viên. Bản cập nhật mang đến hệ thống build được thiết kế lại hoàn toàn cùng Build Server Protocol, trình liên kết ELF mới hỗ trợ biên dịch tăng dần trên x86_64-linux, và nhiều thay đổi quan trọng trong ngôn ngữ như định nghĩa mới của @bitCast.

Zig vừa chính thức phát hành phiên bản 0.17.0, đánh dấu một cột mốc quan trọng trên lộ trình tiến tới phiên bản 1.0 ổn định. Đây là thành quả của 5 tháng làm việc liên tục, với sự đóng góp của 206 cộng tác viên trải qua 925 commit — một chu kỳ phát hành được đánh giá là "đồ sộ hơn dự kiến ban đầu".
Linh vật Zig
Hệ thống build được viết lại toàn diện
Điểm nhấn lớn nhất của bản phát hành này nằm ở hệ thống build (Build System) được tái cấu trúc sâu rộng. Điểm thay đổi mang tính bước ngoặt là việc zig build giờ đây chạy mã build.zig của dự án trong một tiến trình thực thi riêng biệt, tách khỏi tiến trình quản lý gói và thực thi đồ thị build.
Sự tách biệt này mang lại nhiều lợi ích về hiệu năng, đồng thời mở đường cho Build Server Protocol — một giao thức cho phép các công cụ bên thứ ba như IDE theo dõi và điều khiển quá trình build theo thời gian thực.
Cấu trúc cũ với khái niệm "build runner" đã chính thức bị loại bỏ, thay bằng hai thành phần độc lập: configurer và maker. Toàn bộ chức năng quản lý gói cũng được chuyển từ trình biên dịch sang hệ thống build.
Cấu hình giờ đây được tuần tự hóa sang định dạng nhị phân gọn nhẹ, có thể được tiêu thụ bởi công cụ bên thứ ba. Cách tiếp cận cũ là fork build runner không còn được hỗ trợ.
Đáng chú ý, hệ thống cache cũng chuyển sang định dạng nhị phân, giúp tiết kiệm khoảng 25% dung lượng tệp và tăng tốc độ cache hit thêm 5-10%.
Trình liên kết ELF mới và biên dịch tăng dần
Bản phát hành trước đã giới thiệu trình liên kết ELF tự phát triển mới, và ở phiên bản 0.17.0 nó đã đủ trưởng thành để hầu hết dự án Zig nhắm tới x86_64-linux có thể tận dụng tính năng biên dịch tăng dần (incremental compilation) — vốn cho phép xây dựng lại dự án gần như tức thì sau mỗi lần sửa mã.
Để kích hoạt, người dùng chỉ cần thêm tham số vào lệnh build:
zig build -fincremental --watch
Trình liên kết này vẫn chưa đạt được đầy đủ tính năng so với phiên bản cũ và còn tắt mặc định, nhưng đội ngũ Zig kỳ vọng sẽ loại bỏ hoàn toàn trình liên kết ELF cũ trong bản phát hành tiếp theo.
Ngoài ra, hỗ trợ COFF trong trình liên kết cũng được nâng cấp, và toàn bộ quy trình kiểm thử trình liên kết đang chuyển sang phương pháp snapshot-based testing dựa trên so sánh đầu ra objdump cùng việc chạy thực tế các tệp tạo ra.
Ngôn ngữ tiến gần hơn tới 1.0
Kể từ bản 0.16.0, cộng đồng Zig đã thảo luận và đưa ra quyết định về nhiều đề xuất ngôn ngữ — chấp thuận khoảng 25 và từ chối khoảng 125 đề xuất. Hiện vẫn còn 23 đề xuất chưa ngã ngũ trên Codeberg và 61 trên GitHub.
Một trong những thay đổi quan trọng nhất là định nghĩa mới của @bitCast. Theo đó, builtin này sẽ diễn giải lại biểu diễn bit logic của một giá trị dưới dạng kiểu khác, hoàn toàn độc lập với endian của nền tảng đích. Thay đổi này tiềm ẩn khả năng phá vỡ mã nguồn hiện có mà không báo lỗi biên dịch, nên lập trình viên cần rà soát kỹ các chỗ dùng @bitCast với kiểu mảng hoặc vector.
Zig hỗ trợ đa nền tảng
Các thay đổi đáng chú ý khác trong ngôn ngữ bao gồm:
- Thêm builtin
@backingIntvà@fromBackingInt, thay thế cho@intFromEnumvà@enumFromIntđã bị đánh dấu lỗi thời - Loại bỏ
@cImport(đã deprecated từ 0.16.0), chuyển sang góitranslate-cchính thức - Thêm builtin
@SpirvTypecho phép khai báo các kiểu SPIR-V như texture, storage buffer ngay trong mã Zig - Thêm builtin
@divCeilbổ sung cho@divTrunc,@divFloorvà@divExact - Xóa cú pháp nhân mảng
a ** b, thay bằng@splat - Enum rỗng giờ bắt buộc phải có
noreturnlàm kiểu số nguyên nền
Cấp phát bộ nhớ và thư viện chuẩn
Bộ cấp phát gỡ lỗi std.heap.DebugAllocator được thay thế bằng một phiên bản an toàn luồng (thread-safe) với nhiều đảm bảo mạnh mẽ hơn. Mỗi cấp phát đều được đánh dấu bằng một AllocFooter chứa metadata và stack trace, được bảo vệ bằng checksum để phát hiện hỏng hóc bộ nhớ.
StackFallbackAllocator cũng được thiết kế lại với buffer truyền vào dưới dạng tham số, nhất quán với các API khác trong thư viện chuẩn.
Backend và các nền tảng hỗ trợ
- Backend SPIR-V tự phát triển giờ đã đa luồng như các backend khác, sửa 22 lỗi trong chu kỳ này
- Backend WebAssembly đạt 2060/2054 bài kiểm thử hành vi (100%) so với backend LLVM, dù chưa mặc định do thiếu hỗ trợ debug info
- Triển khai ban đầu backend tự phát triển cho loongarch64 đã được đóng góp, tuy còn thử nghiệm
- Nâng cấp lên LLVM 22.1.8, kèm musl 1.2.5, glibc 2.44, header Linux kernel 7.2 và macOS 27.0
Minh họa Zig
Những điểm cần lưu ý
Một số hồi quy (regression) đáng chú ý đã được ghi nhận trong 0.17.0. Đặc biệt, việc tách tiến trình maker và configurer là thay đổi phá vỡ tương thích khiến dự án ZLS (Zig Language Server) hiện chưa hoạt động với phiên bản này. Đội ngũ Zig và ZLS đang phối hợp để khôi phục và mở rộng chức năng thông qua giao thức build server.
Zig cũng thừa nhận vẫn còn tồn tại các lỗi đã biết và hiện tượng biên dịch sai. Với một dự án phi tầm thường dùng Zig 0.17.x, lập trình viên có thể vẫn cần tham gia trực tiếp vào quá trình phát triển của ngôn ngữ.
Khi Zig đạt phiên bản 1.0.0, các nền tảng Tier 1 sẽ có thêm yêu cầu về chính sách lỗi như một điều kiện bắt buộc.
Với những thay đổi mang tính nền tảng này, Zig 0.17.0 cho thấy ngôn ngữ đang tiến những bước vững chắc về phía phiên bản 1.0 — dù người dùng trong nước muốn ứng dụng vào dự án thực tế nên cân nhắc kỹ về mức độ trưởng thành hiện tại và theo dõi sát các bản cập nhật tiếp theo.


