- PVSM.RU - https://www.pvsm.ru -

Анонс Rust 1.12

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

Как обычно, вы можете установить Rust 1.12 [1] с соответствующей страницы официального сайта, а также ознакомиться с подробным списком изменений [2] в этой версии на GitHub. В этот выпуск вошёл 1361 патч.

Что вошло в стабильную версию 1.12

Выпуск 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 и других полезных инструментов разработчиков. Такой вид вывода ошибок — маленькая часть этой работы.

Кодогенерация через MIR

Новое промежуточное представление среднего уровня (англ. mid-level IR), которое мы обычно называем "MIR", даёт компилятору возможности проще работать с кодом на Rust, чем это было раньше — когда он обрабатывал абстрактное синтаксическое дерево Rust. MIR делает возможными проверки и оптимизации, которые раньше считались невозможными. Первое из грядущих изменений компилятора, которое стало доступно благодаря MIR — переписывание прохода, генерирующего LLVM IR — того, что rustc называет "трансляцией". После многих месяцев работы MIR-бэкенд наконец готов к выступлению на большой сцене.

MIR содержит точную информацию о потоке управления программы, поэтому компилятор точно знает, перемещены типы или нет. Это значит, что он статически знает, нужно ли выполнять деструктор значения. В случаях, когда значение может быть перемещено или не перемещено в конце блока, компилятор использует флаг всего из одного бита на стеке, что намного лучше поддаётся оптимизации со стороны LLVM. Конечный результат — это меньше работы для компилятора и менее раздутый код во время исполнения. А ещё на MIR проще реализовывать новые проходы компилятора и проверять, что они работают правильно — потому что MIR — более простой "язык", чем полное AST.

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

Подробнее смотрите замечания к выпуску [2].

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

В этом выпуске многими типами стало немного удобнее пользоваться.

Подробнее смотрите замечания к выпуску [2].

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

Самая интересная возможность, добавленная в Cargo в этом цикле — "workspace'ы [24]." Они определены в RFC 1525 [25], и позволяют группе пакетов разделять один и тот же файл Cargo.lock. Если вы занимаетесь проектом, который разделён на несколько пакетов, workspace'ы сильно упрощают фиксацию единственной версии общих зависимостей. В большинстве проектов включение этой возможности потребует добавления в Cargo.toml верхнего уровня единственной строчки, [workspace]. Более сложным проектам может потребоваться более хитрая настройка.

Другая значительная возможность — это перегрузка пути к исходному коду контейнера [26]. Вы можете легко распространять зависимости локально (англ. vendoring), используя её в сочетании с инструментами вроде cargo-vendor [27] и cargo-local-registry [28]. Со временем на базе этого будет построена инфраструктура зеркал crates.io [29].

Ещё есть некоторые мелкие улучшения:

Подробнее смотрите замечания к выпуску [2].

Разработчики версии 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
  • 吴冉波

Автор: 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