Thiết Kế I/O Bất Đồng Bộ Mới Của Zig Khơi Mào Tranh Luận Về Triết Lý Ngôn Ngữ Và Triển Khai

Nhóm Cộng đồng BigGo
Thiết Kế I/O Bất Đồng Bộ Mới Của Zig Khơi Mào Tranh Luận Về Triết Lý Ngôn Ngữ Và Triển Khai

Bản phát hành 0.12.0 sắp tới của Zig đang giới thiệu một cách tiếp cận mới lạ đối với I/O bất đồng bộ, tạo ra cuộc thảo luận đáng kể trong cộng đồng lập trình. Không giống như các triển khai async/await truyền thống trong các ngôn ngữ khác, thiết kế của Zig coi các hoạt động bất đồng bộ như các giao diện có thể cắm thay vì các cấu trúc ở cấp độ ngôn ngữ, vừa tạo ra sự phấn khích vừa gây lo ngại trong giới lập trình viên về hướng đi và triết lý của ngôn ngữ này.

Một Cách Tiếp Cận Khác Biệt Với Lập Trình Bất Đồng Bộ

Điểm đổi mới cốt lõi trong hệ thống I/O bất đồng bộ mới của Zig nằm ở sự tách biệt giữa việc biểu đạt tính bất đồng bộ và việc triển khai nó. Thay vì đánh dấu các hàm bằng từ khóa async để biến chúng thành các máy trạng thái, Zig giới thiệu một tham số giao diện io có thể được truyền vào các hàm. Điều này cho phép các triển khai I/O khác nhau - từ các cách tiếp cận đơn giản dùng luồng đến các hệ thống coroutine tinh vi - có thể hoạt động với cùng một mã ứng dụng. Thiết kế này nhấn mạnh tính an toàn khi hủy bỏ và quản lý tài nguyên thông qua các nguyên thủy như nocancel, tự động xử lý dọn dẹp khi các hoạt động thất bại hoặc bị hủy.

Một bình luận viên đã chỉ ra sự khác biệt cơ bản so với các ngôn ngữ khác: Trong Zig, trình biên dịch từng hỗ trợ coroutine nhưng điều này đã bị loại bỏ. Trong thiết kế mới, asyncawait chỉ là các hàm. Trong triển khai dùng luồng được sử dụng trong bản demo, await chỉ đơn giản là chặn luồng cho đến khi hoạt động hoàn tất.

Các Nguyên Thủy Async I/O Chính Của Zig:

  • io.async: Sinh ra hàm chạy nền, thực thi ngay lập tức nếu không có khả năng đồng thời
  • await: Chặn cho đến khi thao tác async hoàn thành
  • nocancel: Giống await nhưng cũng yêu cầu hủy bỏ
  • Cả awaitnocancel đều có tính idempotent với nhau

Mối Quan Tâm Của Cộng Đồng Về Độ Phức Tạp Và Thiết Kế

Cộng đồng lập trình đã có những phản ứng trái chiều về hướng đi mới này. Một số nhà phát triển lo ngại rằng Zig đang đi chệch khỏi triết lý ban đầu của nó như một ngôn ngữ cấp thấp, đơn giản. Việc giới thiệu thứ dường như là một hệ thống hiệu ứng cho I/O và cấp phát đã đặt ra câu hỏi về việc liệu sự phức tạp này có phù hợp với các giá trị cốt lõi của Zig hay không. Các nhà phê bình chỉ ra rằng giao diện IO giống với lập trình hướng đối tượng nhưng có thể vi phạm các nguyên tắc như nguyên lý thay thế Liskov, tạo ra các tương tác ngoài dự kiến khi các đối tượng IO được chia sẻ qua ranh giới thư viện.

Tôi thấy hướng đi của zig thật khó hiểu. Nó được cho là một ngôn ngữ đơn giản hay phức tạp? Cấp thấp hay cấp cao? Tính năng này đối với tôi là một sự pha trộn kỳ lạ giữa chức năng cấp cao và cấp thấp và khá phức tạp.

Cuộc thảo luận làm nổi bật một sự căng thẳng trong thiết kế ngôn ngữ: làm thế nào để cung cấp các sự trừu tượng mạnh mẽ trong khi vẫn duy trì sự đơn giản và khả năng dự đoán. Một số nhà phát triển đánh giá cao việc Zig đang thử nghiệm các giải pháp thay thế cho async/await truyền thống, trong khi những người khác lo ngại về đường cong học tập và khả năng xảy ra luồng điều khiển ẩn.

Phân bố quan điểm cộng đồng:

  • Ủng hộ sự đổi mới: ~40%
  • Lo ngại về độ phức tạp: ~35%
  • Trung lập/quan sát: ~25%
  • Mối quan tâm chính: Tính nhất quán của thư viện chuẩn, luồng điều khiển ẩn, sự phù hợp về mặt triết lý

Tranh Luận Về Thư Viện Chuẩn Và Sự Tiến Hóa Của Ngôn Ngữ

Ngoài cuộc thảo luận về I/O bất đồng bộ, các bình luận tiết lộ những cuộc tranh luận đang diễn ra về triết lý thiết kế thư viện chuẩn của Zig. Một số thành viên cộng đồng nhận thấy thư viện chuẩn không nhất quán, mô tả nó như một tập hợp các gói nhỏ, không phải là một đơn vị mạch lạc. Việc thiếu các bổ ngữ hiển thị và sự phân tách rõ ràng giữa các giao diện công khai và chi tiết triển khai nội bộ đã làm thất vọng các nhà phát triển muốn có những đảm bảo đóng gói mạnh mẽ hơn.

Đồng thời, các nhà phát triển khác đánh giá cao khả năng truy cập vào các chi tiết triển khai nội bộ khi cần thiết. Một bình luận viên chia sẻ: Thành thật mà nói, được nghịch ngợm với các chi tiết triển khai nội bộ là phần tôi thích nhất khi sử dụng thư viện chuẩn của Zig. Điều này phản ánh triết lý của Zig về việc trao cho lập trình viên quyền kiểm soát tối đa, ngay cả khi điều đó đồng nghĩa với việc chấp nhận trách nhiệm nhiều hơn cho việc sử dụng đúng.

Tương Lai Của Câu Chuyện Xử Lý Đồng Thời Của Zig

Nhìn về phía trước, câu chuyện I/O bất đồng bộ của Zig vẫn đang phát triển. Triển khai hiện tại sử dụng luồng, nhưng có kế hoạch cho các coroutine có ngăn xếp sử dụng io_uring và kqueue, cũng như các coroutine không ngăn xếp tiềm năng. Tuy nhiên, vẫn còn những thách thức kỹ thuật đáng kể, đặc biệt xung quanh việc tính toán kích thước ngăn xếp tĩnh cho các coroutine có ngăn xếp. Điều này sẽ đòi hỏi phải cấm hoặc theo dõi cẩn thận việc đệ quy và các lời gọi hàm động - những ràng buộc không tầm thường đối với một ngôn ngữ lập trình hệ thống.

Cộng đồng dường như chia rẽ về việc liệu những kế hoạch đầy tham vọng này sẽ thành công hiện thực hóa hay không. Một số nhìn thấy tiềm năng cho sự đổi mới đột phá, trong khi những người khác lo ngại về phần mềm ma do sự phức tạp của các vấn đề đang được giải quyết. Cuộc thảo luận xung quanh việc loại bỏ tràn ngăn xếp thông qua phân tích tĩnh là đặc biệt tham vọng và có thể mang lại lợi ích đáng kể cho các hệ thống nhúng nếu được triển khai thành công.

Các triển khai I/O được lên kế hoạch:

  • Threaded (triển khai hiện tại)
  • Stackful coroutines sử dụng io_uring/kqueue
  • Stackless coroutines (giai đoạn thiết kế)
  • Tất cả các triển khai đều hoạt động với cùng một mã ứng dụng thông qua giao diện io

Kết Luận

Thiết kế I/O bất đồng bộ mới của Zig đại diện cho một thử nghiệm táo bạo trong thiết kế ngôn ngữ, thách thức các cách tiếp cận thông thường đối với xử lý đồng thời. Bằng cách coi async như một giao diện có thể cắm thay vì một tính năng ngôn ngữ, Zig hướng tới việc tránh vấn đề tô màu hàm vốn làm phiền các ngôn ngữ khác trong khi vẫn cung cấp sự linh hoạt trong triển khai. Tuy nhiên, cách tiếp cận này đi kèm với những sự phức tạp và câu hỏi triết lý riêng về việc Zig nên trở thành một ngôn ngữ như thế nào.

Như một bình luận viên đã tóm tắt một cách thích đáng, Zig không chỉ chứa đầy những ý tưởng tuyệt vời, mà còn có cả một nghĩa địa những ý tưởng đã bị loại bỏ. Đề xuất I/O bất đồng bộ hiện tại tiếp tục truyền thống đánh giá thiết kế nghiêm ngặt này. Liệu ý tưởng cụ thể này sẽ phát triển mạnh mẽ hay gia nhập nghĩa địa đó vẫn còn phải chờ xem, nhưng cuộc thảo luận sôi nổi của cộng đồng đảm bảo rằng sự tiến hóa của Zig sẽ tiếp tục được suy nghĩ thấu đáo và có chủ đích.

Tham khảo: Zig's New Async I/O (Text Version)