Выпуск мовы праграмавання Rust 1.61

Апублікаваны рэліз мовы праграмавання агульнага прызначэння Rust 1.61, заснаванага праектам Mozilla, але цяпер які развіваецца пад заступніцтвам незалежнай некамерцыйнай арганізацыі Rust Foundation. Мова сфакусаваная на бяспечнай працы з памяццю і дае сродкі для дасягнення высокага паралелізму выканання заданняў, пры гэтым абыходзячыся без выкарыстання зборшчыка смецця і runtime (runtime зводзіцца да базавай ініцыялізацыі і суправаджэння стандартнай бібліятэкі).

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

Бяспечная праца з памяццю забяспечваецца ў Rust падчас кампіляцыі праз праверку спасылак, адсочванне валодання аб'ектамі, улік часу жыцця аб'ектаў (вобласці бачнасці) і адзнаку карэктнасці доступу да памяці падчас выканання кода. Rust таксама дае сродкі для абароны ад цэлалікіх перапаўненняў, патрабуе абавязковай ініцыялізацыі значэнняў зменных перад выкарыстаннем, лепш апрацоўвае памылкі ў стандартнай бібліятэцы, ужывае канцэпцыю нязменнасці (immutable) спасылак і зменных па змаўчанні, прапануе моцную статычную тыпізацыю для мінімізацыі лагічных памылак.

Асноўныя навіны:

  • Предоставлена возможность определения собственных кодов возврата из функции main. Изначально функция main в Rust могла возвращать только тип «()» (unit), что всегда указывало на успешный статус завершения, если разработчиком явно не вызвана функция «process::exit(code)». В Rust 1.26 при помощи нестабильного типажа Termination в функции main была предоставлена возможность возвращение значений «Ok» и «Err», соответствующих кодам EXIT_SUCCESS и EXIT_FAILURE в программах на языке Си. В Rust 1.61 типаж Termination переведён в разряд стабильных, а для представления конкретного кода возврата предложен отдельный тип ExitCode, который абстрагирует специфичные для платформы типы возвращаемых значений, предоставляя как предопределённые константы SUCCESS и FAILURE, так и метод From<u8> для возвращения произвольного кода возврата. use std::process::ExitCode; fn main() -> ExitCode { if !check_foo() { return ExitCode::from(42); } ExitCode::SUCCESS }
  • Стабилизированы дополнительные возможности функций, определённых с использованием выражения «const fn», которые могут вызываться не только как обычные функции, но и использоваться в любом контексте вместо констант. Данные функции вычисляются на этапе компиляции, а не в ходе выполнения, поэтому на них накладываются определённые ограничения, такие как возможность чтения только из констант. В новой версии внутри const-функций разрешены базовые операции с указателями на функции (разрешено создание, передача и приведение указателей, но не вызов функции по указателю); ограничения типажей (trait bounds) для обобщённых параметров const-функций, таких как T: Copy; динамически диспетчеризируемые типажи (dyn Trait); типы impl Trait для аргументов и возвращаемых значений функции.
  • Дескрипторы потоков Stdin, Stdout и Stderr в std::io теперь имеют cтатическое время жизни («‘static») при блокировке, что позволяет использовать конструкции вида «let out = std::io::stdout().lock();» с получением дескриптора и выставлением блокировки в одном выражении.
  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады і рэалізацыі тыпажоў:
    • Pin::static_mut
    • Pin::static_ref
    • Vec::retain_mut
    • VecDeque::retain_mut
    • Write для Cursor<[u8; N]>
    • std::os::unix::net::SocketAddr::from_pathname
    • std::process::ExitCode
    • std::process::Termination
    • std::thread::JoinHandle::is_finished
  • Прыкмета "const", якая вызначае магчымасць выкарыстання ў любым кантэксце замест канстант, ужыты ў функцыях:
    • <*const T>::offset и <*mut T>::offset
    • <*const T>::wrapping_offset и <*mut T>::wrapping_offset
    • <*const T>::add и <*mut T>::add
    • <*const T>::sub и <*mut T>::sub
    • <*const T>::wrapping_add и <*mut T>::wrapping_add
    • <*const T>::wrapping_sub и <*mut T>::wrapping_sub
    • <[T]>::as_mut_ptr
    • <[T]>::as_ptr_range
    • <[T]>::as_mut_ptr_range

Дополнительно можно отметить статью «Rust: A Critical Retrospective» с обобщением впечатлений о языке Rust после написания на нём 100 тысяч строк кода в процессе разработки микроядерной операционной системы Xous, используемой в прошивках. Из недостатков отмечается трудный для восприятия синтаксис, незавершённость и продолжение развития языка, отсутствие повторяемых сборок, типовые проблемы с доверием к зависимостям в Crates.io, необходимость соблюдения определённой дисциплины для написания безопасного кода. Из возможностей превзошедших ожидания упоминаются средства для рефакторинга кода и переделки «хаков», добавленных при быстром создании прототипов.

Крыніца: opennet.ru

Дадаць каментар