Bản phát hành ngôn ngữ lập trình Rust 1.61

Ngôn ngữ lập trình đa năng Rust 1.61, được thành lập bởi dự án Mozilla nhưng hiện được phát triển dưới sự bảo trợ của tổ chức phi lợi nhuận độc lập Rust Foundation, đã được phát hành. Ngôn ngữ tập trung vào sự an toàn của bộ nhớ và cung cấp phương tiện để đạt được tính song song công việc cao trong khi tránh sử dụng trình thu gom rác và thời gian chạy (thời gian chạy được giảm xuống để khởi tạo và bảo trì cơ bản của thư viện chuẩn).

Các phương pháp xử lý bộ nhớ của Rust cứu nhà phát triển khỏi các lỗi khi thao tác với con trỏ và bảo vệ chống lại các sự cố phát sinh do xử lý bộ nhớ ở mức độ thấp, chẳng hạn như truy cập vùng bộ nhớ sau khi nó được giải phóng, hủy bỏ tham chiếu con trỏ null, tràn bộ đệm, v.v. Để phân phối các thư viện, cung cấp các bản dựng và quản lý các phụ thuộc, dự án phát triển trình quản lý gói Hàng hóa. Kho lưu trữ crates.io được hỗ trợ để lưu trữ thư viện.

An toàn bộ nhớ được cung cấp trong Rust tại thời điểm biên dịch thông qua kiểm tra tham chiếu, theo dõi quyền sở hữu đối tượng, theo dõi thời gian tồn tại của đối tượng (phạm vi) và đánh giá tính chính xác của quyền truy cập bộ nhớ trong quá trình thực thi mã. Rust cũng cung cấp khả năng bảo vệ chống tràn số nguyên, yêu cầu khởi tạo bắt buộc các giá trị biến trước khi sử dụng, xử lý lỗi tốt hơn trong thư viện chuẩn, áp dụng khái niệm tham chiếu và biến bất biến theo mặc định, cung cấp kiểu gõ tĩnh mạnh để giảm thiểu lỗi logic.

Những đổi mới chính:

  • Có thể xác định mã trả về của riêng bạn từ hàm chính. Ban đầu, hàm chính của Rust chỉ có thể trả về kiểu "()" (đơn vị), kiểu này luôn biểu thị trạng thái thoát thành công trừ khi nhà phát triển gọi rõ ràng hàm "process::exit(code)". Trong Rust 1.26, sử dụng Termination trait không ổn định trong hàm main, có thể trả về các giá trị “Ok” và “Err”, tương ứng với mã EXIT_SUCCESS và EXIT_FAILURE trong chương trình C. Trong Rust 1.61, đặc điểm Chấm dứt đã được ổn định và một loại Mã thoát riêng biệt đã được đề xuất để biểu thị một mã trả về cụ thể, mã này trừu tượng hóa các loại trả về dành riêng cho nền tảng bằng cách cung cấp cả hai hằng số được xác định trước THÀNH CÔNG và THẤT BẠI cũng như phương thức Từ để trả lại mã trả lại tùy chỉnh. sử dụng std::process::ExitCode; fn main() -> ExitCode { if !check_foo() { return ExitCode::from(8); } Mã thoát::THÀNH CÔNG }
  • Các khả năng bổ sung của các hàm được xác định bằng biểu thức “const fn” đã được ổn định, có thể được gọi không chỉ như các hàm thông thường mà còn được sử dụng trong bất kỳ ngữ cảnh nào thay vì hằng số. Các hàm này được tính toán tại thời điểm biên dịch chứ không phải trong thời gian chạy, do đó chúng phải tuân theo một số hạn chế nhất định, chẳng hạn như khả năng chỉ đọc từ các hằng số. Trong phiên bản mới, các thao tác cơ bản với con trỏ hàm được phép bên trong các hàm const (được phép tạo, truyền và truyền con trỏ, nhưng không gọi hàm bằng con trỏ); giới hạn đặc điểm cho các tham số chung của hàm const như T: Copy; các đặc điểm có thể điều động linh hoạt (dyn Trait); impl Các loại đặc điểm cho các đối số hàm và giá trị trả về.
  • Luồng xử lý Stdin, Stdout và Stderr trong std::io hiện có thời gian tồn tại tĩnh ("'static") khi bị khóa, cho phép các cấu trúc như "let out = std::io::stdout().lock();" với việc lấy tay cầm và đặt khóa trong một biểu thức.
  • Một phần mới của API đã được chuyển sang danh mục ổn định, bao gồm các phương pháp và cách triển khai các đặc điểm đã được ổn định:
    • Ghim::static_mut
    • Ghim::static_ref
    • Vec::retain_mut
    • VecDeque::retain_mut
    • Viết cho Con trỏ<[u8; N]>
    • std::os::unix::net::SocketAddr::from_pathname
    • std::process::ExitCode
    • std::process::Chấm dứt
    • std::thread::JoinHandle::is_complete
  • Thuộc tính "const", xác định khả năng sử dụng nó trong bất kỳ ngữ cảnh nào thay vì hằng số, được sử dụng trong các hàm:
    • <*const T>::offset và <*mut T>::offset
    • <*const T>::wrapping_offset và <*mut T>::wrapping_offset
    • <*const T>::add và <*mut T>::add
    • <*const T>::sub và <*mut T>::sub
    • <*const T>::wrapping_add và <*mut T>::wrapping_add
    • <*const T>::wrapping_sub và <*mut T>::wrapping_sub
    • <[T]>::as_mut_ptr
    • <[T]>::as_ptr_range
    • <[T]>::as_mut_ptr_range

Ngoài ra, bạn có thể lưu ý bài viết “Rust: A Critical Retrospective” với bản tóm tắt những ấn tượng về ngôn ngữ Rust sau khi viết 100 nghìn dòng mã trong đó trong quá trình phát triển hệ điều hành vi nhân Xous được sử dụng trong phần sụn. Những nhược điểm bao gồm cú pháp khó hiểu, ngôn ngữ chưa hoàn thiện và không ngừng phát triển, thiếu các bản dựng có thể lặp lại, các vấn đề điển hình với sự tin cậy phụ thuộc vào Crates.io và nhu cầu duy trì một kỷ luật nhất định để viết mã an toàn. Các tính năng vượt quá mong đợi bao gồm các công cụ để tái cấu trúc mã và làm lại các “hack” được thêm vào trong quá trình tạo mẫu nhanh.

Nguồn: opennet.ru

Thêm một lời nhận xét