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)
Ответ на: комментарий от awesomelackware

А зачем мне тебе что-то объяснять, если ты несешь какую-то х%#нь невпопад?

Кто виноват в том что структурированная, осмысленная и логичная речь для тебя не понятна?

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

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

Настало время охренительных историй. И, да, опять без примеров. Явление утечки памяти чрезвычайно редкое. Значительно чаще происходит утечка иных ресурсов. Наиболее частой причиной таких ошибок является невнятное смешение C и C++. И да, подобное происходит крайне редко. А rust-сообщество решает те же проблемы, что и средневековые схоласты - «сколько чертей уместится на кончике пера». За 7 лет - parturiunt montes, nascitur ridiculus mus.

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

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

Лул.

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

Явление утечки памяти чрезвычайно редкое

Ахах. Да, если писать на языке с GC, то действительно.

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

Явление утечки памяти чрезвычайно редкое

Ахах. Да, если писать на языке с GC, то действительно.

Как всегда - примеров море. Вы смешны, хипстеры-теоретики.

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

Удаляюсь из треда

Хоть один устыдился своего мракобесия и скрылся с позором

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

Ок, без отстрела ног через P/Invoke и unsafe. Я же не сказал, что невозможно, просто что утечки там редкость, в отличии от C и других языков с ручным управлением памятью, где, как утверждал тот, кому я отвечал, они чрезвычайно редки.

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

Это уже утечка ресурсов.

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

Возьми gcc, возьми threads.h и собери/запусти любой пример на glibc, а потом расскажи мне, раз такой умный.

Речь идет не об «их же потоках» и не pthreads, а об C11 threads.h.

Пока что GCC говорит «fatal error: threads.h: Нет такого файла или каталога».

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

Речь идет не об «их же потоках» и не pthreads, а об C11 threads.h

Да всем похрен на них - они не нужны. Так же как не нужны strcpy_s и прочий иной шлак.

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

Не так давно в ядре устраняли, а смузи-тян не в курсе.

Так что это за утечка памяти в ядре?

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

Кардинально ничего менять и не надо. В перле версии 5.что-то там тоже кардинально ничего не меняли, но всё равно что-то поломали к херам. Язык должен быть простым и стабильным, как второй выпуск дебиана, а функционал либами должен расширяться, а не приделываться сбоку костылями в компилятор.

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

Кресты тоже пилят, мракобес.

Какие кресты? Они есть уже много лет, а новые стандарты с auto через auto доброй части разработчиков не упёрлись ни в какое место.

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

стабильным, как второй выпуск дебиана

В дебиане даже баги стабильны.

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

Можно подумать что от сахара у тебя что-то собираться перестанет.

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

И в таком виде enum прекрасно заменяет почти любые применения union, кроме байтодрочерства.

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

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

И? Если софт работает, то пользователь вряд ли узнает как он устроен.

330 потоков - это не работает, а занимается переключениями между потоками, побочным эффектом чего является выхлоп ПО.

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

Ну вот добавили чистый union для байтодрочеров, в чем проблема-то? А до этого байтодрочерам всегда можно было просто на сырых указателях сделать свой собственный union, тот же unsafe, просто кода больше.

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

И если у такого enum удалить tag, то получится чистый union из C

И добрая часть кодеров будет писать на rust с unsafe. И какой смысл перелезать с си на него?

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

Так в Rust есть нормальный enum, который ADT и не отличается от tagged union ничем, кроме того, что является безопасным и компилятор предоставляет нормальные средства для работы с ним, вроде if let, match. А новый union - для байтодрочеров в unsafe, и ничем в этом плане от union в C не отличается.

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

330 потоков - это не работает

поддержки веб стандартов нет - это и не работает

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

И добрая часть кодеров будет писать на rust с unsafe. И какой смысл перелезать с си на него?

В rust есть гораздо более удобные механизмы, чем сишный unsafe.

NextGenenration ★★
()

jollheef, Shaman007, я поправил текст, кто не занят, ознакомьтесь и, если больше помарок на обнаружится, можно и одобрять.

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

это когда много сложного кода на Си\Си++ и он течёт и багует во все щели.

Код течёт и багует от того, что руки из жопы, а не от того на чём его пишут.

Так вот мне кажется, что для языка который стабилен только 2 года это достижение

Понимаешь, дело в том, что rust объективно не нужен. Си - высокоуровневый кроссплатформенный ассемблер, плюсы - си с ооп, блекждеком и шлюхами, perl, python, php, lua - скриптота с управляемым кодом, динамической типизацией, свистелками и перделками, жаба - тоже самое, но с более строгой типизацией, js, lua - встраиваемые в приложение скрипты. А rust - это что? Компилируемый язык с gc и пятиколёсными велосипедами, чтобы не навернуться? Это можно все было приделать и в тех же плюсах через какие-нибудь либы.

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

Тем что в си энумов нет, нормальных строк нет, никаких удобств нет.

Вопрос не в удобстве/неудобстве, а в том, что на выходе. Если из-за удобств код кучу времени занимается перегонкой байтов из одной кучи в другую, то в одном месте окажутся такие удобства. Некоторые всё еще куски кода на ассемблере пишут, потому что на си машкод получается «грубый», а вы шляпу с gc называете системным языком.

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

шляпу с gc называете системным языком

Опять обосрался. Может хватит? Прочитай хоть немного про язык.

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

Но в Rust нет сборщика мусора.

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

А rust - это что? Компилируемый язык с gc и пятиколёсными велосипедами, чтобы не навернуться?

И они ещё рассуждают о нужности rust'а.

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

Прочитай хоть немного про язык.

А, это в го gc, извиняюсь.

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

Функции пм есть? Есть!

Ты пользуешься браузером, не поддерживающим расширения?

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

Я то как раз на asm писал. В некоторых ассемблерах на макросах можно наделать повысокоуровневее абстракции, чем С позволяет. C разве что переносимый, но никак не высокоуровневый.

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

Ну, си абстрагирован от асм, так что он выше уровнем, хоть на асм и можно делать круче абстракции чем в си, как ты говоришь.

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

При том, что чем выше уровень языка, тем больше он делает не нужного, тем труднее заставить его делать то, что нужно, соответственно.

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

При том, что чем выше уровень языка, тем больше он делает не нужного, тем труднее заставить его делать то, что нужно, соответственно.

Чем выше уровень языка, тем меньше нужно делать, чтоб добится нужного. Существуют редкие исключения(типа переключение потоков), но это нужно единицам.

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