LINUX.ORG.RU

Вышел Rust 1.8

 


3

7

Команда Rust с удовольствием сообщает о выходе новой стабильной версии Rust 1.8. Rust — это язык системного программирования, фокусирующийся на безопасности, скорости и поддержке многопоточного программирования.

Как обычно, вы можете установить Rust 1.8 с соответствующей страницы на нашем сайте и посмотреть подробные примечания к выпуску 1.8 на GitHub'е. В этом релизе было принято около 1400 патчей.

Что нового в стабильной версии 1.8

Этот выпуск содержит два нововведения, и приятный сюрприз для пользователей Windows! Помимо этого идёт работа по замене системы сборки Rust, основанной на make, на Cargo.

Первое нововведение – это возможность перегрузки составных операторов присваивания, таких как += и -=. Изменение было принято в RFC 953 и выглядит следующим образом:

use std::ops::AddAssign;

#[derive(Debug)]
struct Count { 
    value: i32,
}

impl AddAssign for Count {
    fn add_assign(&mut self, other: Count) {
        self.value += other.value;
    }
}   

fn main() {
    let mut c1 = Count { value: 1 };
    let c2 = Count { value: 5 };
    c1 += c2;
    println!("{:?}", c1);
}

Эта программа выведет Count { value: 6 }. Как и в других трейтах, перегружающих операторы, ассоциированный тип позволяет использовать разные типы в левой и правой части оператора (см. RFC 953).

Второе нововведение, взятое из RFC 218, не такое значительное. В предыдущих версиях Rust структура, не содержащая полей, должна была объявляться без фигурных скобок:

struct Foo; // works
struct Bar { } // error

Вторая форма объявления больше не является ошибочной. Изначально эта форма была запрещена из соображений согласованности с другими пустыми объявлениями, а также для предотвращения неоднозначности синтаксического разбора. Но эта неоднозначность была устранена, начиная с Rust 1.0. Кроме того, запрет этой формы создавал трудности при написании макросов, требуя специальной обработки. Наконец, пользователям, ведущим активную разработку, иногда требовалось менять пустую структуру на непустую и наоборот, что требовало лишней работы и приводило к некрасивым diff'ам.

Возвращаясь к Windows — теперь 32-х битные MSVC сборки поддерживают размотку стека, что переводит платформу i686-pc-windows-msvc в класс 1 (о классах поддержки платформ).

Мы с давних пор используем make для сборки Rust'а, но у нас уже есть своё замечательное средство сборки для программ на Rust: Cargo. В Rust 1.8 мы добавили предварительную поддержку новой системы сборки, написанной на Rust и основанной на Cargo. Мы ещё не используем её по умолчанию, и она требует значительной доработки, поэтому подробное её описание появится в примечаниях к выпуску после её завершения. Сейчас вы можете посмотреть подробности по ссылке на PR 31123.

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

В Rust 1.8 около 20 функций и методов было переведено в категорию стабильных. Их можно разбить на три группы: работа со строками в кодировке UTF-16, различные API для работы со временем, и дополнительные трейты, необходимые для перегрузки операторов, упомянутые в секции об изменениях в языке.

Нововведения в Cargo

  • cargo init создаёт проект в текущем каталоге, не создавая новый, как делает cargo new
  • cargo metadata - дополнительная субкоманда для получения метаданных
  • .cargo/config теперь допускает ключи -v и --color
  • Улучшены возможности Cargo по поддержке платформоспецифичных зависимостей.

Подробное описание изменений.

>>> Вышел Rust 1.8

★★

Проверено: maxcom ()

Синтаксис у него просто вырвиглазный.

Xroft ★★ ()

Изменения не какие-то значительные, но приятно видеть, что хороший язык развивается.

anonymous ()

стабильной версии Rust

что значит слово «стабильная» прменительно к Rust? :)

stevejobs ★★★☆☆ ()

Два ненужно в одной новости

anonymous ()

Cargo чем-то напоминает Ant

I60R ★★ ()

Недавно же 1.7 выходил. У Фаерфокса с хромом понабрались? Вон Ява еще только 1.8 еще, а вы раз раз и в дамки. Не солидно!

anonymous ()
Ответ на: комментарий от anonymous

Вот только поставишь, распробуешь, тут бац и новый релиз, обновляться надо.

anonymous ()

а что уже на нём написано и работает полезного?

kep ()
Ответ на: комментарий от stevejobs

В разработке Rust'а используется три версии: стабильная, бета и ночные сборки. Стабильная версия означает, что код написанный для неё будет компилироваться во всех последующих стабильных версиях (исключая случаи исправления багов).

red75prim ★★ ()

Язык прекрасен, но он где-нибудь реально используется?

Xintrea ★★★★★ ()
Ответ на: комментарий от kep

Ну вот ось одну уже написали, убийцу линакса

anonymous ()
Ответ на: комментарий от anonymous

Жабка 1.8 это ж вроде 8-ая версия, да у каждой апдейтов по 20 выпусков. Так что догонять и догонять.

Alve ★★★★★ ()

Наконец, пользователям, ведущим активную разработку, иногда требовалось менять пустую структуру на непустую и наоборот, что требовало лишней работы и приводило к некрасивым diff'ам.

штаэ?

  1. Некрасивый дифф послужил причиной введения фичи в язык?
  2. Как это решение помогло избавиться от некрасивых диффов, если был код:
    struct Bar { };
    стал
    struct Bar { Foo };
  3. И что это такое за разработка, что ты постоянно одну и ту же структуру меняешь, то пустая, то не пустая (вот честно, без ехидства, даже представить затрудняюсь такой кейс).

PS безотносительно этой строчки фича выглядит разумной.

arcanis ★★★★ ()
Последнее исправление: arcanis (всего исправлений: 2)

язык для людей с сомнительной ориентацией имхо.

anonymous ()

Видел тред на одной странице.

anonymous ()
Ответ на: комментарий от arcanis

Раньше было

struct Bar;
  !
  V
struct Bar {
  a: u32,
}
Diff 4 строки

Теперь можно

struct Bar {
}
  !
  V
struct Bar {
  a: u32,
}
Diff 1 строка

Как-то так. Кому надо постоянно менять одно на другое не знаю, но видимо были feature request'ы и с таким обоснованием.

red75prim ★★ ()

Идея хорошая, имплементация говно.

Oxdeadbeef ★★★ ()
Ответ на: комментарий от DarkEld3r

Вырвиглазный синтаксис. Хочу лиспоподобный раст. Ну или мл-подобный.

Oxdeadbeef ★★★ ()
Ответ на: комментарий от arcanis

И что это такое за разработка, что ты постоянно одну и ту же структуру меняешь, то пустая, то не пустая

Например, есть у тебя трейт-интерфейс и сколько-то структур реализующих его. Бывает так, что удобно добавить их сразу, а «наполнять» постепенно. Это, конечно, не постоянные изменения в обе стороны, но пару раз эти бесполезные действия проделать придётся.

Ну и я бы на их месте наоборот запретил вариант объявления без скобок ещё в 1.0. Интересно какие другие «пустые объявления» существуют?..

DarkEld3r ★★★★★ ()
Ответ на: комментарий от Oxdeadbeef

Хочу лиспоподобный раст.

Предпочёл чтобы они ещё больше возможностей макросам дали, а синтаксис (мне) менее важен.

DarkEld3r ★★★★★ ()
Ответ на: комментарий от Oxdeadbeef

Хочу лиспоподобный

(defmacro with-smart-dna-hash ((hash-access hash-loop &key (vector-threshold 1048576)) (&rest sequence-lengths) &body body)
  (loop :for length :in sequence-lengths
     :for bind = (gensym)
     :for area = (expt 4 length)
     :for vec-p = (<= area vector-threshold)
     :collect `(,bind ,(if vec-p
                           `(make-array ,area :element-type 'fixnum :initial-element 0)
                           `(make-hash-table :test ',(if (< area most-positive-fixnum) 'seq= 'eql)
                                             :rehash-size ,(expt 2 (1- length))
                                             :rehash-threshold 0.7))) :into binds
     :collect `(,length ,(if vec-p ``(elt ,',bind ,key) ``(the fixnum (gethash ,key ,',bind 0)))) :into accesses
     :collect `(,length ,(if vec-p
                             ``(loop :for i :from 0 :below ,',(expt 4 length)
                                  :for ,value = (elt ,',bind i)
                                  :for ,key = (unpack-sequence ,',length i)
                                  :unless (zerop ,value)
                                  ,@loop-keywords)
                             ``(loop :for packed-key :being :the :hash-keys :in ,',bind
                                  :for ,key = (unpack-sequence ,',length packed-key)
                                  :for ,value = (,',hash-access ,',length packed-key)
                                  ,@loop-keywords))) :into loops
     :finally (return `(let (,@binds)
                         (macrolet ((,hash-access (seq-length key) (ecase seq-length ,@accesses))
                                    (,hash-loop ((seq-length key value) &rest loop-keywords) (ecase seq-length ,@loops)))
                           ,@body)))))

Это правда лучше?

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Ну приведи эквивалентную макру для раста 😂

А вообще, твою макру можно разобрать и переписать на более мелкие и читабельные части. А так это конечно портянка.

Oxdeadbeef ★★★ ()
Ответ на: комментарий от Oxdeadbeef

Ну приведи эквивалентную макру для раста 😂

Приведи аналог на CL чего-нибудь вывиглазного с лайфтаймами.

А вообще, твою макру можно разобрать

Она не моя - это с shootout.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Приведи аналог на CL чего-нибудь вывиглазного с лайфтаймами.

Вообщето я даже не упоминал про CL. Растоподобный лисп (или лиспоподобный раст) необязательно должен быть CL.

Oxdeadbeef ★★★ ()
Ответ на: комментарий от tailgunner

В макрос даже не вчитывался, потому что надо быть «в теме» на какую тему макрос, но ответ - Да, лучше. В CL макросы не просто так пишут, даже если они и «страшно» кому-то там выглядят. Их не так много, зато они решают свою задачу так как надо. Если процитировать Дуга Хойта, автора книжки «Let over lambda» (по памяти и мой перевод) «Никто не вколачивает макросы размером в страницу в кавалерийском стиле». Это результат экспериментов, размышлений и труда. Но результат того стоит.

anonymous ()
Ответ на: комментарий от Oxdeadbeef

Приведи аналог на CL чего-нибудь вывиглазного с лайфтаймами.

Вообщето я даже не упоминал про CL

Дефолтный Лисп.

Растоподобный лисп (или лиспоподобный раст) необязательно должен быть CL.

В каком-то топике уже приводили пример синтаксиса Rust в скобчатом стиле. Получилось отвратительно.

А если посмотреть реальный код на Rust (тот же Servo), он выглядит не хуже современного Си++ (inb4 «Си++ говно» - нет сегодня языков с синтаксисом намного лучше).

tailgunner ★★★★★ ()
Ответ на: комментарий от anonymous

ответ - Да, лучше

Окей.

В CL макросы не просто так пишут

Просто так и сильно параметризованные определения данных не пишут.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Я не знаю, что такое «сильно параметризованные определения данных», но повторю свою речь - макросы в CL не так _часто_ пишут. И обычно по названию и смыслу макроса (разбирающийся в CL) читатель понимает идею макроса, так что нет необходимости ментально парсить все эти `, ты и так понимаешь что он делает.

anonymous ()
Ответ на: комментарий от tailgunner

Дефолтный Лисп.

схемеры и кложуристы будут не согласны

В каком-то топике уже приводили пример синтаксиса Rust в скобчатом стиле. Получилось отвратительно.

Если тупо переводить синтаксис то получится кака. Нужен дизайн.

А если посмотреть реальный код на Rust (тот же Servo), он выглядит не хуже современного Си++

Я смотрел. Вырвиглазие.

нет сегодня языков с синтаксисом намного лучше).

Nim, Ocaml, ML? Про CL не буду упоминать.

Oxdeadbeef ★★★ ()
Ответ на: комментарий от anonymous

Ну а Rust. Да просуществует какое-то время и вероятно отнимет у C++ какую-то нишу. Глобально — это путь в никуда.

anonymous ()
Ответ на: комментарий от Oxdeadbeef

схемеры и кложуристы будут не согласны

Ну и хрен с ними. Тем более с кложуристами.

ados ★★★★★ ()
Ответ на: комментарий от Oxdeadbeef

А если посмотреть реальный код на Rust (тот же Servo), он выглядит не хуже современного Си++

Я смотрел. Вырвиглазие.

А, ну окей. Тогда только VB.

нет сегодня языков с синтаксисом намного лучше).

Nim, Ocaml, ML?

Я немного писал на Ocaml - не сказал бы, что сильно впечатлен гладкостью синтаксиса (ocamlp4, anyone?). И в любом случае, всё это языки со сборкой мусора.

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

Это правда лучше?

А что: выглядит приятно и весьма опрятно. А что там внутри происходит всегда macroexpand-1 подскажет.

kawaii_neko ★★★ ()
Ответ на: комментарий от tailgunner

Не знаю, может это такое психологическое расстройство у меня, но операторы :: и & вызывают необъяснимое беспокойство и отвращение. А тут какой исходник на rust не открой, он будет наполовину состоять из этих операторов. В С++ они, конечно, тоже есть, но там их концентрация заметно ниже.

pftBest ★★★★ ()
Ответ на: комментарий от Xroft

Существует мнение, что синтаксис для языка программирования вещь второстепенная. Ну и вообще, нынче мода на указание типа в конце объявления (и возможность его опускать), и прочие особенности тоже не специфичны для Rust.

Softwayer ★★ ()
Ответ на: комментарий от Softwayer

синтаксис для языка программирования вещь второстепенная

Если от него слезятся глаза и хочется блевать, то таки первостепенная 😂 Ведь над кодом придётся работать несколько часов в день.

Oxdeadbeef ★★★ ()

Бгг. Сколько лисперов разной степени латентности совершили каминг-ауты.

tailgunner ★★★★★ ()
Ответ на: комментарий от pftBest

В С++ они, конечно, тоже есть, но там их концентрация заметно ниже.

А попробуй посчитать.

tailgunner ★★★★★ ()
Ответ на: комментарий от Oxdeadbeef

Ну у раста всё-таки не так всё запущено, ИМХО. Непривычно после крестов, но это скорее вопрос привычки, чем что-то объективное (хотя лямбдам в стиле Ruby в любом случае трудно найти оправдание).

Softwayer ★★ ()
Ответ на: комментарий от Softwayer

Ну у раста всё-таки не так всё запущено, ИМХО

А могли бы сделать лучше. а теперь поздно.

Oxdeadbeef ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.