- PVSM.RU - https://www.pvsm.ru -
Мы рады представить новую версию Rust 1.12. Rust — это системный язык программирования, нацеленный на безопасную работу с памятью, скорость и параллельное выполнение кода.
Как обычно, вы можете установить Rust 1.12 [1] с соответствующей страницы официального сайта, а также ознакомиться с подробным списком изменений [2] в этой версии на GitHub. В этот выпуск вошёл 1361 патч.
Выпуск 1.12 — возможно, самый значительный с момента выпуска 1.0. Нам есть о чём рассказать, но если у вас мало времени, вот краткое содержание.
Самое заметное для пользователей изменение в 1.12 — это новый формат ошибок, выдаваемых rustc
. Мы говорили о нём раньше [3] и это первый стабильный выпуск, где новый формат доступен всем. Эти сообщения об ошибках — результат многочисленных усилий добровольцев [4], которые спроектировали, протестировали и обновили каждую ошибку rustc
в соответствии с новым форматом. Нам интересно узнать, что вы думаете о новых ошибках:
Самое большое внутреннее изменение — переход на использование нового бэкенда компилятора, основанного на Rust MIR [5] (англ. Medium Intermediate Representation). Хотя эта особенность на данный момент не даёт нам ничего видимого пользователям, она прокладывает путь для нескольких будущих оптимизаций компилятора, и для некоторых кодовых баз она уже обеспечивает увеличение скорости компиляции и уменьшение размера сгенерированного кода.
В 1.12 мы представляем новый формат сообщений об ошибках. Он подробно отражает причины, по которым компилятор отказывается компилировать ваш код. Для этого мы помещаем ваш код в центр внимания и подсвечиваем части, которые важны в каждом конкретном случае. Мы также аннотируем каждое ошибочное место и подробно описываем, что пошло не так.
Например, если реализация типажа не совпадала с его объявлением в 1.11, вы видели такую ошибку:
В новом формате мы в первую очередь показываем самые важные части кода. В данном случае это строка объявления типажа, строка его определения, и метки, указывающие на несовпадение:
Изначально мы разрабатывали такой вид ошибок, чтобы помочь в понимании проблем, о которых сообщал анализатор заимствований (англ. borrow checker). Но по ходу дела мы поняли, что этот формат может быть применён ко множеству разных ошибок — например, как в приведеннем выше примере. Если вы бы хотели узнать о новой системе ошибок больше, смотрите предыдущий пост в блоге на эту тему [3].
Наконец, вы также можете получить эти ошибки в JSON с помощью флага. Помните ту ошибку, которую мы показали в начале поста? Вот как выглядит попытка скомпилировать тот код, передав ему при этом флаг --error-format=json
:
$ 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 и других полезных инструментов разработчиков. Такой вид вывода ошибок — маленькая часть этой работы.
Новое промежуточное представление среднего уровня (англ. 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
[6].--test-threads
, указывающий число потоков, используемых для выполнения тестов. Также этой настройкой управляет переменная окруженияRUST_TEST_THREADS
rustup component add rust-src
[11].lib/rustlib/src
.Подробнее смотрите замечания к выпуску [2].
В этом выпуске многими типами стало немного удобнее пользоваться.
Cell::as_ptr
[12] и RefCell::as_ptr
[13]IpAddr
, Ivp4Addr
и Ipv6Addr
получили несколько новых методов.LinkedList
[14] и VecDeque
[15] получили метод contains
.iter::Product
[16] и iter::Sum
[17]Option
реализует From
для содержащегося в нём типа [18]Cell
, RefCell
и UnsafeCell
реализуют From
для содержащегося в них типа [19]Cow<str>
реализует FromIterator
для char
, &str
и String
[20]SOCK_CLOEXEC
сокеты на Linux правильно закрываются в подпроцессах [21]String
реализует AddAssign
[22]Подробнее смотрите замечания к выпуску [2].
Самая интересная возможность, добавленная в Cargo в этом цикле — "workspace'ы [24]." Они определены в RFC 1525 [25], и позволяют группе пакетов разделять один и тот же файл Cargo.lock
. Если вы занимаетесь проектом, который разделён на несколько пакетов, workspace'ы сильно упрощают фиксацию единственной версии общих зависимостей. В большинстве проектов включение этой возможности потребует добавления в Cargo.toml
верхнего уровня единственной строчки, [workspace]
. Более сложным проектам может потребоваться более хитрая настройка.
Другая значительная возможность — это перегрузка пути к исходному коду контейнера [26]. Вы можете легко распространять зависимости локально (англ. vendoring), используя её в сочетании с инструментами вроде cargo-vendor [27] и cargo-local-registry [28]. Со временем на базе этого будет построена инфраструктура зеркал crates.io [29].
Ещё есть некоторые мелкие улучшения:
cargo new
получил флаг --lib
[31]cargo publish
получил флаг --dry-run
[33]Подробнее смотрите замечания к выпуску [2].
В выпуске версии 1.12 участвовало 176 человек. Большое вам спасибо!
Автор: mkpankov
Источник [34]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/195252
Ссылки в тексте:
[1] установить Rust 1.12: https://www.rust-lang.org/install.html
[2] подробным списком изменений: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1120-2016-09-29
[3] о нём раньше: https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html
[4] усилий добровольцев: https://github.com/rust-lang/rust/issues/35233
[5] MIR: https://blog.rust-lang.org/2016/04/19/MIR.html
[6] rustc
теперь поддерживает три новые цели на ARM с MUSL: arm-unknown-linux-musleabi
, arm-unknown-linux-musleabihf
и armv7-unknown-linux-musleabihf
: https://github.com/rust-lang/rust/pull/35060
[7] Ссылки: https://github.com/rust-lang/rust/pull/35611
[8] неизвестные числовые типы: https://github.com/rust-lang/rust/pull/35080
[9] Компилятор теперь может быть собран на LLVM 3.9: https://github.com/rust-lang/rust/pull/35594
[10] Запускалка тестов теперь показывает предупреждение, если выполнение тестов занимает больше 60 секунд: https://github.com/rust-lang/rust/pull/35405
[11] Вместе с выпусками Rust теперь доступны пакеты исходников, которые могут быть установлены rustup с помощью команды rustup component add rust-src
: https://github.com/rust-lang/rust/pull/34366
[12] Cell::as_ptr
: https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr
[13] RefCell::as_ptr
: https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.as_ptr
[14] LinkedList
: https://doc.rust-lang.org/std/collections/linked_list/struct.LinkedList.html#method.contains
[15] VecDeque
: https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.contains
[16] iter::Product
: https://doc.rust-lang.org/std/iter/trait.Product.html
[17] iter::Sum
: https://doc.rust-lang.org/std/iter/trait.Sum.html
[18] Option
реализует From
для содержащегося в нём типа: https://github.com/rust-lang/rust/pull/34828
[19] Cell
, RefCell
и UnsafeCell
реализуют From
для содержащегося в них типа: https://github.com/rust-lang/rust/pull/35392
[20] Cow<str>
реализует FromIterator
для char
, &str
и String
: https://github.com/rust-lang/rust/pull/35064
[21] При использовании SOCK_CLOEXEC
сокеты на Linux правильно закрываются в подпроцессах: https://github.com/rust-lang/rust/pull/34946
[22] String
реализует AddAssign
: https://github.com/rust-lang/rust/pull/34890
[23] Определения Юникода обновлены до версии 9.0: https://github.com/rust-lang/rust/pull/34599
[24] workspace'ы: https://github.com/rust-lang/cargo/pull/2759
[25] RFC 1525: https://github.com/rust-lang/rfcs/blob/master/text/1525-cargo-workspace.md
[26] перегрузка пути к исходному коду контейнера: https://github.com/rust-lang/cargo/pull/2857
[27] cargo-vendor: https://github.com/alexcrichton/cargo-vendor
[28] cargo-local-registry: https://github.com/alexcrichton/cargo-local-registry
[29] crates.io: https://crates.io/
[30] Ускорены обновления, когда обновлять ничего не надо: https://github.com/rust-lang/cargo/pull/2974
[31] cargo new
получил флаг --lib
: https://github.com/rust-lang/cargo/pull/2921
[32] После компиляции показывается время, которое занял этот процесс: https://github.com/rust-lang/cargo/pull/2909
[33] cargo publish
получил флаг --dry-run
: https://github.com/rust-lang/cargo/pull/2849
[34] Источник: https://habrahabr.ru/post/311384/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.