Выпуск Rust 1.25

Original author: The Rust Core Team
  • Translation

Команда Rust рада сообщить о новой версии Rust: 1.25.0. Rust — это системный язык программирования, нацеленный на безопасность, скорость и параллельное выполнение кода.


Если у вас установлена предыдущая версия Rust, для обновления достаточно выполнить:


$ rustup update stable

Если же у вас еще не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта. С подробными примечаниями к выпуску Rust 1.25.0 можно ознакомиться на GitHub.


Что вошло в стабильную версию 1.25.0


Несколько последних выпусков были незначительными, но Rust 1.25 содержит много
нововведений! Во-первых: мы обновили LLVM с 4-ой версии до 6-ой. Обновление
влечёт ряд изменений, наиболее важное из которых — поддержка AVR.


Появился новый способ использовать оператор use: вложенные группы. Если вы импортировали таким способом:


use std::fs::File;
use std::io::Read;
use std::path::{Path, PathBuf};

То теперь можете написать так:


// на одной строке
use std::{fs::File, io::Read, path::{Path, PathBuf}};

// в несколько строк
use std::{
    fs::File,
    io::Read,
    path::{
        Path,
        PathBuf
    }
};

Это может сократить повторения и сделать код более понятным.


В этом выпуске мы представили два больших изменения в документации. Во-первых: Rust By Example теперь находится на doc.rust-lang.org! В скором времени мы сделаем перенаправление со старого домена. Мы надеемся, что это привлечёт больше внимания к прекрасному ресурсу и вы получите локальную копию с вашей локальной документацией.


Во-вторых, в Rust 1.23 мы говорили о переходе от Hoedown к pulldown-cmark. В Rust 1.25, pulldown-cmark теперь по умолчанию. Напоследок, мы удалили последнюю часть кода Си из rustdoc и теперь следуем спецификации CommonMark.


В заключение, в RFC 1358, был принят атрибут #[repr(align(x))]. В Rust 1.25 он был стабилизирован! Данный атрибут позволяет установить выравнивание ваших структур:


struct Number(i32);

assert_eq!(std::mem::align_of::<Number>(), 4);
assert_eq!(std::mem::size_of::<Number>(), 4);

#[repr(align(16))]
struct Align16(i32);

assert_eq!(std::mem::align_of::<Align16>(), 16);
assert_eq!(std::mem::size_of::<Align16>(), 16);

Если вы работаете с низкоуровневым кодом, то контроль над такими "вещами" может быть очень важным!


Подробности смотрите в примечаниях к выпуску.


Стабилизации стандартной библиотеки


Самым крупным изменением в библиотеках является std::ptr::NonNull<T>. Этот тип схож с *mut T, но он ненулевой и ковариантный. Данный блог-пост не лучшее место, чтобы объяснить различия, но в двух словах: NonNull<T> гарантирует, что он не будет равен null. Это означает, что Option<NonNull<T>> имеет такой же размер, как и *mut T. Если вы создаете структуру данных с небезопасным кодом, NonNull<T> зачастую будет правильным выбором для вас!


libcore получила модуль time, который содержит тип Duration, доступный ранее только в libstd.


Кроме того, функции from_secs и from_millis связанные с Duration, были написаны с помощью const fn, что позволяет использовать их для инициализации Duration, в константных выражениях.


Подробности смотрите в примечаниях к выпуску.


Изменения Cargo


В интерфейсе командной строки Cargo есть одно важное изменение: cargo new теперь по умолчанию будет генерировать исполняемый файл вместо библиотеки. Мы стараемся, чтобы интерфейс Cargo был достаточно стабильным, но это важное изменение и вряд ли оно сломает пакетный менеджер.


Для справки, cargo new теперь принимает два флага: --lib для создания библиотек и --bin для создания двоичных или исполняемых файлов. В предыдущей версии Cargo, если вы не передаёте ни одного значения, то флагом по умолчанию является --lib. Мы приняли такое решение, потому что каждый бинарный файл (часто) зависит от многих библиотек и поэтому они (библиотеки) более распространенны. Однако, это не верно. Каждая библиотека использует множество бинарных файлов. Более того, при создании нового проекта, вы часто хотите, чтобы это была программа, которую можно запустить. Эта проблема возникает не только у новичков, но даже очень давние члены сообщества сказали, что они нашли это поведение неожиданным. Таким образом, мы меняем его.


Аналогично, предыдущая версия команды cargo new была немного упрямой в названии пакетов. В частности, если название вашего пакета начиналось на rust- или заканчивалось на -rs, Cargo переименовал бы его. Намерение было таковым, что это пакет языка Rust, а это является избыточной информацией. Тем не менее, люди сильно заботятся об наименовании и при столкновении с этим, они удивляются и часто расстраиваются. Поэтому, мы больше не будем этого делать.


Многие пользователи любят команду cargo doc — это способ сгенерировать документацию локально для их проекта. В этом выпуске она получила прирост скорости, потому что теперь работает через cargo check, а не cargo build. Поэтому, некоторые сценарии будут выполняться быстрее.


К тому же, выкачивание git зависимостей должно быть быстрее, благодаря использованию жёстких ссылок, когда это возможно.


Подробности смотрите в примечаниях к выпуску.


Разработчики 1.25.0


Множество людей участвовало в разработке Rust 1.25. Мы не смогли бы этого добиться без участия каждого из вас


Спасибо!


Автор перевода: @BORN2LOSE

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 9

    +1
    … Обновление
    влечёт ряд изменений, наиболее важное из которых — поддержка AVR...

    Под AVR имеется в виду семейство восьмибитных микроконтроллеров фирмы Atmel?

    Ардуину можно будет на Rust программировать?
      +1

      Да, это семейство. Только уже не Atmel, а Microchip.

        +3

        Судя по состоянию задачи прямо сейчас изкоробки сборка под AVR все еще не работает — там есть ряд других сложностей, которые надо будет решить.


        Но есть форк компилятора ржавчины, который может собирать код под AVR (не пробовал, но так написано). У них есть какие-то демки — avr-rust/blink — и какая-то горстка удобств для ардуины — avr-rust/ruduino.


        Я так понимаю что план состоит в постепенном влитии этого форка в апстрим.

          0

          Что то он потух совсем, последний коммит четыре месяца назад

            0

            Подробностей не знаю, но хочется верить что это из-за работы над влитием форка в апстрим.

              +1

              Ну да, вроде если судить по комментам в задаче, то жизнь там есть.

      • UFO just landed and posted this here
          +2

          Ну, идеал зависит от задач. Но да, задумка у Rust крутая. Жаль, там порог вхождения высоковат. Не каждый решится разбираться в совершенно новых концепциях. Но, с другой стороны, подсказки компилятора просто шикарные!

          +3

          Мне определённо нравится моя работа: я сейчас пишу прошивку для STM32 на Rust и никто не возражает. Пока что выглядит, что написать её на Rust не сложнее, чем на C (за исключением того, что сборка без оптимизации не работает — собирается, но постоянно ловит какие‐то исключения), хотя это вообще‐то первый мой проект на Rust. Ну если не считать того, что в том же репозитории у меня лежит уже четыре раза переписанная мигалка светодиодом:


          1. На задержке через опрос флага прерывания таймера с блогa разработчика svd2rust, переписана под последную версию всех зависимостей при том, что патча для svd для бо́льшей типобезопасности я не нашёл. Так и не заработала.
          2. На задержке через инкремент volatile памяти — первая собственно заработавшая.
          3. С миганием в прерывании таймера.
          4. С миганием в прерывании таймера, но уже на основе cortex-m-rtfm. Кстати удивительно, но с оптимизациями эта версия заняла где‐то на 10—20 байт меньше предыдущей. (Без оптимизации, думаю, не заработает. Во всяком случае, «эхо» по UART, получившееся как промежуточный результат написания собственно нужной прошивки, без оптимизации не работало.)

          Если интересно, то ничего никуда сейчас не выложено.

          Only users with full accounts can post comments. Log in, please.