Анонс 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
:
$ 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.

Інші поліпшення

Докладніше дивіться зауваження до выпуску.

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

У цьому випуску багатьма типами стало трохи зручніше користуватися.
Докладніше дивіться зауваження до выпуску.

Можливості Cargo

найцікавіша можливість, додана в Cargo в цьому циклі — "workspace's." Вони визначені в RFC 1525, і дозволяють групі пакетів розділяти один і той же файл
Cargo.lock
. Якщо ви займаєтеся проектом, який поділений на кілька пакетів, workspace'и сильно спрощують фіксацію єдиної версії загальних залежностей. У більшості проектів включення цієї можливості зажадає додавання в
Cargo.toml
верхнього рівня єдиною рядки,
[workspace]
. Більш складним проектам може знадобитися більш хитра налаштування.
Інша значна можливість — це перевантаження шляху до вихідного коду контейнера. Ви можете легко поширювати залежності локально (англ. vendoring), використовуючи її в поєднанні з інструментами на зразок cargo-vendor і cargo-local-registry. З часом на базі цього буде побудована інфраструктура дзеркал crates.io.
Ще є деякі дрібні поліпшення:
Докладніше дивіться зауваження до выпуску.
Розробники версії 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 Неймана
  • 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 Неймана
  • 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
  • 吴冉波

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.