Rust 1.96.0: новый стабильный релиз с улучшениями компилятора и стандартной библиотеки

mr. Cooper 1 месяц назад Инсайды и новости
Rust 1.96.0: новый стабильный релиз с улучшениями компилятора и стандартной библиотеки

Я обновляю Rust каждые шесть недель. Это как чистка зубов - не замечаешь процесса, но потом удивляешься, почему раньше терпел.

Вышел 1.96.0.

Никаких новых фич. Никакого синтаксиса. Ничего, что можно было бы показать на демо-стенде.

И именно поэтому я обрадовался.

Когда я только начинал работать с Rust, я ждал больших релизов. Новая версия, новый синтаксис, новая возможность.

Сейчас я жду стабилизаций.

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

Rust 1.96.0 - именно такой релиз.

Type inference теперь не врёт (почти)

У меня есть проект, где цепочка вызовов может быть длиной в 5–6 функций. Раньше, когда компилятор выдавал ошибку, я часто получал рекомендацию, которая не указывала на реальную проблему. Ошибка выводилась не из источника, а из промежуточного состояния вывода типов.

Ты смотришь на диагност, видишь совет, следуешь ему, а проблема не исчезает. Потому что первопричина - на два шага раньше.

В 1.96.0 это исправили.

Теперь ошибка показывает, где реальный конфликт типов, а не его симптом. Я проверил на старом проекте. Там было три места, где диагностика раньше сбивала с толку. Два из них исчезли. Третье - стало понятнее.

Это мелочь. Но когда ты сидишь вечером с сотней ошибок после слияния веток - мелочи имеют значение.

Never-type и туплы: редкий баг, который мы нашли случайно

В моей команде был случай. Кто-то переписал обработчик ошибок, использовал panic! в ветвлении, а компилятор начал выдавать странное поведение при выводе типов в tuple expression. Мы потратили час на то, чтобы понять, что происходит.

В 1.96.0 это исправили.

Never-type ! теперь корректно работает в контексте tuple-выражений. Я не буду углубляться в детали - скажу только, что это устраняет редкую несогласованность, которая могла выстрелить в самый неожиданный момент.

Диапазоны перестали быть загадкой

Наиболее значимое изменение в стандартной библиотеке.

Range, RangeFrom и RangeInclusive теперь ведут себя согласованно с IntoIterator. Раньше диапазоны могли демонстрировать разное поведение в зависимости от контекста: где-то они вели себя как copy-типы, где-то - как итераторы.

Это раздражало. Особенно когда ты писал обобщённый код, работающий с разными типами диапазонов.

Теперь это унифицировано. Диапазоны предсказуемы как value-type конструкция.

Я проверил на своих проектах. В одном месте раньше нужно было явно преобразовывать RangeInclusive в итератор. Теперь можно убрать обёртку. Код стал чище на три строчки.

Не много. Но приятно.

assert_matches! научили говорить

До 1.96.0, когда assert_matches! падал, ты получал строковое описание значения, которое не совпало с паттерном.

Теперь - структурированное представление.

Я работаю с проектом, где активно используются enum-машины состояний. Там плотность паттернов высокая. Раньше, чтобы понять, почему тест упал, приходилось вручную разбирать вывод. Сейчас диагностика сама показывает, в чём расхождение.

Экономит 10–15 минут в неделю. За год - это несколько дней.

Cargo закрывает дыры в цепочке поставок

В корпоративных проектах мы используем приватные registry. Там свои репозитории, свои прокси, свои схемы.

Раньше Cargo мог неконсистентно интерпретировать источники пакетов в приватных окружениях. Это создавало риск: потенциальная атака через нестандартный URL или архив.

В 1.96.0 это закрыли.

Нормализация URL и обработка архивов теперь строже. crates.io не затронуто, а вот для приватных registry изменения заметны.

Наш DevOps на днях сказал: «Ну наконец-то».

WASM перестал молчать

Раньше, когда компилятор встречал undefined symbols в WASM-таргете, он мог интерпретировать их как неявные импорты из env namespace.

Ты компилируешь, загружаешь в браузер, и только там, в рантайме, обнаруживаешь, что чего-то не хватает.

Теперь такие случаи - явная ошибка линковки. На этапе компиляции. До того, как ты запустил сборку.

Это строже. Но это честнее.

Архитектуры: RISC-V, LoongArch, s390x

Я не работаю с этими платформами. Но меня радует, что Rust продолжает их поддерживать.

Inline assembly для s390x уточнён. Профили для RISC-V и LoongArch обновлены.

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

Что я понял про этот релиз

Rust 1.96.0 не добавляет фич. Он исправляет поведение.

Type inference стал точнее. Диапазоны - предсказуемее. Cargo - надёжнее. WASM - строже.

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

Я веду один проект уже три года. За это время мы обновляли Rust десятки раз. И я заметил, что лучшие релизы - не те, где появилось что-то новое.

А те, где перестало болеть то, что уже было.

Rust 1.96.0 - именно такой.

Я не знаю, когда выйдет следующая большая фича.

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

Потому что предсказуемость - это то, ради чего я выбрал Rust.

Комментарии

Пока нет комментариев. Будьте первым, кто напишет.

Чтобы оставить комментарий, войдите в аккаунт.

Похожие статьи