LINUX.ORG.RU

Rust 1.12

 


1

6

Команда разработчиков Rust рада представить релиз Rust 1.12 — системного языка программирования, нацеленного на безопасную работу с памятью, скорость и параллельное выполнение кода. В этот релиз вошёл 1361 патч.

Новое в 1.12

По словам разработчиков, релиз 1.12 является, возможно, самым значительным с момента выпуска релиза 1.0. Самое заметное для пользователей изменение в версии 1.12 — это новый формат ошибок, выдаваемых rustc. Сообществом была проделана многочасовая работа по переводу вывода ошибок на новый формат. Кроме того, для лучшей интеграции и взаимодействия со средой разработки и другим инструментарием ошибки теперь можно выводить в формате JSON при помощи специального флага --error-format=json.

Самое большое внутреннее изменение — это переход на новый формат внутреннего представления программы MIR. Незаметное сегодня, это изменение открывает путь к череде будущих оптимизаций компилятора, и для некоторых кодовых баз оно уже показывает улучшения времени компиляции и уменьшение размера кода. Переход на MIR открывает ранее сложнодоступные возможности анализа и оптимизации. Первое из многочисленных грядущих изменений — переписывание прохода, генерирующего промежуточное представление LLVM, того, что rustc называет «трансляцией». После многомесячных усилий новый бэкенд, основанный на MIR, доказал, что готов к реальной работе. MIR содержит точную информацию о потоке управления программы, поэтому компилятор точно знает, перемещены типы или нет. Это значит, что он статически получает информацию о том, нужно ли выполнять деструктор значения. В случаях, когда значение может быть перемещено или не перемещено в конце области действия, компилятор просто использует флаг из одного бита на стеке, что, в свою очередь, проще для оптимизации проходов в LLVM. Конечный результат — уменьшенный объем работы компилятора и менее раздутый код во время исполнения.

Другие улучшения:

  • Множество мелких улучшений документации.
  • rustc теперь поддерживает три новые цели MUSL на платформе ARM: arm-unknown-linux-musleabi, arm-unknown-linux-musleabihf и armv7-unknown-linux-musleabihf. Эти цели поддерживают статически скомпонованные бинарные файлы. Однако, в собранном виде они пока не распространяются.
  • Повышена читабельность описаний ошибок в ссылках и неизвестных числовых типах.
  • Компилятор теперь может быть собран с LLVM 3.9.
  • Тестовые бинарные файлы теперь поддерживают аргумент --test-threads для указания количества потоков для запуска тестов, который действует точно так же, как переменная окружения RUST_TEST_THREADS.
  • В случае продолжительности выполнения тестов больше минуты показывается предупреждение.
  • Вместе с выпусками Rust теперь доступны пакеты с исходными кодами, которые можно установить при помощи rustup через команду % rustup component add rust-src. Исходные коды могут быть использованы для интеграции и взаимодействия со средой разработки и другим инструментарием.
  • Ускорено обновление индекса реестра.
  • cargo new получил флаг --lib.
  • Добавлен вывод профиля сборки (release/debug) после компиляции.
  • cargo publish получил флаг --dry-run.
  • Сокеты на Linux в подпроцессах теперь закрываются правильно через вызов SOCK_CLOEXEC.
  • Определения Unicode обновлены до 9.0.

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

  • Cell::as_ptr и RefCell::as_ptr.
  • IpAddr, Ivp4Addr и Ipv6Addr получили несколько новых методов.
  • LinkedList и VecDeque теперь имеют новый метод contains.
  • iter::Product и iter::Sum.
  • Option реализует From для содержащегося в нём типа.
  • Cell, RefCell и UnsafeCell реализует From для содержащихся в них типах.
  • Cow<str> реализует FromIterator для char, &str и String.
  • String реализует AddAssign.

Возможности Cargo

Самая большая возможность, добавленная в Cargo в этом цикле — «рабочие области». Описанные в RFC 1525, рабочие области позволяют группе пакетов разделять один общий файл Cargo.lock. Это позволяет намного легче придерживаться единственной версии общих зависимостей при наличии у вас проекта, который делится на несколько пакетов. Для включения этой возможности в большинстве мультипакетных проектов достаточно добавить одну единственную строчку [workspace] в Cargo.toml верхнего уровня, более сложным установкам может потребоваться дополнительная настройка.

Другая существенная возможность — переопределение источника пакета. При помощи инструментов cargo-vendor и cargo-local-registry можно переопределять зависимости локально (vendoring). Со временем это станет фундаментом для построения инфраструктуры зеркал crates.io.

>>> Подробный список изменений

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

★★★★★

Проверено: Falcon-peregrinus ()
Последнее исправление: Falcon-peregrinus (всего исправлений: 10)

Традиционный вопрос — а IDE нормальное запилили? Чтоб с нормальной навигацией и автодополнением.

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

А рефактринг и навигацию по коду регэкспом делать? Вообще, в курсе, что такое «нормальное IDE» или только на картинках видели?

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

юзай vim, и будет тебе счастье

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

Навинация по символам есть, рефакторинг пока что нет.
Ребята там пилят некий oracle, демон для предоставления IDEшкам информации о коде, типах и проч. Как запилят — будет «нормальное IDE»

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

Любой редактор на вкус и цвет + racer + rustsym.

С каких пор текстовый редактор + индексер сорцов == IDE? Я с тем же успехом могу в голом Kate писать код. Где рефакторинг, отладка, проверка ошибок на лету и т.д?

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

Чтоб с нормальной навигацией и автодополнением.

Где рефакторинг, проверка ошибок на лету и т.д

Аппетиты растут на ходу :)

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

Где рефакторинг, отладка, проверка ошибок на лету и т.д?

Рефакторинга, ЕМНИП, ещё нигде нету, а что не так с остальным?

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

Где рефакторинг, отладка, проверка ошибок на лету и т.д?

Возьми Vim и обмажь плагинами по вкусу

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

Ну хз, мне хватает обычного редактора для rust (внезапно VSCode, много что перепробовал).
Есть даже отладка более-менее вменяемая, но не особо удобная по причине неумения в растовскую специфику вроде ZDT.
Но она нужна реально очень редко — все косяки, к которым реально нужен дебаггер статически отлавливаются еще на этапе компиляции, остальные вычитываются / дебажатся «алертами».
Последний раз юзал, когда писал свои реализации коллекций с ансейфом

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

Какой объем проекта? Сколько внешних зависимостей? Дополнение крейтов из зависимостей - самая большая боль.

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

Какой объем проекта?

< 5000 SLOC

Сколько внешних зависимостей?

diesel-rs

Дополнение крейтов из зависимостей - самая большая боль.

Натравил racer на ~/.cargo, нормально перемалывает (после первой сборки и резолва зависимостей, конечно)

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

5000 SLOC

У меня ~14. Без нормальной IDE уже тяжеловато.

Модерн с обмазыванием C++14 STL или с ручным управлением памятью?

При чём тут C++? Тем не менее? я пишу на С++11/Qt с QSharedDataPointer. STL не перевариваю.

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

Я к тому что C++ бывает разный и разница в шансе поломать память неверным движением руки. А там дебаггер уже обычно нужен

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

А дебаггер сильно спасает когда нужно написать что-то использующее хотя бы пару потоков?

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

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

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