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

Увы и ах, никто пока не может оценить это поделие непризнанных гениев.

Каждую неделю в блоге они пишут о проделанной работе, ни кто не отменял Servo он растёт и сейчас постепенно заменяют компоненты в Firefox на те, что написаны на Rust. Есть RoadMap. Через несколько лет возможно это поделие будет по умолчанию, а может и позже, хз, я не особо разбираюсь в браузерных движках.

Т.е. cargo действительно не нужен? Да и зачем, все равно все пользуются пакетниками операционной системы.

Что за бред?! Cargo нужен разработчикам, причём тут пакетники операционной системы?! Программисты пишут тонны кода и могут создавать библиотеки, которыми через Cargo можно делиться с сообществом

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

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

А если выделить класс наиболее часто встречающихся ошибок и написать компилятор который не даст скомпилировать код с ошибкой из этих классов, тем самым освободив время, которое тратят программисты на исправление ошибок, на нужные вещи? Разве это плохой подход?

Или все должны страдать без прогресса?

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

Или все должны страдать без прогресса?

Тогда ckotinko не сможет говорить что жабисты добрались до gcc

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

Код с 1.0 будет компилироваться в 2.0

Мажорная версия в семантическом версионировании ломает обратную совместимость.
Скорее всего, не будет.

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

что такого можно делать в 330 потоков на вебстранице

«Не читал, но осуждаю» (с) Я тоже не читал, но подозреваю что это как-то связано с рендерингом DOM. А 330 потоков от того, что изначально этот рендеринг пилят для GPU, на котором 330 потоков «как нефиг делать». Сейчас там есть опция перенести рендеринг на CPU, подозреваю, что для CPU оно просто не оптимизировано еще.

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

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

Так что насчет union? Обосрался и решил не отвечать?

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

Из-за этого его не впихивают вместо apt в убунту.

Т.е. cargo действительно не нужен? Да и зачем, все равно все пользуются пакетниками операционной системы.

Этот мракобес не пользовался ни одиним из пакетников типа gem, cargo, shards, ... зато имеет своё мнение о их предназначении

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

Этот мракобес

Какой этот?

Из-за этого его не впихивают вместо apt в убунту.

Языкозависимые пакетники больше проблем создают, чем решают.

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

«Не читал, но осуждаю» (с) Я тоже не читал, но подозреваю что это как-то связано с рендерингом DOM. А 330 потоков от того, что изначально этот рендеринг пилят для GPU

Ты чрезвычайно далек от 2D-графики. И, да, 330 потоков - это позорище стыдное. За 7 лет - risum teneatis, amici! - эти горе-разработчики не смоглм выкатить ничего рабочего.

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

Какой этот?

анонимный

Языкозависимые пакетники больше проблем создают, чем решают.

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

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

Пруфов конечно не будет?

пруф

Major version X (X.y.z | X > 0) MUST be incremented if any backwards incompatible changes are introduced to the public API. It MAY include minor and patch level changes. Patch and minor version MUST be reset to 0 when major version is incremented.

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

Этот мракобес не пользовался ни одиним из пакетников типа gem, cargo, shards

Хех, мне стыдно пользоваться стандартными инструментами, не беру пример с хипстоты, не ставлю софт мимо пакетника. (Боже, какие жалкие маргиналы эти любители rust'а.)

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

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

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

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

homebrew.
Я особенно много юзал pip, cabal, dub и впечатления ужасные.

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

Ну опиши по шагам, что мне надо сделать, чтобы с твоим homebrew собрать под Windows какой-нибудь servo ночным компилятором Rust?

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

не ставлю софт мимо пакетника

Плагины для браузера тоже ставишь apt'ом?

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

Да ты сам не понимаешь, что такое cargo.

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

Если ещё проще — cargo тоже пакетник.

Я бы сказал, что есть похожий функционал, но с пакетным менеджером ОС, типа apt-get, я бы не сравнивал. Т.к. Cargo умеет создавать проекты для исполняемых файлов и библиотек, собирать проекты, запускать для них тесты и бэнчи, ну и указанные зависимости скачивает с удалённых источников, чем и похож на пакетный менеджер, но нет. Это больше вундервафля по управлению проектом, чем пакетный менеджер КМК

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

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

Тогда у тебя терминальная стадия ФГМ.

я им пользуюсь каждый день, в отличие от тебя

Один раз от него побомбил, больше не хочу.

Я бы сказал, что есть похожий функционал, но с пакетным менеджером ОС, типа apt-get, я бы не сравнивал. Т.к. Cargo умеет создавать проекты для исполняемых файлов и библиотек, собирать проекты, запускать для них тесты и бэнчи, ну и указанные зависимости скачивает с удалённых источников, чем и похож на пакетный менеджер, но нет. Это больше вундервафля по управлению проектом, чем пакетный менеджер КМК

Т. е. оно ещё и в итоге оказалось жирный комбайном?
Вдвойне не нужно.

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

А то что есть позовляет работать на любой платформе, под которую оно собрано.

И заодно вертеть линуксовые ПМ-ы и ставить софт в обход их.
Хорошо.

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

Это ты покажи. cargo вот есть и оно работает под все платформы, обеспечивая одинаковое поведение. Ты же утверждаешь, что homebrew это нормальная замена cargo.

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

cargo это программа для разработчика. apt это программа для пользователя. У них разные цели. Немного совпадают, но совсем немного.

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

«С» создавался в совсем другое время. Сравнение некорректно.

Ну и напоминаю, что С - это просто сахарок над asm.

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

Это ты покажи. cargo вот есть и оно работает под все платформы, обеспечивая одинаковое поведение. Ты же утверждаешь, что homebrew это нормальная замена cargo.
Ты же утверждаешь, что homebrew это нормальная замена cargo.
нормальная

ЛПП, не нормальная, ибо оно не кроссплатформенное на данный момент.

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

И заодно вертеть линуксовые ПМ-ы и ставить софт в обход их.
Хорошо.

Ты хоть понимашь в чём проблема, или попугайствуешь повторяя зазубренное?

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

Ты попросил аналог, я тебе привел.

Тут есть утверждение что нужно ставить софт через ТОЛЬКО пакетный мененджер дистрибутива. А так - у многих языков свой пакетный менеджер.

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

Ты хоть понимашь в чём проблема, или попугайствуешь повторяя зазубренное?

А ты у нас ещё один адепт виндовс-вея с зоопарком «ПМ-ов» и софтом в хоумах?

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

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

Шта?! С 1.0 ничего кардинально не менялось.

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

Безусловно невозможно понять другого человека, если всё, что хочется сделать - это покритиковать, вырвав из контекста сказанного им 2-3 слова случайным образом. Ещё желательно отвечать на сообщение в одной теме, а контекст взять из другой.

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

Тогда где пример аналога того что делает cargo, но использующий исключительно пм системы?

Чего?

Ты не понимаешь для чего нужны пакетные менеджеры?
Не, эту ветку я заканчиваю, ты вообще некомпетентный.

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

Шта?! С 1.0 ничего кардинально не менялось

кардинально

Ну ты понел.

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

Чего?

Ты же распинался про то что не юниксвейно?

Ты не понимаешь для чего нужны пакетные менеджеры?

Управления пакетами же! Но это не повод впихивать в apt механизм для определения зависимостей на git репозиториях же!

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

Посмотрите сколько потоков создаёт хром или тот же dropbox. Сильно удивитесь.

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

В винде-то? В винде-то ещё тот зоопарк.

Виндузятник?

Жертвовать безопасностью ради портабельности?

У тебя есть непортабельная сборка tor? У тебя есть версия плагинов для фокса лежащая не в хомяке каждого пользователя?

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