Phát hành ngôn ngữ lập trình Rust 1.59 có hỗ trợ chèn lắp ráp

Ngôn ngữ lập trình đa năng Rust 1.59, đượ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ể sử dụng tính năng chèn ngôn ngữ hợp ngữ, vốn đang được yêu cầu trong các ứng dụng cần kiểm soát việc thực thi ở mức độ thấp hoặc có thể sử dụng các hướng dẫn máy chuyên dụng. Các phần chèn lắp ráp được thêm vào bằng macro "asm!" và "global_asm!" sử dụng cú pháp định dạng chuỗi để đặt tên các thanh ghi tương tự như cú pháp được sử dụng để thay thế chuỗi trong Rust. Trình biên dịch hỗ trợ các hướng dẫn lắp ráp cho các kiến ​​trúc x86, x86-64, ARM, AArch64 và RISC-V. Ví dụ về chèn: sử dụng std::arch::asm; // Nhân x với 6 bằng cách sử dụng shift và cộng let mut x: u64 = 4; không an toàn { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "thêm {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } khẳng định_eq!(x, 4 * 6);
  • Đã thêm hỗ trợ cho các bài tập bị hủy cấu trúc (song song), trong đó một số đặc điểm, lát cắt hoặc cấu trúc được chỉ định ở phía bên trái của biểu thức. Ví dụ: let(a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Cấu trúc { e, .. } = Cấu trúc { e: 5, f: 3 }; khẳng định_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Có thể chỉ định giá trị mặc định cho generics const: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Trình quản lý gói Hàng hóa đưa ra cảnh báo về việc sử dụng các cấu trúc không hợp lệ trong các phần phụ thuộc được xử lý do lỗi trong trình biên dịch (ví dụ: do lỗi, các trường của cấu trúc đóng gói được phép mượn trong các khối an toàn). Các cấu trúc như vậy sẽ không còn được hỗ trợ trong phiên bản Rust trong tương lai.
  • Cargo và Rustc có khả năng tích hợp để tạo các tệp thực thi được loại bỏ dữ liệu gỡ lỗi (strip = "debuginfo") và ký hiệu (strip = "symbols") mà không cần gọi một tiện ích riêng. Cài đặt làm sạch được triển khai thông qua tham số “strip” trong Cargo.toml: [profile.release] Strip = “debuginfo”, “symbols”
  • Biên dịch tăng dần bị tắt theo mặc định. Nguyên nhân được cho là cách giải quyết tạm thời một lỗi trong trình biên dịch dẫn đến treo máy và lỗi deserialization. Bản sửa lỗi đã được chuẩn bị và sẽ được đưa vào phiên bản tiếp theo. Để trả về quá trình biên dịch gia tăng, bạn có thể sử dụng biến môi trường RUSTC_FORCE_INCREMENTAL=1.
  • 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:
    • std::thread::available_parallelism
    • Kết quả::đã sao chép
    • Kết quả::nhân bản
    • vòm::asm!
    • vòm::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom cho u8
    • char::TryFromCharError (Bản sao, Gỡ lỗi, Hiển thị, PartialEq, Sao chép, Eq, Lỗi)
    • lặp::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • DoubleEndedIterator cho cấu trúc ToLowercase
    • DoubleEndedIterator cho cấu trúc ToUppercase
    • TryFrom cho [T; N]
    • UnwindSafe cho cấu trúc Một lần
    • RefUnwindAn toàn một lần
    • Các chức năng hỗ trợ neon của armv8 được tích hợp trong trình biên dịch cho aarch64
  • 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:
    • mem::Có lẽUninit::as_ptr
    • mem::Có lẽUninit::assume_init
    • mem::Có lẽUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Nguồn: opennet.ru

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