LINUX.ORG.RU

Rust 1.24

 


3

9

Команда Rust рада сообщить о выпуске Rust 1.24.0. Rust — это системный язык программирования, нацеленный на безопасность, быстрое и параллельное исполнение программ.

Если у вас уже установлена предыдущая версия через rustup, для обновления просто выполните

$ rustup update stable

Для новой установки скачайте rustup и не забудьте прочитать примечания к выпуску 1.24.0 на GitHub.

Что нового в Rust 1.24.0?

rustfmt

Несколько лет мы ждали инструмент для автоматического приведения исходного кода на Rust в «стандартный вид». Встречайте предварительную версию rustfmt! Чтобы попробовать, просто выполните

$ rustup component add rustfmt-preview

Нужно отметить два важных момента: во-первых, вы должны использовать именно rustup component add, а не cargo install. Если вы ранее использовали rustfmt через cargo install, вам необходимо предварительно его удалить. Во-вторых, не забывайте о том, что rustfmt ещё не достиг версии 1.0. Некоторые детали пока в разработке, а баги в процессе исправления. Как только rustfmt достигнет версии 1.0, компонент rustfmt-preview будет объявлен устаревшим и заменён на rustfmt.

В ближайшее время мы планируем написать отдельный пост об этой стратегии выпусков. Для дополнительной информации смотрите страницу rustfmt на GitHub.

Пошаговая сборка

Ещё в сентябре 2016 года мы подробно писали об этом в нашем блоге. Идея пошаговой компиляции довольна проста: если поддерживается этот механизм, то пересобираться будет только тот код, который был изменён с момента предыдущей компиляции. Это намного быстрее, чем полностью собирать весь проект, даже если изменения исходного кода достаточно малы. Начиная с версии 1.24, пошаговая компиляция включена по умолчанию. Не забудьте о cargo check, если будете пытаться достигнуть минимально возможного времени сборки.

Важно отметить, что и работа над производительностью компилятора в целом, и над пошаговой сборкой в частности, будет продолжена. Кое-что доступно уже в этом выпуске 1.24.0 — значение codegen-units теперь 16 по умолчанию. Одно небольшое замечание об этом изменении: оно делает компиляцию быстрее, но исполняемый файл получается немного медленнее. Для максимальной скорости программы выставьте codegen-units в 1 в вашем Cargo.toml.

Другие изменения

Есть ещё одно изменение, о котором мы хотели бы поговорить: неопределённое поведение (undefined behavior). Как правило, Rust старается избегать неопределённого поведения, исключив его полностью из безопасного (safe) кода, и сведя к минимуму в небезопасном (unsafe) коде. Одним местом, где вы всё ещё могли получить неопределённое поведение, была ситуация, когда вызов panic! проходит через FFI.

extern "C" fn panic_in_ffi() {
        panic!("Test");
}

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

В Rust 1.24 исполнение такого кода будет прерываться, а не порождать неопределённое поведение. Смотрите примечания к выпуску для более подробной информации.

Стабилизация библиотек

Если вы любитель функции str::find, которая используется для нахождения char в &str, вы будете рады узнать, что она стала быстрее в 10 раз! Этого удалось достигнуть использованием memchr. [u8]::contains теперь также его использует, хотя прирост скорости оказался более умеренным.

Несколько новых API были стабилизированы в этом выпуске:

Следующие функции теперь могут быть использованы в постоянных выражениях (constant expressions), например при инициализации static:

  • new функции для Cell, RefCell и UnsafeCell
  • new функции для различных целочисленных Atomic типов
  • {integer}::min_value и max_value
  • size_of и align_of для mem
  • ptr::null и null_mut

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

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

★★

Проверено: jollheef ()

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

SelfRef инвариантна относительно 'a, поэтому поместить туда ссылку с другим временем жизни уже не получится. Это сильно ограничивает применение. Но спасибо, что напомнили.

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

Вот бы кто-нибудь такой же умный, подвёл бы неутешительные итоги о C++ в 90м году.

Не кокетничай, ты не шалава на панели: если решился на аналогии, то верным был бы год примерно 2000-й.

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

Да ну нафиг. Я ещё тебе фору дал. В 2011м у раста даже синтаксис другой был. 2000 год - это через 2 года после стандарта 98го, вот пройдет 2 года после rust 2.0, тогда и будет «2000».

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

2000 год - это через 2 года после стандарта 98го

Напомни год предыдущего стандарта C++.

вот пройдет 2 года после rust 2.0

Хренассе, у тебя мрии. У меня есть мечты значительно более реалистичные: вот соберутся все хорошие люди и убьют всех плохих.

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

Напомни год предыдущего стандарта C++.

Напомни год хоть какого-нибудь стандарта Раста. Хитрый аноним придумал сделать вид, будто до 98го ЦПП как бы и не было, так, пробы пера?

Зачем вообще нужен был стандарт C++? Не потому ли, что существовало несколько реализаций C++ и необходимо было вносить крупные, ломающие изменения одинаково? Борланд продавали C++ с 90го года, MS и Watcom - с 93го. И это не первые реализации, это только то что на PC. MS предлагала клепать гуи программы с использованием чисто C++ библиотеки MFC тоже где-то с 93го. Следовательно, уже в начале 90х C++ считался стабильным и продакшен рэди.

Так что уровень 2000го - это через 2 года после крупной работы над ошибками в Расте. Ну, или через 10+ лет после первого стабильного релиза. Причём реально в 2000м дела у C++ шли ненамного лучше чем у Раста сейчас: что-то новое старались писать на плюсах, но в рабочих крупных проектах реально большая часть кода была на C, в лучшем случае просто скопипащена в .cpp файл, с C-style массивами. Половина «C++ программистов» колхозили свою реализацию динамически расширяемого массива для каждого типа, потому что не знали ни STL, ни шаблонов.

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

Хитрый аноним придумал сделать вид, будто до 98го... Бла-бла-бла...

Какие-то стремные вы, рустафилитики. И это только потому, что Веры истинной у вас нет. Вам бы брать пример с вяленков, вот говоришь им, что, предмету их поклонения больше 10 лет, а они - «это новый и прогресивный продукт». Говоришь им, что замена и инженерно слабая и, несмотря на свой почтенный возраст, недопиленная, а они - «он прогрессивный, и выбрасыват ненужное легаси». Они глядят на вауланд как маленькая девочка на своего папу. Вам нужно отбросить эту химеру интеллигентности.

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

В 90-м даже стандарта не было (и это ужасно), на основе какой реализации подводить итоги?

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

Ну, я не слышал об инициативе стандартизации того же Раста в ИСО... Предположим, мозила планирует подать заявку году к 2030му. Значит ли это, что до 2032го подводить итоги расту рано? Очевидно, нет.

Вики утверждает, что cfront 1.0 вышел в 85м. Сделаем скидку на нетерпеливость Страуструпа и возьмём за релиз следующую версию, когда появилось множественное и виртуальное наследование (88 год). Через 3 года был 91. Через 3 года после раста 1.0 наступил 2018. Следовательно, подводить итоги расту в 2018м настолько же пора как было крестам в 91м.

Я в принципе не против, подводите, только рискуете попасть пальцем в небо.

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

Я вообще о том, что если и сравнивать, то непонятно что с чем. Это ещё не говоря о том, что сейчас технологии развиваются намного быстрее.

В любом случае, rust сейчас мало распространён, если говорить об известных проектах, а не о изучающих/желающих его изучать. Насколько был распространённые C++ в начале 90-х не знаю, но скорее всего тоже не слишком широко.

grem ★★★★★ ()

У меня что rust, что firefox - значительная часть времени сборки на генте идёт в один поток. И я даже догадываюсь кто виноват. Вопрос: когда это пофиксят?

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

Интересно. Сам cargo по дефолту параллелит сборку.

В однопоток идет только линковка в релизном режиме

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

Разве? Он параллельно крейты собирает, но сам крейт.

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

Над этим идёт работа. Насколько я знаю, увеличение числа code units усложняет оптимизацию, поэтому используется только для debug сборок.

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

Ну rustc разбит на много крейтов, да и в лисе их дофига в зависимостях, там явно не один.

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

Насколько был распространённые C++ в начале 90-х не знаю, но скорее всего тоже не слишком широко.

Вполне себе нормально он был распространен. Это уже был мейнстримный язык с целым зоопарком компиляторов на разных платформах. Хотя само понятие «мейнстрим» вошло в обиход только лет через 10.

eao197 ★★★★★ ()

Есть ли учебники по Rust?

Есть ли учебники по Rust? То что я видел это обычные туториалы, где описывается конструкция языка. В этих туториалах примеры есть, но для обучения этого явно недостаточно. Туториальское зло заключается в том, что конструкции языка формально ты знаешь, а вот написать реальный боевой код ты не сможешь. Если ли реально обучающие учебники в стиле cook book?

anonymous ()
Ответ на: Есть ли учебники по Rust? от anonymous

https://doc.rust-lang.org/book/ — выбирай любую книгу, первой ли редакции или второй.

https://doc.rust-lang.org/nomicon/ — Rustonomicon, если хочешь угореть по хакирскому байтоперекладыванию.

Если уж после этих материалов ты не сможешь писать боевой код, то вон из профессии.

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