Thiết Kế Async I/O Mới Của Zig Gây Tranh Cãi Về Tuyên Bố Function Coloring

Nhóm Cộng đồng BigGo
Thiết Kế Async I/O Mới Của Zig Gây Tranh Cãi Về Tuyên Bố Function Coloring

Đội ngũ phát triển Zig đã công bố một thiết kế lại lớn cho hệ thống async I/O của họ, tuyên bố đã hoàn toàn giải quyết được vấn đề function coloring - một khẳng định gây tranh cãi đã châm ngòi cho những cuộc thảo luận sôi nổi trong cộng đồng lập trình. Cách tiếp cận mới giới thiệu một giao diện Io thống nhất nhằm giải quyết vấn đề lâu nay của tính lan truyền của async function đồng thời hỗ trợ nhiều mô hình thực thi.

Tranh Cãi Về Function Coloring

Tuyên bố táo bạo của đội ngũ Zig đã gặp phải sự phản đối đáng kể từ các nhà phát triển, những người cho rằng vấn đề cơ bản vẫn chưa được giải quyết. Các nhà phê bình chỉ ra rằng mặc dù Zig đã loại bỏ các từ khóa async/await rõ ràng, các function hiện được chia thành những function yêu cầu tham số Io và những function không cần - về cơ bản tạo ra một hình thức coloring mới.

Một nhà phát triển lưu ý rằng năm quy tắc từ bài viết blog nổi tiếng What Color is Your Function? vẫn phần lớn áp dụng cho hệ thống mới của Zig. Các function thực hiện các thao tác I/O vẫn phải được gọi theo cách khác, chỉ có thể được gọi từ các function khác có khả năng I/O, và yêu cầu ngữ cảnh bổ sung để hoạt động đúng cách. Sự khác biệt chính là ngữ cảnh này hiện được truyền như một tham số rõ ràng thay vì được tích hợp vào cú pháp ngôn ngữ.

Tuy nhiên, những người ủng hộ cho rằng cách tiếp cận này mang lại những lợi thế thực sự so với các hệ thống async truyền thống. Không giống như các ngôn ngữ mà async function bị khóa vĩnh viễn vào một mô hình thực thi cụ thể, giao diện Io của Zig cho phép cùng một đoạn code hoạt động với blocking I/O, thread pool, green thread, hoặc stackless coroutine tùy thuộc vào việc triển khai được chọn tại runtime.

Nhiều Mô Hình Thực Thi Dưới Một Giao Diện

Thiết kế mới hỗ trợ một số triển khai I/O khác nhau, mỗi cái có những đánh đổi riêng biệt. Triển khai blocking đơn giản nhất ánh xạ trực tiếp đến các system call truyền thống với overhead tối thiểu. Triển khai thread pool sử dụng các thao tác blocking trên nhiều OS thread để có tính song song. Green thread tận dụng các API hệ thống như io_uring trên Linux, mặc dù cách tiếp cận này yêu cầu khả năng stack swapping sẽ không hoạt động trên các nền tảng như WebAssembly.

Triển khai đầy tham vọng nhất liên quan đến stackless coroutine chuyển đổi thân function thành state machine. Cách tiếp cận này hứa hẹn tương thích với WebAssembly và các môi trường hạn chế khác, nhưng nó phụ thuộc vào các tối ưu hóa compiler chưa được triển khai đầy đủ.

Các Tùy Chọn Triển Khai I/O của Zig:

  • Blocking I/O: Ánh xạ trực tiếp tới các system call với overhead tối thiểu
  • Thread Pool: Các thao tác blocking được ghép kênh qua các OS thread
  • Green Threads: Sử dụng io_uring ( Linux ) với stack swapping, không tương thích với WebAssembly
  • Stackless Coroutines: Chuyển đổi state machine, tương thích với WebAssembly (đang được lên kế hoạch)

Mối Quan Ngại Về Hiệu Suất Và Tối Ưu Hóa

Việc sử dụng runtime polymorphism thông qua virtual function call đã làm dấy lên lo ngại trong số các nhà phát triển quan tâm đến hiệu suất. Một số người đặt câu hỏi liệu một ngôn ngữ hệ thống có nên áp đặt overhead này lên các thao tác I/O cơ bản hay không, ngay cả khi chi phí thường không đáng kể so với độ trễ I/O thực tế.

Các nhà phát triển Zig phản bác rằng mô hình single-compilation-unit của họ cho phép devirtualization được đảm bảo khi chỉ một triển khai Io được sử dụng trong toàn bộ chương trình. Tối ưu hóa này loại bỏ overhead của virtual call trong hầu hết các tình huống thực tế trong khi vẫn bảo tồn tính linh hoạt của thiết kế giao diện.

Cộng đồng vẫn chia rẽ về việc liệu green thread có đại diện cho một bước lùi hay không, xét rằng các ngôn ngữ khác như Rust đã loại bỏ các tính năng tương tự do lo ngại về hiệu suất. Quyết định của đội ngũ Zig hỗ trợ nhiều mô hình đồng thời dường như là một cách phòng ngừa trường hợp bất kỳ cách tiếp cận đơn lẻ nào chứng minh không đầy đủ.

Ý Nghĩa Thực Tế Đối Với Các Nhà Phát Triển

Bất chấp các cuộc tranh luận lý thuyết, nhiều nhà phát triển đánh giá cao những lợi ích thực tế của khả năng tái sử dụng code mà hệ thống mới mang lại. Các thư viện được viết dựa trên giao diện Io có thể hoạt động liền mạch với bất kỳ mô hình thực thi nào, loại bỏ nhu cầu duy trì các phiên bản sync và async riêng biệt của cùng một chức năng.

Việc truyền tham số rõ ràng, mặc dù thêm một số overhead về cú pháp, cung cấp khả năng hiển thị rõ ràng về những phần nào của codebase thực hiện các thao tác I/O. Tính minh bạch này phù hợp với triết lý của Zig là làm cho hành vi hệ thống trở nên rõ ràng thay vì ẩn nó đằng sau các abstraction ngôn ngữ.

Khi Zig tiếp tục hướng tới bản phát hành 1.0, việc thiết kế lại này đại diện cho một cược lớn vào cách tiếp cận thống nhất đối với I/O và concurrency. Liệu nó có thực sự giải quyết function coloring hay chỉ đơn giản đóng gói lại vấn đề theo một hình thức dễ chấp nhận hơn vẫn còn phải xem khi các nhà phát triển có được trải nghiệm thực tế với hệ thống mới.

Tham khảo: Zig's New Async I/O