Ngôn ngữ lập trình Zig giới thiệu những thay đổi đột phá lớn với việc đại tu hệ thống I/O mới

Nhóm Cộng đồng BigGo
Ngôn ngữ lập trình Zig giới thiệu những thay đổi đột phá lớn với việc đại tu hệ thống I/O mới

Ngôn ngữ lập trình Zig đã tung ra một loạt thay đổi đột phá đáng kể với bản cập nhật mới nhất, hoàn toàn đại tu hệ thống input/output (I/O) của mình. Thay đổi này, được gọi là Writergate #24329, đại diện cho một trong những sửa đổi quan trọng nhất đối với thư viện chuẩn của ngôn ngữ cho đến nay, gây ra cuộc tranh luận sôi nổi trong cộng đồng phát triển về sự cân bằng giữa đổi mới và ổn định.

Bản cập nhật thay thế tất cả các reader và writer I/O hiện có bằng các phiên bản non-generic mới hứa hẹn hiệu suất và tối ưu hóa tốt hơn. Hệ thống mới di chuyển buffer lên trên vtable, có nghĩa là buffer giờ đây là một phần của interface thay vì implementation. Thay đổi kiến trúc này cho phép tối ưu hóa minh bạch trong khi duy trì các đường dẫn nóng cụ thể cho các thao tác buffer.

Những thay đổi API chính trong bản cập nhật Writergate:

  • std.fs.File.readerstd.fs.File.deprecatedReader
  • std.fs.File.writerstd.fs.File.deprecatedWriter
  • std.fmtstd.fmt.deprecatedFormat
  • std.fmt.fmtSliceEscapeLowerstd.ascii.hexEscape
  • std.fmt.fmtSliceEscapeUpperstd.ascii.hexEscape
  • Thay đổi chữ ký phương thức Format từ anytype.* thành *std.io.Writer
  • Thay đổi xử lý lỗi từ tập hợp lỗi được suy luận thành error(WriteFailed)

Cộng đồng chia rẽ về triết lý thay đổi đột phá

Cộng đồng phát triển vẫn chia rẽ sâu sắc về cách tiếp cận của Zig đối với những thay đổi đột phá thường xuyên. Nhiều nhà phát triển bày tỏ sự thất vọng với nhu cầu liên tục phải cập nhật code của họ, đặc biệt là những người làm việc trên hệ thống nhúng và vi điều khiển nơi tính ổn định là quan trọng. Một số đã hoàn toàn từ bỏ các dự án Zig, viện dẫn gánh nặng bảo trì để theo kịp các thay đổi của ngôn ngữ.

Tuy nhiên, những người ủng hộ lập luận rằng những thay đổi này là cần thiết cho sức khỏe lâu dài của ngôn ngữ. Các công ty như TigerBeetle, sử dụng Zig trong sản xuất, tích cực đón nhận những cập nhật này. Họ xem các thay đổi đột phá như bằng chứng của những quyết định thiết kế chu đáo sẽ có lợi cho ngôn ngữ trong những thập kỷ tới.

Đây chính xác là lý do tại sao chúng tôi chọn Zig. Các quyết định thiết kế của Andrew trong ngôn ngữ luôn hoàn hảo.

Sự chia rẽ này làm nổi bật một căng thẳng cơ bản trong phát triển ngôn ngữ lập trình giữa việc di chuyển nhanh để khắc phục các vấn đề thiết kế và duy trì tính ổn định cho người dùng hiện tại.

Cải tiến kỹ thuật và tính năng mới

Hệ thống I/O mới giới thiệu một số khái niệm sáng tạo không thường thấy trong các ngôn ngữ lập trình khác. Hệ thống bao gồm khái niệm discarding cho việc đọc, cho phép bỏ qua dữ liệu hiệu quả mà không cần xử lý. Đối với việc ghi, nó giới thiệu splatting - một thao tác memset logic có thể truyền qua các pipeline I/O mà không cần sao chép bộ nhớ, có khả năng biến các thao tác O(MN) tốn kém thành các thao tác O(M).

Bản cập nhật cũng thêm khả năng xử lý file mới ghi nhớ thông tin quan trọng về file handle, bao gồm kích thước từ các lệnh gọi stat, vị trí seek hiện tại và trạng thái lỗi. Cách tiếp cận này cung cấp một kiểu cụ thể để truyền thông tin file xung quanh, mà các nhà phát triển báo cáo là đặc biệt hữu ích trong thực tế.

Ghi chú: vtable (virtual table) là một cơ chế được sử dụng trong lập trình để hỗ trợ dynamic dispatch của các lệnh gọi hàm

Các tính năng mới của hệ thống I/O:

  • Thiết kế không generic: Buffer được di chuyển lên trên vtable để tối ưu hóa tốt hơn
  • Khái niệm discarding: Bỏ qua dữ liệu hiệu quả trong quá trình đọc mà không cần xử lý
  • Thao tác splatting: Memset logic truyền qua pipeline I/O mà không cần sao chép bộ nhớ
  • File memoization: Tự động cache kích thước file, vị trí seek và trạng thái lỗi
  • Sao chép trực tiếp fd-to-fd: Hỗ trợ các thao tác kiểu sendfile khi hệ điều hành hỗ trợ
  • Buffer do người dùng cung cấp: Người dùng stream cung cấp buffer trong khi các implementation quyết định kích thước tối thiểu

Mối quan ngại về sử dụng trong sản xuất

Tần suất của các thay đổi đột phá đặt ra câu hỏi về sự sẵn sàng của Zig cho việc sử dụng trong sản xuất. Ngôn ngữ vẫn ở phiên bản 0.14, cho thấy nó chưa đạt được bản phát hành ổn định đầu tiên. Trạng thái pre-1.0 này có nghĩa là các thay đổi đột phá được mong đợi, nhưng phạm vi và tần suất vẫn khiến nhiều nhà phát triển lo ngại.

Một số lập luận rằng các số phiên bản dưới 1.0 đã mất ý nghĩa truyền thống của chúng, chỉ ra các dự án thành công đã duy trì phiên bản 0.x trong thời gian dài. Những người khác cho rằng các mục tiêu 1.0 được ghi chép đầy đủ của Zig biện minh cho sự bất ổn hiện tại, khi ngôn ngữ hướng tới các cột mốc cụ thể bao gồm chức năng async/await.

Rủi ro phân mảnh hệ sinh thái hiện rõ, với các nhà phát triển lo lắng về tình thế tiến thoái lưỡng nan mà các maintainer package phải đối mặt khi họ phải lựa chọn giữa việc hỗ trợ các phiên bản cũ hoặc tiến lên với các thay đổi đột phá.

Nhìn về phía trước

Việc đại tu I/O này đại diện cho một phần của loạt thay đổi lớn hơn dẫn đến việc triển khai async/await của Zig và các mục tiêu I/O as an Interface. Nhóm phát triển đã chỉ ra rằng các thay đổi đột phá bổ sung sẽ theo sau khi họ làm việc thông qua các hệ thống liên quan bao gồm TLS, HTTP, JSON và quản lý package.

Cam kết của nhóm Zig trong việc thiết kế cơ bản đúng đắn trước khi phát hành 1.0 phản ánh tầm nhìn dài hạn của họ cho ngôn ngữ. Liệu cách tiếp cận này cuối cùng sẽ có lợi hay cản trở việc áp dụng vẫn còn phải xem, nhưng rõ ràng là Zig đang ưu tiên sự xuất sắc kỹ thuật hơn các mối quan ngại về tính ổn định ngắn hạn.

Tham khảo: Writergate #24329