LINUX.ORG.RU

Rust 1.19

 


3

8

Команда Rust рада объявить о последней версии Rust, 1.19.0. Rust это системный язык программирования, сфокусированный на безопасности, скорости и конкурентном выполнении.

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

$ rustup update stable

В противном случае, вы можете получить rustup с соответствующей страницы на нашем вебсайте и проверить детальные примечания к выпуску для 1.19.0 на Github.

Что нового в 1.19.0 stable

Rust 1.19.0 получил некоторые долгожданные возможности, но для начала примечание для наших пользователей Windows. На Windows Rust полагается на link.exe для линковки, который вы можете получить из “Microsoft Visual C++ Build Tools.” С последним выпуском Visual Studio 2017, структура каталогов для этих инструментов изменилась. Таким образом, чтобы использовать Rust, вы должны придерживаться инструментов 2015 или использовать обходной путь (такой как запуск vcvars.bat). В 1.19.0 rustc теперь знает, как найти инструменты 2017, и они работают без использования обходных путей.

А теперь к новым возможностям! Rust 1.19.0 это первый выпуск, который поддерживает объединения (unions):

union MyUnion {
    f1: u32,
    f2: f32,
}

Объединения это вид перечислений (enums), но в отличие от последних они «непомечены» («untagged»). Перечисления имеют «пометку», которая хранит информацию, какой вариант является правильным в рантайме; объединения игнорируют эту пометку.

Так как мы можем интерпретировать данные, хранящиеся в объединении, используя неправильный вариант, и Rust не может проверить это для нас, это означает, что чтение или запись поля объединения является unsafe:

let u = MyUnion { f1: 1 };

unsafe { u.f1 = 5 };

let value = unsafe { u.f1 };

Сопоставление с образцом также работает:

fn f(u: MyUnion) {
    unsafe {
        match u {
            MyUnion { f1: 10 } => { println!("ten"); }
            MyUnion { f2 } => { println!("{}", f2); }
        }
    }
}

Когда полезны объединения? Одним из основных случаев использования является интероперабельность с Си. C API могут использовать объединения, и во многих областях часто это делают, и с появлением объединений в Rust написание оберток для API подобных библиотек становится значительно проще. Дополнительно, из этого же RFC:

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

Эту возможность уже давно ждали, и еще больше улучшений на подходе. Сейчас объединения могут только содержать Copy типы и не могут реализовывать Drop. Мы ожидаем снятия этих ограничений в будущем.

Также циклы loop теперь имеют возможность возвращать значение при выходе с break:

// old code
let x;

loop {
    x = 7;
    break;
}

// new code
let x = loop { break 7; };

Rust традиционно позиционируется как «язык, ориентированный на выражения», в котором большинство вещей являются выражениями, вычисляющимися в значения, а не директивами. Раньше loop странно выделялся, так как был директивой.

Что насчет других форм циклов? Здесь еще не всё ясно. Посмотрите этот RFC для ознакомления с некоторыми дискуссиями вокруг открытых вопросов.

Замыкания, которые не захватывают окружение, теперь могут быть приведены к указателю на функцию:

let f: fn(i32) -> i32 = |x| x + 1;


Теперь мы создаем тарболы, сжатые xz, и предоставляем их по умолчанию, уменьшая расход сетевого траффика и тем самым ускоряя процесс загрузки. Тарболы, сжатые gzip, также доступны в случае, например, если вы не можете использовать xz по некоторым соображениям.

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

Наибольшей новой библиотечной возможностью являются макросы eprint! и eprintln!. Они работают так же, как и print! и println!, но пишут в стандартный поток ошибок, а не в стандартный поток вывода.

Другие нововведения:

.

И некоторые недавно стабилизированные API:

Смотрите детальные примечания к выпуску для получения более подробной информации.

Cargo

Cargo в основном получил небольшие, но значимые улучшения в данном выпуске. Так, Cargo больше не проверяет локальный рабочий каталог для индекса crates.io. Это должно обеспечить меньший размер файла для реестра и улучшить время клонирования, особенно на машинах Windows.

Другие улучшения:

Смотрите детальные примечания к выпуску для получения более подробной информации.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: Virtuos86 (всего исправлений: 3)

Ответ на: комментарий от anonymous

Может что-то новенькое внесёт, чуть-чуть продвинет ремесло программиста вперёд.

Никто ничего не двигает вперёд. Прогресса нет уже лет 10 как. Все собрались в кружки и дрочат на свои яп, а когда им надоедает - придумывают типа новые, но суть такие же.

crutch_master ★★★★★
()
Ответ на: комментарий от AntonyRF

Уже поправили меня, не всё можно реализовать через либы в С++, например Borrow Checker

Да? Интересно тогда, на чём писали самую первую версию rust.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

На ocaml. Да хоть на брейнфаке можно. Нужна только тюринг полнота.

anonymous
()
Ответ на: комментарий от crutch_master

OCaml - это функциональный язык. Функциональные языки требуют garbage collection и не особо хорошо подходят, если нужен язык близкий к железу.

red75prim ★★★
()
Ответ на: комментарий от crutch_master

То есть ты считаешь что иметь больше одного компилятора плохо? А иметь больше одного языка совсем не нужно?

pftBest ★★★★
()
Ответ на: комментарий от crutch_master

Я не предлагаю его замянять на что-то. Я спрашиваю зачем что-то на него заменять.

Затем что умный и красивый лучше чем отдельно умные и красивые. Ладно, предложение писать интерпретатор безопасного языка на C оставлю на вашей совести, вопрос зачем заменять C/C++ на Rust? Затем, что если смотреть только на затраты на написание кода, то почти любая хорошо написанная программа на C/C++ (кроме дикой ООПоты) представляет собой многословный и уродливый аналог программы на подмножестве Rust'а. Все эти смешные и непонятные закорючки несут ту информацию, которую на других языках с ручным управлением ресурсами необходимо прописывать в комментариях, а до этого её нужно придумать, поэтому никакой реальной экономии по сравнению с Rust качественный код на C/C++ не предоставляет. При этом Rust ещё и следит за тем, чтоб эти правила соблюдались и не противоречили друг другу. На этапе сопровождения программы, Rust гораздо лучше C/C++, потому что править можно не разбираясь во всех соглашениях до конца, если зацепишь что-то важное - компилятор наругает. Поэтому можно сказать, что Rust - это такой C++, который лучше во всём. Кроме дикой ООПоты, но дикая ООПота - это само по себе зло и напрашивание на проблемы.

khrundel ★★★★
()
Ответ на: комментарий от red75prim

Функциональные языки требуют garbage collection

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

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Да? Интересно тогда, на чём писали самую первую версию rust.

Вопрос на грани тупости.

Перефразирую - а на чём писали самую первую версию С++? А на чём писали самую первую версию cfront? А на чём писали самую первую версию bcpl? А на чём писали самую первую версию ассемблера?

Языки программирования развиваются увеличивая выразимость, в этом нет ни чего плохого.

AntonyRF ★★★★
()
Ответ на: комментарий от pftBest

Есть у нас тут php, js и питон, и что? Php - тормозное раздутое дерьмо, причем пишут на 5.3, т.к. хостеры, js - асинхронная нода, хипсторы и npm с qwerty, про питон вообще молчу. Ну да, круто, много языков, у каждого долбонутые фанбои, которые всё готовы на него переписать, со своим, единственно правильным подходом. Ладно, хоть выбор есть. Пока есть.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от khrundel

то почти любая хорошо написанная программа на C/C++ (кроме дикой ООПоты) представляет собой многословный и уродливый аналог программы на подмножестве Rust'а

Любое больше ПО хоть на чём - это многослойное уродливое дерьмо. Дело совсем не в rust'е/си/плюсах. Если на rust'е начнут массово писать с ним будет тоже самое. Дело в самих подходах к разработке.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Такой же как и предыдущий пост.

Ну попробую всё же адекватно вести диалог в теме про Rust, можете указать на то, что Вам не понравилось?

AntonyRF ★★★★
()
Ответ на: комментарий от crutch_master

Если вы пишите под 8-и битные мк, тогда да, ничего не поменялось. Но мир уже ушёл вперёд, и вокруг мобилки с железом настольного ПК. Что очень сильно убивает необходимость писать на сишке в реальном мире.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Что очень сильно убивает необходимость писать на сишке в реальном мире.

С чего это оно убывает? Системные либы делать больше не надо? Растаманы точно всё перепишут как надо?

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Дело в самих подходах к разработке.

Именно. И из-за того, что Rust предоставляет большинство вещей из коробки + cargo, - резко снижается степень велосипедов и быдлокода.

Хочешь пропиарить свою либу? Где тесты, где бенчи, где дока, где примеры, где ci? В rust это всё из коробки (ну кроме CI, но он добавляется на раз). Заходим в репу и видим всё что нам нужно.

В то время как у С/С++ мы видим в лучшем случае cmake c кучей зависимостей, которые непонятно откуда брать. С кривыми доками, не считая Qt, которые нужно самому собирать, для чего нужен doxygen, который тоже нужно где-то взять, и тд. и тп.

Rust выигрывает даже тем, что он тупо новый. Поэтому у rust есть crates.io, docs.rs и прочие ништяки, которых у С/С++ нет, и уже не будет.

RazrFalcon ★★★★★
()
Ответ на: комментарий от crutch_master

Системные либы - это что за либы? Можно примеры таких либ? Желательно такие, которые нужно писать исключительно на С.

RazrFalcon ★★★★★
()
Ответ на: комментарий от crutch_master

На расте можно писать как на си с оферхедом и рантаймом около нуля. И при этом использовать растофичи.

anonymous
()
Ответ на: комментарий от RazrFalcon

Именно. И из-за того, что Rust предоставляет большинство вещей из коробки + cargo

Да я от каждого фанбоя слышу, что у него всё из коробки и его пакетный манагер решает все проблемы. Потом, когда все переписывают выясняется, что при проектировке был допущен фатальный недостаток и всё начинается по новой.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Не проще ли тупо сделать интерпретатор в си, со всякими строками, безопасными указателями, красивыми абстракциями и что там вам еще надо?
Все тобой перечисленное - управляемый код, а не компилируемый.

Если у тебя в голове несколько голосов, то пусть они сначала договорятся.

NextGenenration ★★
()
Ответ на: комментарий от crutch_master

Вопрос стоит в том, сколько лишней работы делается, чтобы посчитать 1+1.

Нет смысла думать о том сколько работы выполняется, если она выполняется всего 0.1% времени

NextGenenration ★★
()
Ответ на: комментарий от NextGenenration

Нет смысла думать о том сколько работы выполняется, если она выполняется всего 0.1% времени

Есть смысл всегда. Твоя программа, которая выполняется 0.1% времени, не единственная. Кроме тебя еще 1500 таких же.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от NextGenenration

Значит руки всё таки из жопы?

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

crutch_master ★★★★★
()
Ответ на: комментарий от NextGenenration

Если у тебя в голове несколько голосов, то пусть они сначала договорятся.

Между витруальной машиной с байт кодом и процессором с нативным кодом разницу улавливаешь?

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Такой же как и предыдущий пост.

Ну попробую всё же адекватно вести диалог в теме про Rust, можете указать на то, что Вам не понравилось?

Слив засчитан

AntonyRF ★★★★
()
Ответ на: комментарий от RazrFalcon

Какой ещё фатальный недостаток?

Такой же, который у си и плюсов.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

ssl, curl, sdl, zlib, да и что угодно другое.

Некоторые утилиты уже частично переписаны, для других есть аналог

NextGenenration ★★
()
Ответ на: комментарий от NextGenenration

Вполне можно на rust

Кто будет всё это переделывать на rust? Кто будет делать rust компиляторы для всего? Когда rust станет не нужным что будем делать? Опять все переписывать? Фанбои такие фанбои.

crutch_master ★★★★★
()
Ответ на: комментарий от NextGenenration

Системные либы делать больше не надо?

Вполне можно на rust

Таки почему за 7 лет появилось системных либ на rust'е чуть меньше чем нисколько?

anonymous
()
Ответ на: комментарий от crutch_master

Есть смысл всегда. Твоя программа, которая выполняется 0.1% времени, не единственная. Кроме тебя еще 1500 таких же.

Если у тебя куча говнокода в 99.9%, то от оптимизации 0.1% ты получишь крайне мало

NextGenenration ★★
()
Ответ на: комментарий от crutch_master

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

Нормальные языки могут в достаточной мере выпрямить.

NextGenenration ★★
()
Ответ на: комментарий от crutch_master

Между витруальной машиной с байт кодом и процессором с нативным кодом разницу улавливаешь?

Ты хочешь такой как rust но не rust? Не логично же!

NextGenenration ★★
()
Ответ на: комментарий от AntonyRF

можете указать на то, что Вам не понравилось?

Если коротко - опять всё переделывать, опять самый-лучший-язык, опять обосрутся и все по новой.

crutch_master ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.