💡 Theo đánh giá của RetroLab, đây là một trong những bản cập nhật quan trọng nhất của Zig kể từ khi ra mắt, đặc biệt là với các cải tiến về tốc độ biên dịch và trải nghiệm nhà phát triển. Đội ngũ RetroLab nhận thấy việc tách biệt configurer và maker trong hệ thống build là một quyết định thiết kế thông minh, hứa hẹn giúp Zig cạnh tranh mạnh mẽ hơn với các ngôn ngữ hệ thống khác.
Trình liên kết ELF mới: Bước tiến vượt bậc về tốc độ biên dịch
Sau nhiều tuần làm việc, Matthew Lugg đã mang đến những cải tiến đáng kể cho trình liên kết ELF mới của Zig – vốn lần đầu xuất hiện trong bản phát hành 0.16.0. Ban đầu, trình liên kết này chỉ hỗ trợ code thuần Zig mà không có thư viện ngoài (kể cả libc), và vẫn bị tắt theo mặc định (có thể kích hoạt bằng cờ -fnew-linker). Nhưng giờ đây, nó đã đủ mạnh để biên dịch chính trình biên dịch Zig với LLVM và LLD – một cột mốc ấn tượng.
Điểm nhấn thực sự là khả năng biên dịch gia tăng (incremental compilation) cực nhanh. Trên x86_64 Linux, sau các cải tiến gần đây, bạn có thể thực hiện rebuild gia tăng khi liên kết với thư viện ngoài, mã nguồn C... mà không phải trả thêm chi phí hiệu năng nào. Kết quả thực tế: từ lần build đầu mất 36 giây, các lần rebuild sau chỉ còn 228–288 mili giây. Dù chưa hỗ trợ thông tin debug DWARF cho Zig (ưu tiên tiếp theo của Lugg), nhưng khả năng rebuild tức thì đã thay đổi hoàn toàn trải nghiệm phát triển, đặc biệt khi debug bằng in ấn.
Hệ thống build được tái cấu trúc: Nhanh hơn tới 90%
Andrew Kelley vừa hợp nhất một nhánh lớn, tách quy trình configurer (cấu hình) và maker (thực thi) trong hệ thống build. Trước đây, file build.zig và toàn bộ hệ thống build được biên dịch chung thành một tiến trình phình to ở chế độ Debug. Giờ đây, logic của build.zig được biên dịch thành một tiến trình nhỏ (configurer) ở chế độ debug, sau đó tuần tự hóa thành file cấu hình nhị phân. Tiến trình zig build cha sẽ cache file này, đồng thời biên dịch bất đồng bộ tiến trình thực thi (maker) ở chế độ release. Maker chỉ cần biên dịch một lần cho mỗi phiên bản Zig nhờ global cache.
Kết quả là hiệu năng tăng vọt. Benchmark cho thấy thời gian chạy zig build --help giảm từ 150ms xuống chỉ còn 14.3ms (giảm 90.4%), số chu kỳ CPU giảm 95.9%, và số lệnh giảm 95.6%. Sự cải thiện này đến từ việc không còn phải thực thi lại logic build.zig mỗi lần chạy lệnh – hệ thống dùng cấu hình đã cache.
Thay đổi này cũng mở ra lợi ích cho các công cụ bên thứ ba như ZLS (Zig Language Server), khi chúng có thể đọc file cấu hình tuần tự hóa thay vì phải fork build runner. Tuy nhiên, có một số thay đổi nhỏ gây breaking: ví dụ, run_cmd.addArgs(args) được thay bằng run_cmd.addPassthruArgs(), nghĩa là build script không còn quan sát được các đối số đó nữa, nhưng đổi lại không cần rebuild khi thay đổi đối số.
Biên dịch gia tăng với LLVM backend
Matthew Lugg cũng mang incremental compilation lên LLVM codegen backend. Dù không thể tăng tốc phần “LLVM Emit Object” (vốn phụ thuộc hoàn toàn vào LLVM), nhưng incremental compilation giúp giảm thời gian xử lý trong code của Zig compiler. Điều này có nghĩa là nếu code của bạn có lỗi biên dịch (khi đó “LLVM Emit Object” bị bỏ qua), bạn sẽ nhận được thông báo lỗi trong mili giây thay vì vài giây. Tính năng này đã có trên master branch và sẽ xuất hiện trong bản phát hành 0.16.0 sắp tới.
Thiết kế lại type resolution: Loại bỏ lỗi vòng lặp phụ thuộc và cải thiện incremental compilation
Một PR khổng lồ 30.000 dòng đã được hợp nhất, tái cấu trúc hoàn toàn logic giải quyết kiểu (type resolution) bên trong trình biên dịch Zig. Kết quả là trình biên dịch trở nên “lười” hơn: nếu một kiểu không bao giờ được khởi tạo, Zig sẽ không phân tích các trường của nó. Ví dụ, khi dùng std.Io.Writer làm namespace, compiler không kéo theo toàn bộ code trong std.Io.
Điểm đáng chú ý nhất là cải thiện trải nghiệm khi gặp lỗi vòng lặp phụ thuộc (dependency loop). Trước đây, thông báo lỗi hoàn toàn vô dụng; giờ đây, bạn sẽ nhận được một thông báo chi tiết chỉ rõ vị trí và nguyên nhân của vòng lặp, giúp dễ dàng sửa lỗi. Ngoài ra, PR này cũng sửa hàng loạt bug liên quan đến incremental compilation, đặc biệt là vấn đề “over-analysis” – nơi bản cập nhật gia tăng làm nhiều việc hơn cần thiết. Giờ đây, incremental compilation nhanh hơn đáng kể trong nhiều trường hợp.
std.Io.Evented: io_uring và Grand Central Dispatch chính thức có mặt
Khi chu kỳ phát hành 0.16.0 đi đến hồi kết, Jacob đã cập nhật std.Io.Evented để tương thích với các thay đổi API mới nhất. Cả hai nền tảng io_uring (Linux) và Grand Central Dispatch (macOS/iOS) đều dựa trên cơ chế chuyển đổi ngăn xếp người dùng (user-space stack switching), hay còn gọi là “fibers”, “stackful coroutines” hoặc “green threads”.
Hiện tại, các implementation này có thể dùng thử bằng cách xây dựng ứng dụng với std.Io.Evented. Tuy nhiên, chúng vẫn đang ở giai đoạn thử nghiệm, cần cải thiện xử lý lỗi, loại bỏ logging, chẩn đoán suy giảm hiệu năng bất ngờ khi dùng IoMode.evented cho compiler, và tăng độ phủ kiểm thử. Dù vậy, đây là bước tiến quan trọng: code Zig có thể hoán đổi implementation I/O một cách dễ dàng, như minh họa dưới đây với hai đoạn code gần như giống hệt nhau, chỉ khác ở cách khởi tạo std.Io.
Quản lý package được nâng cấp: Lưu trữ cục bộ và cờ --fork
Hai cải tiến lớn trong quản lý package:
- Thư mục zig-pkg: Các package đã tải về giờ được lưu trong thư mục zig-pkg tại thư mục gốc của dự án (cạnh file build.zig). Điều này giúp bạn dễ dàng chỉnh sửa, grep, hoặc chạy baobab trên cây phụ thuộc. Đồng thời, bản sao toàn cục được nén lại, tạo điều kiện cho tính năng chia sẻ ngang hàng (peer-to-peer torrent) trong tương lai.
- Cờ --fork: Thêm flag zig build --fork=[path] cho phép ghi đè tạm thời toàn bộ package trong cây phụ thuộc bằng một bản fork cục bộ. Đây là cách tuyệt vời để thử nghiệm sửa lỗi từ upstream mà không cần thay đổi build.zig.zon. Khi bỏ flag, bạn quay lại dùng package sạch.
Bypass Kernel32.dll: Zig chọn Native API thay vì Win32
Andrew Kelley giải thích lý do Zig ưu tiên gọi trực tiếp ntdll.dll thay vì kernel32.dll: các API cấp thấp (ntdll) thường được thiết kế tốt hơn, tránh được các cấp phát heap không cần thiết, giảm failure mode và bloat. Hai ví dụ điển hình:
- Entropy (ngẫu nhiên): Windows không có cách đơn giản để lấy byte ngẫu nhiên. Nhiều dự án gọi SystemFunction036 từ advapi32.dll, nhưng từ Windows 8, hàm này tải bcryptprimitives.dll và gọi ProcessPrng – có thể thất bại (lỗi 38) nếu hệ thống quá tải, dù được cho là không bao giờ lỗi. Zig bỏ qua lớp trung gian, gọi trực tiếp NtOpenFile và NtDeviceIoControlFile để đọc seed từ thiết bị CNG, tránh phụ thuộc vào bcryptprimitives và advapi32.
- Đọc/ghi file: ReadFile của kernel32 che giấu mã lỗi, yêu cầu gọi GetLastError. NtReadFile của ntdll trả về mã lỗi trực tiếp. Ngoài ra, kernel32 dùng events cho I/O bất đồng bộ, trong khi Zig dùng APC routine kết hợp NtDelayExecution, tích hợp liền mạch với hủy bỏ tác vụ.
zig libc: Tiến tới loại bỏ hoàn toàn mã nguồn C vendored
Dự án con zig libc đang dần thay thế các file nguồn C vendored bằng wrapper Zig trong thư viện chuẩn. Khoảng 250 file C đã bị xóa khỏi repository Zig, còn 2032 file. Mỗi hàm chuyển đổi giúp Zig độc lập hơn với C và các dự án bên thứ ba, cải thiện tốc độ biên dịch, giảm kích thước cài đặt và kích thước binary khi liên kết tĩnh libc.
Đặc biệt, giờ đây các hàm libc được xuất từ Zig Compilation Unit (ZCU) thay vì là một static archive riêng. Điều này cho phép tối ưu hóa liên hàm giống LTO nhưng được thực hiện ngay ở frontend. Khi kết hợp với các thay đổi std.Io, trong tương lai, người dùng có thể kiểm soát cách libc thực hiện I/O – ví dụ buộc mọi lời gọi read và write tham gia vào vòng lặp sự kiện io_uring.
Kết luận
Zig 0.17.0 đang đến rất gần (dự kiến trong vài tuần tới). Với hàng loạt cải tiến từ trình liên kết ELF mới, hệ thống build nhanh hơn 90%, incremental compilation ổn định hơn, type resolution thông minh hơn, và những bước tiến về I/O không đồng bộ cũng như quản lý package, đây hứa hẹn là một bản phát hành đáng chờ đợi. Nếu bạn đang dùng master branch, hãy thử ngay incremental compilation với -fincremental --watch và báo cáo bug nếu gặp. Cộng đồng Zig đang trên đường đến “miền đất hứa” – nơi code Zig có thể hoán đổi implementation I/O một cách dễ dàng và libc không còn là gánh nặng.
Nguồn: Hacker News - https://ziglang.org/devlog/2026/#2026-05-26






