Анонс Rust 1.12
Мы рады представить новую версию Rust 1.12. Rust — это системный язык программирования, нацеленный на безопасную работу с памятью, скорость и параллельное выполнение кода.
Как обычно, вы можете установить Rust 1.12 с соответствующей страницы официального сайта, а также ознакомиться с подробным списком изменений в этой версии на GitHub. В этот выпуск вошёл 1361 патч.
Что вошло в стабильную версию 1.12
Выпуск 1.12 — возможно, самый значительный с момента выпуска 1.0. Нам есть о чём рассказать, но если у вас мало времени, вот краткое содержание.
Самое заметное для пользователей изменение в 1.12 — это новый формат ошибок,
выдаваемых rustc
. Мы говорили о нём раньше и это первый
стабильный выпуск, где новый формат доступен всем. Эти сообщения об ошибках —
результат многочисленных усилий добровольцев,
которые спроектировали, протестировали и обновили каждую ошибку rustc
в соответствии с новым форматом. Нам интересно узнать, что вы думаете
о новых ошибках:
Самое большое внутреннее изменение — переход на использование нового бэкенда компилятора, основанного на Rust MIR (англ. Medium Intermediate Representation). Хотя эта особенность на данный момент не даёт нам ничего видимого пользователям, она прокладывает путь для нескольких будущих оптимизаций компилятора, и для некоторых кодовых баз она уже обеспечивает увеличение скорости компиляции и уменьшение размера сгенерированного кода.
Переработанные сообщения об ошибках
В 1.12 мы представляем новый формат сообщений об ошибках. Он подробно отражает причины, по которым компилятор отказывается компилировать ваш код. Для этого мы помещаем ваш код в центр внимания и подсвечиваем части, которые важны в каждом конкретном случае. Мы также аннотируем каждое ошибочное место и подробно описываем, что пошло не так.
Например, если реализация типажа не совпадала с его объявлением в 1.11, вы видели такую ошибку:
В новом формате мы в первую очередь показываем самые важные части кода. В данном случае это строка объявления типажа, строка его определения, и метки, указывающие на несовпадение:
Изначально мы разрабатывали такой вид ошибок, чтобы помочь в понимании проблем, о которых сообщал анализатор заимствований (англ. borrow checker). Но по ходу дела мы поняли, что этот формат может быть применён ко множеству разных ошибок — например, как в приведённом выше примере. Если вы бы хотели узнать о новой системе ошибок больше, смотрите предыдущий пост в блоге на эту тему.
Наконец, вы также можете получить эти ошибки в JSON с помощью флага.
Помните ту ошибку, которую мы показали в начале поста? Вот как выглядит
попытка скомпилировать тот код, передав ему при этом флаг --error-format=json
:
1 2 3 | $ rustc borrowck-assign-comp.rs --error-format=json {"message":"cannot assign to `p.x` because it is borrowed","level":"error","spans":[{"file_name":"borrowck-assign-comp.rs","byte_start":562,"byte_end":563,"line_start":15,"line_end":15,"column_start":14,"column_end":15,"is_primary":false,"text":[{"text":" let q = &p;","highlight_start":14,"highlight_end":15}],"label":"borrow of `p.x` occurs here","suggested_replacement":null,"expansion":null}],"label":"assignment to borrowed `p.x` occurs here","suggested_replacement":null,"expansion":null}],"children":[],"rendered":null} {"message":"aborting due to previous error","code":null,"level":"error","spans":[],"children":[],"rendered":null} |
На самом деле мы опустили некоторые детали в целях краткости, но идея понятна. Этот вывод в основном предназначен для инструментов; мы продолжаем работать над поддержкой IDE и других полезных инструментов разработчиков. Такой вид вывода ошибок — маленькая часть этой работы.
Кодогенерация через MIR
Новое промежуточное представление среднего уровня (англ. mid-level IR),
которое мы обычно называем «MIR», даёт компилятору возможности проще работать
с кодом на Rust, чем это было раньше — когда он обрабатывал абстрактное
синтаксическое дерево Rust. MIR делает возможными проверки и оптимизации,
которые раньше считались невозможными. Первое из грядущих изменений компилятора,
которое стало доступно благодаря MIR — переписывание прохода,
генерирующего LLVM IR — того, что rustc
называет «трансляцией». После многих
месяцев работы MIR-бэкенд наконец готов к выступлению на большой сцене.
MIR содержит точную информацию о потоке управления программы, поэтому компилятор точно знает, перемещены типы или нет. Это значит, что он статически знает, нужно ли выполнять деструктор значения. В случаях, когда значение может быть перемещено или не перемещено в конце блока, компилятор использует флаг всего из одного бита на стеке, что намного лучше поддаётся оптимизации со стороны LLVM. Конечный результат — это меньше работы для компилятора и менее раздутый код во время исполнения. А ещё на MIR проще реализовывать новые проходы компилятора и проверять, что они работают правильно — потому что MIR — более простой «язык», чем полное AST.
Другие улучшения
- Много небольших улучшений в документации.
rustc
теперь поддерживает три новые цели на ARM с MUSL:arm-unknown-linux-musleabi
,arm-unknown-linux-musleabihf
иarmv7-unknown-linux-musleabihf
. Эти цели производят статические исполняемые файлы. Однако, в собранном виде они пока не распространяются.- Ссылки и неизвестные числовые типы теперь лучше показываются в сообщениях об ошибках.
- Компилятор теперь может быть собран на LLVM 3.9
- Исполняемые файлы тестов теперь поддерживают аргумент
--test-threads
, указывающий число потоков, используемых для выполнения тестов. Также этой настройкой управляет переменная окруженияRUST_TEST_THREADS
- Запускалка тестов теперь показывает предупреждение, если выполнение тестов занимает больше 60 секунд
- Вместе с выпусками Rust теперь доступны пакеты исходников, которые могут быть
установлены rustup с помощью команды
rustup component add rust-src
. Полученный исходный код может быть использован инструментами и IDE, и расположен в sysroot в директорииlib/rustlib/src
.
Подробнее смотрите замечания к выпуску.
Стабилизация библиотек
В этом выпуске многими типами стало немного удобнее пользоваться.
Cell::as_ptr
иRefCell::as_ptr
IpAddr
,Ipv4Addr
иIpv6Addr
получили несколько новых методов.LinkedList
иVecDeque
получили методcontains
.iter::Product
иiter::Sum
Option
реализуетFrom
для содержащегося в нём типаCell
,RefCell
иUnsafeCell
реализуютFrom
для содержащегося в них типаCow<str>
реализуетFromIterator
дляchar
,&str
иString
- При использовании
SOCK_CLOEXEC
сокеты на Linux правильно закрываются в подпроцессах String
реализуетAddAssign
- Определения Юникода обновлены до версии 9.0
Подробнее смотрите замечания к выпуску.
Возможности Cargo
Самая интересная возможность, добавленная в Cargo в этом цикле —
«workspace’ы.» Они определены
в RFC
1525,
и позволяют группе пакетов разделять один и тот же файл Cargo.lock
.
Если вы занимаетесь проектом, который разделён на несколько пакетов,
workspace’ы сильно упрощают фиксацию единственной версии общих зависимостей.
В большинстве проектов включение этой возможности потребует добавления
в Cargo.toml
верхнего уровня единственной строчки, [workspace]
. Более
сложным проектам может потребоваться более хитрая настройка.
Другая значительная возможность — это перегрузка пути к исходному коду контейнера. Вы можете легко распространять зависимости локально (англ. vendoring), используя её в сочетании с инструментами вроде cargo-vendor и cargo-local-registry. Со временем на базе этого будет построена инфраструктура зеркал crates.io.
Ещё есть некоторые мелкие улучшения:
- Ускорены обновления, когда обновлять ничего не надо
cargo new
получил флаг--lib
- После компиляции показывается время, которое занял этот процесс
cargo publish
получил флаг--dry-run
Подробнее смотрите замечания к выпуску.
Разработчики версии 1.12
В выпуске версии 1.12 участвовало 176 человек. Большое вам спасибо!
- Aaron Gallagher
- abhi
- Adam Medziński
- Ahmed Charles
- Alan Somers
- Alexander Altman
- Alexander Merritt
- Alex Burka
- Alex Crichton
- Amanieu d’Antras
- Andrea Pretto
- Andre Bogus
- Andrew
- Andrew Cann
- Andrew Paseltiner
- Andrii Dmytrenko
- Antti Keränen
- Aravind Gollakota
- Ariel Ben-Yehuda
- Bastien Dejean
- Ben Boeckel
- Ben Stern
- bors
- Brendan Cully
- Brett Cannon
- Brian Anderson
- Bruno Tavares
- Cameron Hart
- Camille Roussel
- Cengiz Can
- CensoredUsername
- cgswords
- Chiu-Hsiang Hsu
- Chris Stankus
- Christian Poveda
- Christophe Vu-Brugier
- Clement Miao
- Corey Farwell
- CrLF0710
- crypto-universe
- Daniel Campbell
- David
- decauwsemaecker.glen@gmail.com
- Diggory Blake
- Dominik Boehi
- Doug Goldstein
- Dridi Boukelmoune
- Eduard Burtescu
- Eduard-Mihai Burtescu
- Evgeny Safronov
- Federico Ravasio
- Felix Rath
- Felix S. Klock II
- Fran Guijarro
- Georg Brandl
- ggomez
- gnzlbg
- Guillaume Gomez
- hank-der-hafenarbeiter
- Hariharan R
- Isaac Andrade
- Ivan Nejgebauer
- Ivan Ukhov
- Jack O’Connor
- Jake Goulding
- Jakub Hlusička
- James Miller
- Jan-Erik Rediger
- Jared Manning
- Jared Wyles
- Jeffrey Seyfried
- Jethro Beekman
- Jonas Schievink
- Jonathan A. Kollasch
- Jonathan Creekmore
- Jonathan Giddy
- Jonathan Turner
- Jorge Aparicio
- José manuel Barroso Galindo
- Josh Stone
- Jupp Müller
- Kaivo Anastetiks
- kc1212
- Keith Yeung
- Knight
- Krzysztof Garczynski
- Loïc Damien
- Luke Hinds
- Luqman Aden
- m4b
- Manish Goregaokar
- Marco A L Barbosa
- Mark Buer
- Mark-Simulacrum
- Martin Pool
- Masood Malekghassemi
- Matthew Piziak
- Matthias Rabault
- Matt Horn
- mcarton
- M Farkas-Dyck
- Michael Gattozzi
- Michael Neumann
- Michael Rosenberg
- Michael Woerister
- Mike Hommey
- Mikhail Modin
- mitchmindtree
- mLuby
- Moritz Ulrich
- Murarth
- Nick Cameron
- Nick Massey
- Nikhil Shagrithaya
- Niko Matsakis
- Novotnik, Petr
- Oliver Forral
- Oliver Middleton
- Oliver Schneider
- Omer Sheikh
- Panashe M. Fundira
- Patrick McCann
- Paul Woolcock
- Peter C. Norton
- Phlogistic Fugu
- Pietro Albini
- Rahiel Kasim
- Rahul Sharma
- Robert Williamson
- Roy Brunton
- Ryan Scheel
- Ryan Scott
- saml
- Sam Payson
- Samuel Cormier-Iijima
- Scott A Carr
- Sean McArthur
- Sebastian Thiel
- Seo Sanghyeon
- Shantanu Raj
- ShyamSundarB
- silenuss
- Simonas Kazlauskas
- srdja
- Srinivas Reddy Thatiparthy
- Stefan Schindler
- Stephen Lazaro
- Steve Klabnik
- Steven Fackler
- Steven Walter
- Sylvestre Ledru
- Tamir Duberstein
- Terry Sun
- TheZoq2
- Thomas Garcia
- Tim Neumann
- Timon Van Overveldt
- Tobias Bucher
- Tomasz Miąsko
- trixnz
- Tshepang Lekhonkhobe
- ubsan
- Ulrik Sverdrup
- Vadim Chugunov
- Vadim Petrochenkov
- Vincent Prouillet
- Vladimir Vukicevic
- Wang Xuerui
- Wesley Wiser
- William Lee
- Ximin Luo
- Yojan Shrestha
- Yossi Konstantinovsky
- Zack M. Davis
- Zhen Zhang
- 吴冉波