LINUX.ORG.RU

Rust 0.12

 ,


5

9

Вышла новая версия инструментов разработки языка программирования Rust. Rust — язык системного программирования, предназначенный для написания быстрых и в то же время безопасных (в том числе и во многопоточной среде) приложений.

В данном релизе упор был сделан на переработку документации языка, приведение к единому виду стандартной библиотеки, улучшение пакетного менеджера Cargo и поддержки Windows.

Обзор обновлений в новой версии:

  • Около 1900 изменений в коде.
  • Основные изменения
    • Вводный документ (и набор сопроводительной документации) был полностью переписан и теперь называется The Rust Guide.
    • Множественные улучшения пакетного менеджера Cargo и его поддержка большим числом библиотек.
    • Большое количество изменений API в стандартной библиотеке std для соответствия текущим стандартам разработки Rust. Все изменения отражены в документации.
    • Ряд библиотек был вынесен из дерева Rust во внешние проекты на Github: uuid, semver, glob, num, hexfloat, fourcc. Они могут быть установлены с помощью Cargo.
    • Новая возможность: lifetime elision - позволяет во многих случаях не указывать явно аннотацию времени жизни (lifetime) в сигнатурах методов.
    • Появилась версия компилятора для Windows 64-bit.
  • Язык
    • Операцию индексации теперь можно перегрузить в своих типах данных с помощью трейтов (trait) Index и IndexMut.
    • Конструкция if let теперь выполняется только при совпадении let-паттерна.
    • Новый синтаксис для срезов (slices), например: [0..4]. Поддержать подобный синтаксис в своих типах данных можно с помощью трейтов Slice и SliceMut.
    • Синтаксис для сравнения с образцом срезов стал постфиксным, теперь он имеет вид: [a, b, c..].
    • При использовании интервалов с включением в сравнении с образцом теперь верхняя границы считается не включенной: вместо 0..3 стоит указывать 0...4.
    • Элементы кортежей и кортежных структур теперь могут быть получены с помощью нового синтаксиса индексации: value.0.
    • Атрибут #[crate_id] теперь не поддерживается, версионирование выполняется исключительно пакетным менеджером.
    • Импорт библиотек с переименованием теперь записывается как extern crate foo as bar вместо extern crate bar = foo.
    • Оператор use с переименованием теперь имеет новый синтаксис: use foo as bar вместо use bar = foo.
    • Добавлен новый, более эффективный тип замыканий: unboxed closures. Со временем текущий тип замыканий будет заменен новым.
    • Добавлено ключевое слово move, которое описывает замыкания, захватывающие переменные по значению.
    • Модификация (mutation) и присваивание теперь не могут использоваться в pattern guards.
    • Параметризованные структуры и перечисления теперь могут быть ограничены (иметь trait bounds).
    • Новый, более гибкий синтаксис указания ограничений типов с помощью ключевого слова where
    • Трейт Share переименован в Sync для того, чтобы термин shared обозначал только shared reference.
    • Для типов динамического размера добавлен трейт Sized. Чтобы указать, что параметр типа не должен иметь строгий размер, стоит использовать ограничение: <Sized? T>.
    • Замыкания теперь могут возвращать !, примеры сигнатур: || -> !, proc() -> !.
    • Границы времени жизни (lifetime bounds) теперь могут быть применены к параметрам типа и типам объектов.
    • Старый тип автоматически автоматически управляемых ссылок со сборкой мусора GC<T> окончательно был удален. В будущем появится новая реализация управления памятью со сборкой мусора.
  • Библиотеки
    • Улучшена документация к ряду библиотек.
    • Обновлены битовые векторы: collections::bitv.
    • Библиотека url признана устаревшей. Рекомендуется использовать http://github.com/servo/rust-url, устанавливаемую с помощью Cargo.
    • Почти все типы данных потоков (stream) ввода-вывода теперь могут быть клонированы и закрыты в других потоках (thread) выполнения.
    • Добавлен тип std::time::Duration для использования в методах ввода-вывода, зависящих от таймера.
    • The runtime I/O abstraction layer that enabled the green thread scheduler to do non-thread-blocking I/O has been removed, along with the libuv-based implementation employed by the green thread scheduler. This will greatly simplify the future I/O work.
    • collections::btree переписана с учетом более эффективного и близкого к Rust проектирования.
  • Утилиты
    • Вывод rustdoc теперь содержит метку об уровне стабильности API.
    • Флаг --crate-name теперь может указывать имя компилируемой единицы кода (crate), что ранее указывалось в коде атрибутом #[crate_name.
    • Флаг -C metadata указывает дополнительные метаданные, хэш которых должен попасть в символьные имена собираемого бинарника.
    • Флаг -C extra-filename указывает дополнительную информацию, добавляемую в имя выходного файла для использования пакетным менеджером.
    • Улучшена генерация отладочной информации, которая теперь лучше совместима при отладке через gdb и lldb.
    • Добавлена экспериментальная поддержка параллельной компиляции с помощью флага rustc -C codegen-units.
    • Компилятор теперь не добавляет по умолчанию в бинарные файлы путь для поиска библиотек (rpath).
  • Прочее
    • Оптимизировано использование стека с помощью аннотаций LLVM.
    • Rust для Linux более совместим со старыми версиями ядер и дистрибутивов.

>>> Подробности



Проверено: maxcom ()
Последнее исправление: CYB3R (всего исправлений: 3)

Ответ на: комментарий от vasya_pupkin

ОС написать можно, но кто будет это делать на языке который еще хрен знает сколько раз переколбасят? И даже если бы не это, будет ли кто переписывать существующие ОС? Так что «Съесть-то он съест, да кто ж ему даст?»

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

Посоветуйте, что про язык читать после их «вводного гайда». Есть «rust by example», но он уже несколько месяцев не обновляется...

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

Кстати, это нормально, что в гайте не упоминаются даже некоторые базовые вещи? Скажем, когда прочёл про комментарии (там говорится, что их два вида), то удивился, что нет многострочных. Оказалось, что есть.

DarkEld3r ★★★★★
()

Импорт библиотек с переименованием теперь записывается как extern crate foo as bar вместо extern crate bar = foo.
Оператор use с переименованием теперь имеет новый синтаксис: use foo as bar вместо use bar = foo.

Странно как-то. Интересно было бы увидеть обоснование.

The runtime I/O abstraction layer that enabled the green thread scheduler to do non-thread-blocking I/O has been removed, along with the libuv-based implementation employed by the green thread scheduler. This will greatly simplify the future I/O work.

Это и планировалось не переводить?

DarkEld3r ★★★★★
()

Собственно.. И чем оно православнее D1/D2? назначение то же, синтаксис похож. даже идеи как-то на слух близки. чем колёса этого велосипеда квадратнее?

hawai
()

Годнота! Определенно нужно!

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

В системные, очевидно, не годится.

Очевидно кому и почему?

Вероятно, интересные наработки постепенно перетекут в стандарты C/C++ с поправкой на их философию.

Имхо, чуть ли не основная фича - «контроль времени жизни» (region inference) очень вряд ли попадёт в С++.

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

Ну сделает оно, например, твою БД пустой и похерит ФС, вместо того, чтоб упасть, лучше станет?

Почему «оно» должно это делать?

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

Самая бесполезная вещь.

Это ещё почему? Имхо удобная система сборки «из коробки» - это очень хорошо. К тем же плюсам наделали 100500 вариантов и продолжают делать. Хорошего в этом мало.

Плюс этакий «пакетный менеджер» для либ - тоже очень здорово. В своё время, хаскелевский кабал весьма впечатлил.

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

И синтаксис все ублюдочнее :/

Что именно, в этот раз, тебе не понравилось? Мне разве что «as» вместо «=» показались дурацкими.

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

Мне в крестах этих словечек порой не хватает.

Все, кроме, аbstract уже там.

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

На Box<> же. Мало того, что символов больше, так ещё и название неточное (это не box, а pointer to a boxed object), да ещё и сделали box зарезервированных словом.

Немного не понял. Зачем зарезервировали «box», если используется «Box<>»?

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

И чем оно православнее D1/D2?

Лично для меня, тем что нет «почти необязательного» гц. Ну и вывода регионов в D нет и, кажется, не планируется. Да и в целом фичи как-то приятнее. Интересные «темплеты» вместо слегка улучшенных плюсовых у D, нормальные макросы вместо строков миксинов и т.д.

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

Вообще-то легче должно стать от того, что некоторые оошибки сделать станет гораздо труднее.

Избегать ошибок могут не все. Вернее, избегать могут не только лишь все, мало кто может это делать

anonymous
()

Вот так-то, все думали после 0.9 будет 1.0, а оно пошло на уменьшение)

special-k ★★★
()

Ненужно!

А там уже появились полноценные глобальные переменные, хотя бы на уровне модуля, с вызовом инициализатора там же, без тупых unsafe секций?

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

И синтаксис все ублюдочнее :/

Что именно, в этот раз, тебе не понравилось? Мне разве что «as» вместо «=» показались дурацкими.

Именно это.

Зачем зарезервировали «box», если используется «Box<>»?

box - это оператор создания объекта (аналог new).

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Vudod

Гораздо хуже то, что они не определились с концепцией толком.

По-моему, именно с концепцией они определились - «memory safety without GC». Проблема в том, что _практически юзабельных_ языков на этой концепции никто пока не построил.

понадобится Rust 2.0, полностью несовместимый с оригиналом, чтобы это исправить.

В некотором смысле Rust 1.0 обречен быть исследовательским. Rust 2.0, если он будет, конечно, будет несовместим, но уж точно не «полностью».

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

Где ублюдочнее-то? Выкинули lifetime, у которых самый уродский синтаксис был. Многое другое убрали, теперь по-людски смотрится. Долгостроя не будет, 1.0 уже распланирован.

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

Выкинули lifetime

ЩИТО?

у которых самый уродский синтаксис был

Синтаксис lifetime прекрасен и он не изменился.

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

Пока это выглядит так, будто они засунули эти языки в блендер, перемешивают, смотрят и снова перемешивают.

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

Очередной Haskell

Если бы. Хачкель можно подучить хотя бы ради прокачивания ЧСВ и умничания на ЛОРе. А зачем нужен раст? Совершенно бесполезный кусок ненужно.

no-such-file ★★★★★
()
Ответ на: комментарий от hawai

Собственно.. И чем оно православнее D1/D2? назначение то же, синтаксис похож. даже идеи как-то на слух близки. чем колёса этого велосипеда квадратнее?

D - это язык, сильно заточенный на ООП. Позиционируется как улучшенная версия C++, с добавленным местами сахарком и подстеленой соломкой, чтобы не так больно было биться головой. Синтаксис у него близок к крестам, местами почище, местами поублюдочнее. Rust же, на мой взгляд, имеет довольно отличный от плюсов синтаксис (не стоит циклиться на наличии <> и ::), не привязан к ООП, хотя может его «имитировать». А за счет особенностей самого языка, компилятор имеет больше возможностей по статическому анализу кода и предотвращению стрельбы по ногам. Конечно в unsafe секции всегда можно оторваться, но на то она и unsafe.

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

Почему «оно» должно это делать?

По той же причине, что и код на С должен упасть. Удалили таблицу из БД, а какой-то из потоков ее еще использует (типичный креш - использование указателя после free). И что будет на С - БД упадет, а что будет с объектом убираемым GC - попытка записи в файл, где этой таблицы уже нет и ее место вполне могла уже занять другая.

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

некоторые оошибки сделать станет гораздо труднее.

Я верю в людей. Они смогут это преодолеть.

anonymous
()

Объясните мне про Rust и Go. Языки очень похожи по своей сути, но похоже позиционирование у них отличается. Я правильно понимаю, что первый ближе к нише С++, а второй к Java/Python/Erlang. Т.е. первый всякие офлайн приложения с гуем и без гуя, а второй разнообразные сервисы?

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

некоторые оошибки сделать станет гораздо труднее.

Я верю в людей. Они смогут это преодолеть.

Смогут не только лишь все. Мало кто сможет это сделать.

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

По-моему, именно с концепцией они определились - «memory safety without GC». Проблема в том, что _практически юзабельных_ языков на этой концепции никто пока не построил.

Люто плюсую. С нетерпением жду обещанный релиз 1.0 к концу года.

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

Отлучили от Гугла?

Бегло поискал - не нашёл. Если есть, что сказать - говори.

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

По той же причине, что и код на С должен упасть.

Ну ок, допустим. Только где в расте рекомендуют игнорировать исключения и ошибки?

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

А что нет?

Нет. Go полагается на GC, система типов убога, CSP-подобные примитивы прибиты гвоздями.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от atrus

Скорее наоборот, в плюсах они выглядят так же ужасно.

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

Объясните мне про Rust и Go. Языки очень похожи по своей сути

На мой взгляд, вообще нет. В Го - ГЦ, в расте - нет. Го - этакий простенький язык с парой фич (типа гороутин). В расте, на мой взгляд, фич побольше и они поинтереснее. Ну и да, он ближе к С/С++, но контролирует (причём без оверхеда) ошибки работы с памятью и т.д.

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

Я говорю о нем не как о языке Haskell (не проводите аналогии), а как о явлении.

«Прыгая на одной ноге и нацеливаясь другой ногой в штанину, Берлага туманно пояснил:

 — Я это сделал не в интересах истины, а в интересах правды.» (ц)

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

Это другая. (А по поводу Haskell с той статьи произошли изменения в отношении spins и tags, но я дурак, поэтому не расскажу правильно какие именно)

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

Множественное наследование редко доводит до добра :)

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