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

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

Увеличение мажорной версии (X.y.z -> (X + 1).0.0) означает поломку обратной совместимости.

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

Ну, так-то rust поддерживает sjw-сообщество.

sjw-сообщество

Это еще куда? Как объяснять подрастающему поколению стыдобушку?

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

Увеличение мажорной версии (X.y.z -> (X + 1).0.0) означает поломку обратной совместимости.

И отсутствие средств, обеспечивающих обратную совместимость, означает несовместимость с долгой жизнью.

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

Это когда в 2017 еще не все библиотеки умеют в threads.h, ибо оно опционально?

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

anonymous
()

Ппц, сколько лет языку, они его всё пилят и пилят. Сами загоняют в могилу же, ибо кто, кроме хипстеров, будет писать на языке который меняется каждую неделю? Казалось бы, сделать простой и удобный стандарт языка, да танцуй вокруг него, но нет, мы будет 5 лет ломать совместимость, потом сделаем релиз и начнём добавлять костыли, а когда закончим, будем долго править баги (если раньше не забросим).

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

ломать совместимость

пруф, или лжец.

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

Сравним с «C».
Это как сравнивать гения с ммм... мягко скажем с субъектом со способностями ниже среднего.

Нет, это как сравнивать сборку телеги с проектированием аэроплана.

Esper
()

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

убийцы С++ почти смогли в union, но...

Объединения это вид перечислений (enums), но в отличие от последних они «непомечены» («untagged»).

...не смогли.

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

К чему у тебя претензии? Или просто мозгов не хватает понять, что enum в Rust и enum в С - это совершенно разные вещи, и enum в Rust это что-то вроде

struct {
  enum { TYPE1, TYPE2 } tag;
  union {
    type1 variant1;
    type2 variant2;
  }
И в таком виде enum прекрасно заменяет почти любые применения union, кроме байтодрочерства.

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

в Rust очень много вещей сделано под копирку из Haskell

то-то растаманы всё грозятся С++ убить, а на выходе недобраузер с 330 потоками повесился.

ckotinko ☆☆☆
()

Команда Rust рада объявить о последней версии Rust, 1.19.0

Хипсторы плачут и крутят спиннеры, плачут и крутят.

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

Сравним с «C». Собственно говоря, этим можно закончить.

Выдрать куски из BCPL, назвать B, добавить операторов, соответствующих ассемблерным инструкциям PDP-11, назвать C, переписать с ассемблера на С 10000 строк кода Unix...

После 20 инсталляций Unix'а решить, что нечего ломать обратную совместимость языка - и так сойдёт.

Через 15 лет стандартизировать.

Да, пожалуй можно закончить.

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

glibc насколько помню, до сих пор не умеет. Умеет в плюсовые (c++11) <threads> но не сишные (c11) <threads.h>

Точнее musl умеет, а повсеместный glibc - нет. Вот тебе пруф: https://gcc.gnu.org/wiki/C11Status

Майки, кстати, тоже на Си забили. У них даже по C11 Support ничего не гуглится, на C++11 и более поздние кидает, именно на плюсы.

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

Ничем не хуже c++

Не про цепепе речь, а то я могу аргументировать вот так:

Ничем не хуже Befunge. А чаще даже лучше.

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

После 20 инсталляций Unix'а решить, что нечего ломать обратную совместимость языка - и так сойдёт.

Вот прям так чувствуется что «и так сойдёт». Не наконец то написали что то годное, а не «и так сойдёт».

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

Очень странный пассаж, учитывая, что в Rust очень много вещей сделано под копирку из Haskell. Ты, наверное, с Haskell совсем не знаком?

А примеры можно?
Я не на правах троллинга или растофанбоя/растохейтера, просто интересно.

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

то-то растаманы всё грозятся С++ убить, а на выходе недобраузер с 330 потоками повесился.

Так забросили его. quantum взялись разрабатывать

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

из твоих примеров есть хеллоось на расте, которая ненужно, браузерный движок который умирает от вила ЛОРа наплодил 330 потоков и карга, которая сделана для раста.

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

330 потоков! это уже показатель, что в датском королевстве что-то сдохло и протухло. причем протухло еще в мозгах разработчиков.

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

Нет, это как сравнивать сборку телеги с проектированием аэроплана.

Да-да-да. Еще лет тридцать, и все задохнутся от восхищения от языка-конфетки.

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

330 потоков это значит что софт написан через ЖЁППУ.

что такого можно делать в 330 потоков на вебстранице, даже если каждое действие делать в отдельном потоке? сеть -раз, парсер - два, gui - три, layout считать - четыре.... мы до 50 не доберемся даже.

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

glibc насколько помню, до сих пор не умеет.

Не передергивай. Есть issue, не значит «не умеет». Жизнь сложна, и вообще, «тело пердит, значит живое»(C). Большинство устраивает.

Майки, кстати, тоже на Си забили. У них даже по C11 Support ничего не гуглится, на C++11

Ага. Шалашовки они потасканные. Тем не менее их библиотека «С» их же потоки поддерживает полностью. (Когда эти редиски, нехорошие люди, поддержку pthreads запилят?)

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

не смогли в union. что тут непонятного? по идеологическим соображениям не могут в union, поэтому union у них разновидность enumа

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

что такого можно делать в 330 потоков на вебстранице
сеть -раз, парсер - два, gui - три, layout считать - четыре.... мы до 50 не доберемся даже.

У тебя всё синхронно происходит, да?

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

Ты идиот или слепой? Мой предыдущий ответ не видел? Ну я напишу еще раз.

К чему у тебя претензии? Или просто мозгов не хватает понять, что enum в Rust и enum в С - это совершенно разные вещи, и enum в Rust это что-то вроде

struct {
  enum { TYPE1, TYPE2 } tag;
  union {
    type1 variant1;
    type2 variant2;
  } data;
}
И в таком виде enum прекрасно заменяет почти любые применения union, кроме байтодрочерства.

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

Сравним с «C». Собственно говоря, этим можно закончить

Выдрать куски из BCPL, назвать B, добавить операторов, соответствующих ассемблерным инструкциям PDP-11, назвать C, переписать с ассемблера на С 10000 строк кода Unix... После 20 инсталляций Unix'а решить, что нечего ломать обратную совместимость языка - и так сойдёт.

Ты жалок.

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

И если у такого enum удалить tag, то получится чистый union из C. Но естественно он станет небезопасным, поэтому он требует обязательно unsafe (в C это не надо, так как там в принципе нет безопасного кода).

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

Начиная с мелочей, как превалирующая иммутабельность, продолжая паттерн-матчингом, enum как ADT, и заканчивая такими вещами, как struct как record, очень похожей модульной системой, trait как type class, generics constraint как type class constraint, impl как instance и тому подобным. А trait object в Haskell будет через forall.

Детали могут отличаться, и они отличаются, ключевые слова иногда по другому выглядят, но сама работа с объектами (не в чистых терминах ООП - его нет ни там, ни там) очень похожа - узнаю тот же самый стиль.

Создаем структуру в Rust. Помещаем в модуль. Так достигаем инкапсуляции. Структура может реализовать такой-то trait, где некоторые функции могут вызываться при выполнении таких-то ограничений. Trait уже может предоставлять готовую часть функциональности. Trait может наследовать другие traits. Все это именно то, как пишутся программы на Haskell. И по моим сведениям буквально в таком виде больше нет ни в одном другом популярном языке (индекс TIOBE >= 20)

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

я надеялся что вы программист.

очевидно же что можно работать по событиям, можно часть работы вывести в поток и кидать туда сообщения. но даже если осатанело дробить всё на потоки - три сотни не набрать. нормальному человеку, конечно, а не курильщику. а потом оно сдохло, потому что нерабы. смерть С++.

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

где твой BCPL? он сдох потому что был говном.

Это не мой BCPL, это - Кена Томпсона BCPL. То есть, ко всему прочему, из говна конфетку слепили?

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

Но не для работы же, очевидно.

Неочевидно.

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

Ну началось «я надеялся что вы меня поймёте». В случае с servo гораздо важнее поддержка веб стандартов.

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

Методика подсчёта дробления на потоки будет?

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

Redox - операционная система написанная на Rust

Ось на луа (ну, в основном, на чистом луа-то явно не напишешь ось) — https://github.com/jvburnes/node9
Ось на коммон лишпе — https://github.com/froggey/Mezzano
Ось на го — http://lsub.org/ls/clive.html.
Да их на всём подряд пишут.

Servo - Браузерный движок написанный на Rust, но не только лишь на нём =)

От самой же моззилы, ага.

Cargo - Это сайт, утилита, сборище крайтев, короче, то место где Rust обрастает библиотеками и позволяет этим удобно делиться.

pip, cabal и 100500 подобного.

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

из твоих примеров есть хеллоось на расте, которая ненужно, браузерный движок который умирает от вила ЛОРа наплодил 330 потоков и карга, которая сделана для раста.

Суть вопроса анонимоса была в том написали ли что-то на Rust или нет!? Так вот для молодого языка я считаю, что написали уже много и продолжают писать. Со временем на Rust будет больше больших проектов т.к. мне кажется, что у многих разработчиков будет повторяться такая же история как у Mozzila с Servo, это когда много сложного кода на Си\Си++ и он течёт и багует во все щели.

Так вот мне кажется, что для языка который стабилен только 2 года это достижение, есть ли такие наработки на D или Go? Сомневаюсь. А ждать, много-много миллионов строк кода за 2 года ну это глупо. Еще и игруля какая-то есть на Rust, лениво искать, вроде как Shar называется.

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

Увеличение мажорной версии (X.y.z -> (X + 1).0.0) означает поломку обратной совместимости.

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

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

«Солгавши раз, кто тебе поверит?»
И нет, не будет. Это противоречит духу сообщества rust.

У меня монитор жиром заплыл

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

у многих разработчиков будет повторяться такая же история как у Mozzila с Servo, это когда много сложного кода на Си\Си++ и он течёт и багует во все щели.

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

а потом выкатывают такие убивцы С++ свои кошельки для кококоинов на расте а там решето.

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