Анонс Rust 1.9

Ми раді представити нову версію Rust 1.9. Rust — це мову програмування, націлений на безпечну роботу з пам'яттю, швидкість і паралельне виконання коду.
Як завжди, ви можете встановити Rust 1.9 з відповідної сторінки офіційного сайту, а також ознайомитися з докладним списком змін в цій версії на GitHub. У цей реліз увійшло близько 1400 патчів.
Що увійшло в стабільну версію 1.9

Керована розмотування стека

найбільша зміна в Rust 1.9 — стабілізація модуля
std::panic
, який надає методи зупинки процесу розмотування стека, запущеного панікою:
use std::panic;

let result = panic::catch_unwind(|| {
println!("привіт!");
});
assert!(result.is_ok());

let result = panic::catch_unwind(|| {
panic!("про немає!");
});
assert!(result.is_err());

Цей інтерфейс був визначений у RFC 1236.
У загальному випадку Rust розрізняє два види помилкових ситуацій:
  • Очікувана проблема, наприклад, файл не знайдений.
  • Несподівана проблема, наприклад, доступ до масиву поза меж.
Очікувані проблеми зазвичай відбуваються за обставин, які програма не може контролювати; надійний код повинен бути готовий до будь-якої неприємності, що виникає в його оточенні. Очікувані проблеми обробляються у Rust за допомогою типу
Result
, який дозволяє функції повернути викликає інформацію про проблему, а викликає вже може обробити помилку. Це досить точний спосіб обробляти помилки.
Несподівані проблеми — це баги: вони відбуваються через порушення контракту або затвердження (assertion). Оскільки їх виникнення несподівано, немає особливого сенсу в точній обробці таких помилок. Замість цього Rust використовує підхід "fail fast" — такі помилки викликають паніку, яка за замовчуванням починає розмотування стека потоку, який зіткнувся з помилкою. При цьому виконуються тільки деструктори — ніякий інший код не виконується. Інші потоки продовжать виконуватися, але виявлять паніку при спробі обмінятися даними з панікуючим потоком (через канали або через загальну пам'ять). Таким чином, паніка перериває виконання аж до якоїсь "кордони ізоляції". Код на іншій стороні кордону може продовжити працювати, і при бажанні відновити роботу програми зі стану паніки, "грубим". Наприклад, сервер не обов'язково впаде через проваленого assert'а в одному зі своїх потоків.
Новий інтерфейс
catch_unwind
надає спосіб ввести додаткові кордону ізоляції всередині потоку. Є кілька прикладів, коли це корисно:
  • Вбудовування Rust'а в інші мови
  • Абстракції, що керують потоками
Перший випадок був потенційно невизначеним поведінкою. На практиці розмотування в іншу мову часто веде до segfault'ам. Дозволяючи ловити паніку, ми спрощуємо експорт коду на Rust у вигляді API Сі — тепер на межі переходу в Сі ми можемо зловити паніку і перетворити її в код повернення.
Другий випадок мотивований бібліотеками пулів потоків. Якщо потік в пулі панікує, зазвичай не потрібно вбивати сам потік. Замість цього треба зловити паніку і повідомити про неї клієнту пулу. Інтерфейс
catch_unwind
має парну функцію
resume_unwind
, яка може бути використана для перезапуску процесу паніки на стороні клієнта пулу, якій вона належить.
В обох випадках ми вводимо додаткову кордон ізоляції в межах потоку, і потім перетворимо паніку в інший вид помилки.
Останнє зауваження: чому
catch_unwind
, а не
catch_panic
? Йде робота додавання іншої стратегії паникования: переривання всього процесу (abort). При цьому, можливо, буде виконуватися загальний хук. Для деяких додатків це найбільш розумний спосіб обробки помилок програмування, і запобігання розмотування стека може дати поліпшену продуктивність і менший розмір коду.

Попередження про застарілих інтерфейсах (deprecation warnings)

Для авторів бібліотек став доступний новий атрибут:
#[deprecated]
. Цей атрибут дозволяє відзначити застарілий інтерфейс, і користувачі бібліотеки отримають попередження при його використанні. При цьому можна вказати новий рекомендований інтерфейс на заміну. Попередження про застарілих інтерфейсах давно використовуються в стандартній бібліотеці, а тепер, завдяки RFC 1270, можуть бути використані у всій екосистемі Rust.

Нові платформи для компіляції

Тепер публікуються скомпільовані стандартні бібліотеки для кількох нових платформ:
  • mips-unknown-linux-musl
    ,
  • mipsel-unknown-linux-musl
    , і
  • i586-pc-windows-msvc
    .
Перші дві платформи особливо цікаві з точки зору крос-компіляції; див. подробиці у недавній публікації про
rustup
.

Прискорення компіляції

Временная складність перевірки змінних на еквівалентність під час уніфікації типів зменшена з O(n!) до O(n). В результаті цього деякі зразки коду компілюються набагато швидше.

Викочуємо використання спеціалізації

В цьому релізі спеціалізація вперше використовується в стандартній бібліотеці. У даний момент спеціалізація доступна тільки на nightly. Вона дозволяє спеціалізувати узагальнений код для більш конкретних типів.
Один з прикладів, де це відбувається в стандартній бібліотеці, це перетворення зрізу рядка
&str
) владеемую рядок (
String
). Метод
to_string
береться з узагальненого інтерфейсу, який раніше був повільніше, ніж спеціальний метод
to_owned
. Тепер ці функції еквівалентні.
Реалізувавши цей простий випадок, ми приступимо до інших місць, де можна поліпшити продуктивність з допомогою спеціалізації.

Стабілізація бібліотек

1.9 стабілізовані приблизно 80 бібліотечних функцій. Найбільш помітна зміна — це описаний раніше модуль
std::panic
. Крім нього є кілька інших речей.
Робота з мережею
  • TcpStream
    ,
    TcpListener
    та
    UdpSocket
    набули методи конфігурування з'єднання.
  • SocketAddr
    та його варіанти отримали зручні методи
    set_ip()
    та
    set_port()
    .
Колекції
  • BTreeSet
    та
    HashSet
    набули методи
    take()
    ,
    replace()
    та
    get()
    , які дозволяють отримати назад володіння вихідним ключем.
  • OsString
    отримав кілька нових методів і став більше схожий на
    String
    .
  • Зрізи отримали
    copy_from_slice()
    , безпечну форму
    memcpy
    .
Кодування
  • char
    тепер може бути декодирован в UTF-16.
Покажчики
  • Сирі покажчики отримали
    as_ref()
    та
    as_mut()
    , які повертають
    Option<&T>
    , перетворюючи нульові покажчики
    None
    .
  • ptr::{read,write}_volatile()
    дозволяють багатопотокове (volatile) читання і запис по сирому вказівником.
Нарешті, багато типи
libcore
не мали реалізації типажу
Debug
. Це виправлено у випуску 1.9.
Детальніше дивіться тут.

Можливості Cargo

В Cargo два великі зміни.
По-перше, тепер кілька процесів Cargo можуть працювати одночасно.
По-друге, доданий новий прапор —
RUSTFLAGS
. Цей біт дозволяє вказати довільні прапори, які будуть передаватися
rustc
через оточення. Це корисно, наприклад, для пакувальників пакетів.
Детальніше дивіться тут.
Розробники версії 1.9
В релізі версії 1.9 брало участь 127 осіб. Велике вам спасибі!
Список розробників
  • Aaron Turon
  • Abhishek Chanda

  • Adolfo Ochagavía
  • Aidan Hobson Sayers
  • Alan Somers
  • Alejandro Wainzinger
  • Aleksey Kladov
  • Alex Burka
  • Alex Crichton
  • Amanieu d Antras
  • Andrea Canciani
  • Andreas Linz
  • Andrew Cantino
  • Andrew Horton
  • Andrew Paseltiner
  • Andrey Cherkashin
  • Angus Lees
  • Ariel Ben-Yehuda
  • Benjamin Herr
  • Björn Steinbrink
  • Brian Anderson
  • Brian Bowman
  • Christian Wesselhoeft
  • Christopher Serr
  • Corey Farwell
  • Craig M. Brandenburg
  • Cyryl Płotnicki-Chudyk
  • Daniel J Rollins
  • Dave Huseby
  • David AO Lozano
  • David Henningsson
  • Devon Hollowood
  • Dirk Gadsden
  • Doug Goldstein
  • Eduard Burtescu
  • Eduard-Mihai Burtescu
  • Eli Friedman
  • Emanuel Czirai
  • Erick Tryzelaar
  • Evan
  • Felix S. Klock II
  • Florian Berger
  • Geoff Catlin
  • Guillaume Gomez
  • Gökhan Karabulut
  • JP Sugarbroad
  • James Miller
  • Jeffrey Seyfried
  • John Talling
  • Jonas Schievink
  • Jonathan S
  • Jorge Aparicio
  • Joshua Holmer
  • Kai Noda
  • Kamal Marhubi
  • Katze
  • Kevin Brothaler
  • Kevin Butler
  • Manish Goregaokar
  • Markus Westerlind
  • Marvin Löbel
  • Masood Malekghassemi
  • Matt Brubeck
  • Michael Huynh
  • Michael Неймана
  • Michael Woerister
  • Ms2ger
  • NODA, Kai
  • Nathan Kleyn
  • Nick Cameron
  • Niko Matsakis
  • Noah
  • Novotnik, Petr
  • Oliver Middleton
  • Oliver Schneider
  • Philipp Oppermann
  • Piotr Czarnecki
  • Pyfisch
  • Richo Healey
  • Ruud van Asseldonk
  • Scott Olson
  • Sean McArthur
  • Sebastian Wicki
  • Seo Sanghyeon
  • Simon Sapin
  • Simonas Kazlauskas
  • Steve Klabnik
  • Steven Allen
  • Steven Fackler
  • Stu Black
  • Sébastien Marie
  • Tang Chenglong
  • Ted Horst
  • Ticki
  • Tim Montague
  • Tim Неймана
  • Timon Van Overveldt
  • Tobias Bucher
  • Tobias Müller
  • Todd Lucas
  • Tom Tromey
  • Tshepang Lekhonkhobe
  • Ulrik Sverdrup
  • Vadim Petrochenkov
  • Valentin Lorentz
  • Varun Vats
  • Wang Xuerui
  • Wangshan Lu
  • York Xiang
  • arcnmx
  • ashleysommer
  • bors
  • ggomez
  • gohyda
  • ituxbag
  • mitaa
  • nicholasf
  • petevine
  • pierzchalski
  • pravic
  • srinivasreddy
  • tiehuis
  • ubsan
  • vagrant
  • vegai
  • vlastachu
  • Валерій Лашманов

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.