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

được phát hành phát hành ngôn ngữ lập trình hệ thống Rỉ 1.38, được thành lập bởi dự án Mozilla. Ngôn ngữ này tập trung vào sự an toàn của bộ nhớ, cung cấp khả năng quản lý bộ nhớ tự động và cung cấp phương tiện để đạt được tính song song của tác vụ cao mà không cần sử dụng trình thu gom rác hoặc thời gian chạy.

Tính năng quản lý bộ nhớ tự động của Rust giải phóng nhà phát triển khỏi thao tác con trỏ và bảo vệ khỏi các vấn đề phát sinh từ thao tác bộ nhớ cấp thấp, chẳng hạn như truy cập bộ nhớ sau khi rảnh, hủy đăng ký con trỏ null, lỗi tràn bộ đệm, v.v. Một trình quản lý gói đang được phát triển để phân phối các thư viện, đảm bảo việc lắp ráp và quản lý các phần phụ thuộc của dự án. Cargo, cho phép bạn lấy các thư viện bạn cần cho chương trình chỉ bằng một cú nhấp chuột. Một kho lưu trữ được hỗ trợ cho các thư viện lưu trữ thùng.io.

Chính đổi mới:

  • Добавлен режим конвейерной компиляции (pipelined), при которой сборка зависимого crate-пакета начинается сразу как только становятся доступны метаданные зависимости, не дожидаясь завершения её компиляции. При компиляции пакета не нужно, чтобы зависимости были собраны полностью, достаточно лишь определения метаданных, включающих списки типов, зависимостей и экспортируемых элементов. Метаданные становятся доступны на начальном этапе компиляции, поэтому связанные пакеты теперь можно начать компилировать гораздо раньше. При сборке одиночных пакетов предложенный режим не сказывается на производительности, но если сборка охватывает пакеты с разветвлёнными зависимостями, общее время сборки может сократиться на 10-20%;
  • Обеспечено выявление некорректного применения функций std::mem::uninitialized и std::mem::zeroed. Например, std::mem::uninitialized удобен для быстрого создания массивов, но вводит компилятор в заблуждение, так как создают видимость выполнения инициализации, а в действительности значение остаётся неинициализированным. Функция mem::uninitialized уже помечена как устаревшая и вместо неё рекомендуется использовать промежуточный тип Có lẽĐơn vị. Что касается mem::zeroed, то данная функция может приводить к проблемам с типам, которые не могут принимать нулевые значения.

    Для выявления вызываемого неопределённого поведения в новом выпуске в компилятор добавлена lint-проверка, выявляющая некоторые проблемы c mem::uninitialized или mem::zeroed. Например, теперь выводится ошибка при попытке использования mem::uninitialized или mem::zeroed с типами &T и Box‹T›, представляющими объекты-указатели, которые не могут принимать нулевые значения;

  • Расширены возможности применения атрибута «#[deprecated]», позволяющего пометить crate-пакеты устаревшими и намеченными для удаления в будущем. Начиная с версии Rust 1.38 данный атрибут также можно применять для макросов;
  • Добавлена возможность применения атрибута «#[global_allocator]» в субмодулях;
  • Đã thêm chức năng std::any::type_name, позволяющая узнать имя типа, что может быть полезно в отладочных целях. Например, в процессе выполнения программы можно узнать для какого типа была вызвана функция:

    fn gen_value‹T: Default>() -› T {
    println!(«Initializing an instance of {}», std::any::type_name::‹T›());
    Default::default()
    }

    fn chính() {
    let _: i32 = gen_value(); # будет выведено «i32»
    let _: String = gen_value(); # будет выведено «alloc::string::String»
    }

  • Các chức năng mở rộng của thư viện tiêu chuẩn:
    • slice::{concat, connect, join} теперь может принимать значение &[T] помимо &T;
    • «*const T» и «*mut T» теперь реализуют marker::Unpin;
    • «Arc‹[T]›» и «Rc‹[T]›» теперь реализуют FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} теперь реализуют DoubleEndedIterator.
    • ascii::EscapeDefault реализует Clone и Display.
  • Một phần API mới đã được chuyển sang danh mục ổn định, bao gồm các phương pháp đã được ổn định
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Duration::as_secs_f{32|64},
    • Duration::div_duration_f{32|64},
    • Duration::div_f{32|64},
    • Duration::from_secs_f{32|64},
    • Duration::mul_f{32|64},
    • операции деления с остатком
      div_euclid и rem_euclid для всех целочисленных примитивов;

  • В пакетный менеджер cargo добавлена поддержка указания опции «—features» несколько раз для включения разных возможностей;
  • В компиляторе обеспечен третий mức độ поддержки для целевых платформ aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc targets, armv7-unknown-linux-gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl и riscv32i-unknown-none-elf. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования и публикации официальных сборок.

Nguồn: opennet.ru

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