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

Не добавят в Питон многострочные лямбды, никогда. Поэтому никаких ДСЛ на Питоне не будет.

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

Вообще я не понимаю всей этой мути: есть семафоры, есть мутексы, всё это базовые примитивы ОС.

Базовые примитивы ОС не дают достаточных гарантий безопасной работы с общими, для потоков, ресурсами. Можно получить гонки данных. А как Вы выразились

огород высосанных из чужого носа абстракций

Это даёт такие плюшки в многопоточном программировании в Rust(копипаста):

  • Каналы (channels) передают право владения данными, которые пересылаются через них, поэтому вы можете отправить через канал указатель из одного потока в другой и не бояться, что между этими потоками возникнет гонка за доступ через этот указатель. Каналы Rust обеспечивают изоляцию потоков.
  • Блокировки (lock'и) владеют защищаемыми ими данными, и Rust гарантирует, что доступ к этим данным можно получить только тогда, когда блокировка захвачена. Состояние никогда не разделяется между потоками случайно. Концепция «синхронизируйте данные, а не код» в Rust обязательна.
  • Для каждого типа данных известно, можно ли его пересылать между потоками или можно ли к нему обращаться из нескольких потоков одновременно, и Rust обеспечивает безопасность этих действий; поэтому гонки данных исключаются, даже для lock-free-структур данных. Потокобезопасность не просто отражается в документации — она является законом.
  • Более того, вы можете использовать стек одного потока из другого, и Rust статически обеспечит его существование до тех пор, пока другие потоки используют его. Даже самые рискованные формы разделения данных гарантированно безопасны в Rust.

With

По поводу With, его как внезапно выяснилось выпиливают специально. Но внятных аргументов почему не нашёл. Вот немного копипасты

Производительность: оператор with невозможно оптимизировать автоматически, потому что заранее не известно куда будет ссылаться arg: на реальную переменную или на свойство переменной внутри with. Это может измениться при каждом вызове.

Безопасность: нельзя определить куда ссылается переменная глядя на её окрестности (её лексическое окружение). По словам Brendan Eich именно из-за этого with считается устаревшим, а не из-за соображений производительности.

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

Ох... Я не вчитывался, но похоже тут в теме люди путают разные версии «with», имеющие разные смысл. Мне известно два:

  • «with» в паскале и разнообразных диалектах бейсика. Здесь это просто синтаксический сахар для сокращения кода. Имеет очевидный минус (уже упомянули): имена из структуры или класса могут перекрывать имена в текущем неймспейсе, что может приводить к ошибкам. Хуже того, при «разворачивании» таким образом структуры или класса из стороннего модуля, код поломаться может просто из-за обновления этого стороннего модуля, если в нём определили новое поле или функцию. Ещё это ухудшает читабельность в случаях, когда блок «with» размазывает на несколько экранов текста.
  • «with» в питоне. Здесь «with» при открытии и закрытии блока кода вызывает __enter__() и __exit__() соответственно.

Первый «with» как-то не прижился в современных языках программирования. Второй «with» нужен в питоне из-за GC так как неизвестно когда именно будет вызван деструктор объекта, а деинициализацию, например закрытие сокетов или сброс буферов записи в файл, нужно сделать предсказуемо здесь и сейчас. В Rust и C++ он не нужен, так как вызов деструктора гарантируется в конкретной точке кода (кроме жёстких случаев, типа «завершение программы ударом ногой с разворота»), что повсеместно используется в RAII.

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

а новые стандарты с auto через auto старпёрам-консерваторам не упёрлись ни в какое место.

Пофиксил.

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

А потом искать по всему коду, где это t создалось и что ещё за f*ng такой с обфусцированным именем.

Блоки with...end with чётко выделяют область действия контекста.

Охереть, проблема.

do_something_without_object();
{
    let obj = &mut object.in.long.hierarchy;
    obj.A=1;
    obj.B=1;
    obj.C=1;
}
do_something_else_without_object();

Мало того, это диспилинирует, мотивируя не писать винергетокод

Нихера это не дисциплинирует, только открывает новые горизонты винегретописания созданием вложенных with и перекрыванием переменных.

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

Налицо необходимость в новой фиче, осенило ГВР, и он выдал на-гора не только with, но и механизм для создания собственных вундервафлей для работы с произвольными пользовательскими ресурсами с помощью этого with.

Вечно с ним такое. Говнокодит костыли вместо того, чтобы запилить нормальные абстракции.

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

нормальные абстракции

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

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

У хейтеров уже стулья сломались под весом нагара.

Мне из новых фич больше всего понравились union'ы (теперь дождаться когда их прикрутят к bindgen'у) и приведение чистых лямбд к указателю на функцию.

А стандартная библиотека развивается, медленно но верно. Ждём аллокаторов и asm! в stable.

grossws
()

Встретимся в августе, ждём 1.20 :}

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

У хейтеров уже стулья сломались под весом нагара.

На самом деле, предыдущие две темы срача были интереснее =) В этот раз какой-то вяло текущий поток гуана был. АнтиРастисты не начитанные, говорят не внятно, вбросов практически не делали, а жаль

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

Это не решение. Это создание лексического мусора в виде дополнительной переменной. Зачем? А если нужно так сделать 20 раз в одном блоке кода? Давай тогда назовём переменную with ;)

Представляю как вы удивитесь, когда узнаете о необходимости в Расте писать «self.» для доступа в методе к полям и методам объекта. Куда уж там до паскалевского with.

Переменная - это не мусор, это способ сообщить читателю с чем вы работаете. With требует от читателя держать в голове последовательность a.b.c, которую за with'ом спрятали, а let target = &mut a.b.c; наоборот вносит ясность: во-первых сразу сообщает, что a.b.c сейчас будет целью какого-то шага алгоритма, во-вторых позволяет внутри этой области чётко видеть, что данные из source обновляют target, а не наоборот.

Вообще, этот паскалевский with - это анахронизм типа оператора ++: дурная фича, добавленая с целью экономии 3х байт, потому что железо слабое и лишняя переменная недопустима, а компилятор тупой и не догадается, что эту переменную можно просто выкинуть.

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

А комитет вообще пытался решать эту несуществующую проблему?

Скажи честно: ты на плюсах пишешь? На С не катит - сишники велосипедить, зачастую, крайне любят и проблемы подключения библиотек у таких нет.

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

Что это ещё за блевотного вида конструкция «&mut » с пробелом после неё?

во-вторых позволяет внутри этой области чётко видеть, что данные из source обновляют target, а не наоборот.

Не понимаю, можно объяснить подробнее?

Отличие with от target-переменной в семантике: семантика «точки» однозначна, это сокращение записи. Семантика target'а абсолютно непрозрачна: надо как-то очень хитро назвать переменную, чтобы понять, что она является неким «псевдонимом» для a.b.c.d Без этого же даже умная IDE никогда не сможет сообщить, что вот эта переменная - не самостоятельный объект, а просто способ сокращения записи.

Если Вы знаете, для чего нужен target и на что он ссылается - это не значит, что Вы не будете проклинать себя же через 3 года или вам ну будет икаться, когда этот код унаследует ваш преемник/коллега.

С точкой алгоритм простой: есть начинающееся с точки нечто - смотри начало охватывающего блока, там написано, что это за точка. С target'ом алгоритм недетерминирован. Или объясните, как Вы его видите.

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

Что это ещё за блевотного вида конструкция «&mut » с пробелом после неё?

Мутабельная ссылка, очевидно же.

Семантика target'а абсолютно непрозрачна: надо как-то очень хитро назвать переменную, чтобы понять, что она является неким «псевдонимом» для a.b.c.d Без этого же даже умная IDE никогда не сможет сообщить, что вот эта переменная - не самостоятельный объект, а просто способ сокращения записи.

Go to definition уже отменили? Хотя проблема, очевидно, надуманая, так как определение нельзя сразу найти только в том случае, когда код функции занимает десятки экранов, т.е является очевидным говнокодом.

quantum-troll ★★★★★
()
Ответ на: комментарий от robus

Пишу. Опираюсь на пакетный менеджер, имеющийся в системе.

И всегда все необходимые зависимости в наличии были? Более свежих версий никогда не хотелось? Проблем с распространением из-за разных дистрибутивов не было?

DarkEld3r ★★★★★
()
Ответ на: комментарий от quantum-troll

БГ мой, это невероятно круто. А зачем было сюда какие-то странные слова из биологии привлекать? Это такой очередной у программистов эпический способ выглядеть умно за счёт использования исковерканной лексики без всякого на то разумного основания?

Эх, если бы в тот же FB добавили побольше таких словечек, позволяющих офисным работникам чувствовать себя полубогами - был бы язык популярен. А так там всё слишком просто: умеет всё то же самое, но словами красивыми обделён.

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

Это такой очередной у программистов эпический способ выглядеть умно за счёт использования исковерканной лексики без всякого на то разумного основания?

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

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

Нет. Читается как constant reference to T. В С/С++ читается с справа налево.

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

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

Обоснуй. По мне,подобная интерпретация возникает в том числе и у программистов, кругозор которых чуть шире офисного пространства. В принципе любой человек, хотя бы иногда читающий художественную литературу, интересующийся историей, архитектурой и прочими подобными бесполезными вещами - просто не может не обратить внимание на то криптографическое убожество, в которое «мутировал» язык современных monkey-кодеров. А ведь когда-то программистами были в основном умные эрудированные люди.Но их человекочас стоил дорого, поэтому индустрия тала замещать столь дорогостоящий актив болванчиками, болтающими на птичьем языке. В будущем же для написания тривиального программного кода потребность в «человекочасах» отпадёт, поскольку код под львиную долю банальных задач смогут генерировать автоматизированные системы. Но хорошо хоть между собой ИИ не станут обмениваться обфусцированными словечками.

DRVTiny ★★★★★
()
Последнее исправление: DRVTiny (всего исправлений: 2)
Ответ на: комментарий от AntonyRF

Базовые примитивы ОС не дают достаточных гарантий безопасной работы с общими, для потоков, ресурсами. Можно получить гонки данных.

А можно как-то менее голословно? Почему это работало с 60-х годов прошлого века, но тут в 2010-х пришёл Rust - и всё исправил?

Что не так с семафорами, что не так с их вырожденным случаем - мутексами?

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

Столько бреда в попытке обосновать собственное непонимание понятия «Профессиональный жаргон»...

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

В 60-х не было многопоточности.

Почему это работало

И программы не падали, ага. Многопоточность в C/C++ - адская боль.

Что не так с семафорами

Кроме тормозов?

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

Обоснуй.

Анлийский у программистов — основной рабочий язык. И английские слова для них не являются чем-то таинственным и заумным. Ни одному программисту не придёт в голову использовать англицизмы чтобы выглядеть «умно» — напротив, они являются средством выразить мысль без затей, не заморачиваясь с переводом. Да, аглицизмы зачастую уродливы, однако являются неизбежным следствием билингвизма.

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

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

Всё так, они работают. Но с семафорами компилятор не сравнивает количество enter\leave и их очерёдность. Был трах на практике, когда было около 20 000 потоков и стали случайно вылазить взаимные блокировки, выглядело это так:

// Поток 1:
semaphore1.enter();
semaphore2.enter();
// ...
semaphore2.leave();
semaphore1.leave();

// Поток 2:
semaphore2.enter();
semaphore1.enter();
// ...
semaphore1.leave();
semaphore2.leave();
]

С мютексами тож возможна взаимная блокировка, гуглите истории успеха сами.

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

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

При том, что перевод зачастую довольно кривой. Самые яркие примеры - это потоки и шаблоны. У нас всё в кучу, а в английском у нас threads/streams и patterns/templates.

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

И всегда все необходимые зависимости в наличии были?

Были. Ну у меня почти всегда это Qt 5 — он может почти всё.

Более свежих версий никогда не хотелось?

В репах всегда свежак. Ну это в норме, если репы не в норме, то тут уж ничего не поделаешь. Если хочется не просто свежак, а bleeding unstable edge, то есть git (или svn) версии в AUR, но ИМХО лучше завязываться на свежак, а не на API, которое могут сломать раньше твоего прототипа.

Проблем с распространением из-за разных дистрибутивов не было?

Нормальные дистры имеют системы сборки пакетов.

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

Изменчивая ссылка? В плюсах это будет const T &.

изменяемая сноска на тип T :)
Вернее, даже «сноска на значение типа T, позволяющая изменять его».

Virtuos86 ★★★★★
() автор топика
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от quantum-troll

Мутации к англицизмам не имеют никакого отношения, а тот факт, что компилятор добавляет простой флаг из одного бита на переменную, не позволяя её изменять (генерируя исключение времени компиляции, если такая попытка есть) - каким-либо образом с mutation'ами связать весьма затруднительно. Есть «ссылка только для чтения», есть «доступ на запись», можно даже «неизменяемая ссылка», но «мутации» - это, пожалуй, самое уродливое, что здесь можно использовать. Здесь не англицизмы заметны, а банальное умничанье не по делу и попытки сократить что-то, превратив речь в какой-то набор отсылок к некоей китайской книге перемен.

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

Это всё понятно, но речь же шла о том, зачем для таких банальных вещей в Rust придумали свои словечки и сделали из простого исключения взаимных блокировок какую-то таинственную Rust-технологию. Опять же, на проблему взаимных блокировок обратили внимание за 50 лет до создания Rust'а - что нового добавляет Rust и для чего нужны угловые скобки с 3-х кратной вложенностью?

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

«Позвольте мне получить сноску на значение с типом T, и эту сноску дабы позволено мне было менять, и имя ей пусть будет 'a'».

Некоторым пациентам из этого треда явно по-вкусу такие извращения.

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

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

В любом случае &mut в этом контексте выглядит не менее похожим на НЛО, нежели & после const T. Экономим на ресурсе клавиатуры или пальцев рук?

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

Не хочу разрушать вашу бредовую теорию, но понятие mutable появилось ещё тогда, когда о rust даже автор не помышлял.

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

«Ссылка» это ересь какая-то. Что означает «ссылка на тип»? Тип отправили в Сибирь? Или он что-то сказал/написал, а мы ссылаемся на его мнение? А сноска есть сноска. ))

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