Выпуск языка программирования Rust 1.77

Новости мира unix. Хотите узнать секрет вечного счастья? Откройте страницу 246.
Ответить
acolyte
Аватара пользователя
Сообщения: 3250
Зарегистрирован: 20.08.2022

#

Выпуск языка программирования Rust 1.77
Дата публикации:Fri, 22 Mar 2024 13:57:06 +0300




Опубликован релиз языка программирования общего назначения Rust 1.77, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).



Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.



Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.




Основные новшества:
  • Добавлена поддержка литералов для Си-строк (c"текст"), которые хранятся в памяти с завершающим нулевым символом и ассоциированы с типом "CStr". Предполагается, что поддержка Си-строк упростит написание кода, взаимодействующего с прослойками на языках программирования, в которых применяются завершаемые нулевым байтом строки, и позволит выполнять необходимые проверки на стадии компиляции.

    const HELLO: &core::ffi::CStr = c"Hello, world!";


    В асинхронно выполняемых функциях, объявленных при помощи выражения "async fn", разрешено использование рекурсии, т.е. подобные функции теперь могут вызывать сами себя.

    async fn fib(n: u32) -> u32 {
    match n {
    0 | 1 => 1,
    _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await
    }
    }


    Стабилизирован макрос offset_of!, позволяющий определить байтовое смещение полей структур, перечислений, объединений и кортежей, относительно начала типа. На практике макрос может быть полезен в ситуациях, когда требуется работа на уровне смещения полей при отсутствии экземпляра типа. В частности, функциональность offset_of необходима при разработке низкоуровневых компонентов, таких как драйверы.

    use std::mem;
    #[repr(C)]
    struct FieldStruct {
    first: u8,
    second: u16,
    third: u8
    }
    assert_eq!(mem::offset_of!(FieldStruct, first), 0);
    assert_eq!(mem::offset_of!(FieldStruct, second), 2);
    assert_eq!(mem::offset_of!(FieldStruct, third), 4);


    В пакетном менеджере Cargo в профилях релизов по умолчанию включена очистка файлов от отладочных данных (strip = "debuginfo"), если в профиле Cargo явно не включён режим отладки, т.е. если параметр debug = 0.

    Включена по умолчанию опция "-Zthir-unsafeck=on", обеспечивающая проверку unsafe для промежуточного представления THIR ("Typed High-Level Intermediate Representation").

    Добавлена lint-проверка static_mut_refs для вывода предупреждения при использовании ссылок на изменяемые статические значения.

    Реализована возможность применения типажа "From<&[T; N]>" для типа "Cow<[T]>".

    fn foo(data: impl Into<Cow<'static, [&'static str]>>) { /* ... */ }

    fn main() {
    foo(&["hello", "world"]);
    }



    В компиляторе обеспечено выравнивание 16-байтовых типов i128 и u128 для систем x86.

    В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:

    • array::each_ref
      [/url]
    • array::each_mut
      [/url]
    • core::net
      [/url]
    • f32::round_ties_even
      [/url]
    • f64::round_ties_even
      [/url]
    • mem::offset_of!
      [/url]
    • slice::first_chunk
      [/url]
    • slice::first_chunk_mut
      [/url]
    • slice::split_first_chunk
      [/url]
    • slice::split_first_chunk_mut
      [/url]
    • slice::last_chunk
      [/url]
    • slice::last_chunk_mut
      [/url]
    • slice::split_last_chunk
      [/url]
    • slice::split_last_chunk_mut
      [/url]
    • slice::chunk_by
      [/url]
    • slice::chunk_by_mut
      [/url]
    • Bound::map
      [/url]
    • File::create_new
      [/url]
    • Mutex::clear_poison
      [/url]
    • RwLock::clear_poison
      [/url]

Реализован третий уровень поддержки для платформ

aarch64-unknown-illumos,
hexagon-unknown-none-elf,
riscv32imafc-esp-espidf и
riscv32im-risc0-zkvm-elf. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.





Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=60827

Жизнь за Нер'зула!

Ответить