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)
Ответ на: комментарий от bga_

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

Ну и? Что мешает делать то же самое компилятору Rust? И будем тогда считать, что он такой же небезопасный (но сука мощщный!), как и флюс? Или не будем?

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

Что полезного Вы можете сделать по экзепшену «не могу выделить память»?

Освободить заранее выделенный пул и попробовать повторить операцию? В некоторых случах, это вполне актуально.

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

И прочие попытки скрестить ужа с ежом типа maven, cabal, ...

А чем они плохи? Вот я на практике С++ использую. Когда хаскель изучал, то кабал показался очень и очень удобным. Одна билд система вместо 100500 плюсовых. Плюс возможность легко либы ставить - такого в плюсах вообще нет.

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

Или встроенный ассемблер не есть часть инструмента с++

Гы. Я так понял, плюсоеды не ощущают разницы между языком C++ и языком ассемблера. Вот до чего доводит перманентное жонглирование байтиками...

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

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

Не (обязательно) должен быть. И это вполне укладывается в идею «не платишь за то, что не используешь».

Про наличие кучу кривостей спорить буду, но это не одна из них.

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

Одна билд система вместо 100500 плюсовых.

При этом они не завязаны на чисто только C/C++.

Плюс возможность легко либы ставить - такого в плюсах вообще нет.

У меня этим занимается portage, ЧЯДНТ?

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

У меня этим занимается portage, ЧЯДНТ?

Все делаешь правильно, у меня apt этим занимается, у кого-то yum. А если мы решим вместе что-то написать, то ручками каждому нужные версии либ ставить придётся. А тут не придётся. Удобно.

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

Давай давай, продолжай в духе «ты неосилятор» и «ты не умеешь его готовить». Но всё становится намного проще если признать что спп - говно.

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

Давай давай, продолжай в духе «ты неосилятор» и «ты не умеешь его готовить».

По факту сказать-то у тебя нечего.

И я даже не собирался тут защищать плюсы. Иначе зачем мне раст?

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

встроенный ассемблер не есть часть инструмента с++?

Епт. Итак, покажи мне главу стандарта Си++, описывающую встроенный ассемблер.

tailgunner ★★★★★
()

Затестил тут их ночную сборку.
1M для helloworld'а как-то многовато IMHO.
Похоже они линкуют всё до чего дотянулись.
Ибо нафига слинковали io::net:: непонятно.

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

А выпилить рантайм с вырвиглазным println можно?

Можно. «Вырвиглазность println» довольно странный мотив, но рантайм модульный.

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

1M для helloworld'а как-то многовато IMHO.

Многовато, но статический хелловорлд на Си и 32-бит системе ~600k.

Ибо нафига слинковали io::net:: непонятно.

Линковка и структура библиотек пока что не получили достаточно внимания.

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

Епт. Итак, покажи мне главу стандарта Си++, описывающую встроенный ассемблер.

Главу не покажу но вот например http://www.open-std.org/jtc1/sc22/open/n2356/dcl.html

7.4 The asm declaration [dcl.asm]

1 An asm declaration has the form asm-definition: asm ( string-literal ) ; The meaning of an asm declaration is implementation-defined. [Note: Typically it is used to pass information through the implementation to an assembler. ]

Короче формально ты прав, а по факту придираешься потому что в gcc, icc и vc он есть и широко используется.

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

Короче формально ты прав, а по факту придираешься

Я прав по сути. Си++ накладывает ограничение - запрещает использовать машинные команды, но взамен этого дает возможность - переносимость.

в gcc, icc и vc он есть и широко используется

Считай это чем-то вроде FFI.

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

Си++ накладывает ограничение - запрещает использовать машинные команды, но взамен этого дает возможность - переносимость.

Спасибо за пояснение, кэп. Я вот нагуглил что в Rust тоже есть встроенный ассемблер )

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

Си++ накладывает ограничение - запрещает использовать машинные команды, но взамен этого дает возможность - переносимость.

Спасибо за пояснение, кэп.

Некоторые персонажи считают, что «Си++ не ограничивает».

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

Мне очень нравится С, а не плюсы. Там почти всегда знаешь во что это будет оттранслировано. А то что у rust'a есть inline asm и unsafe это здорово. Значит создатели не обделены прагматизмом и реализмом. Когда он устаканится обязательно займусь его изучением.

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

Мне очень нравится С, а не плюсы

В контексте разговора - без разницы. И просто для протокола: Си устаревшее говно, пригодное только для того, чтобы месить байты.

Там почти всегда знаешь во что это будет оттранслировано

Для того, чтобы «почти всегда знать», нужно быть почти компилятором. Layout структур в Си действительно почти всегда очевиден (кроме битовых полей разве что), но это обещают и в Rust.

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

И просто для протокола: Си устаревшее говно, пригодное только для того, чтобы месить байты.

Но это интуитивно понятное говно. Кроме, конечно, работы с .h файлами :)

но это обещают и в Rust.

Вижу Rust, как Си с новой парадигмой работы с памятью плюс плюшки в воде трейтов, имплементаций, коллекций и т.п.

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

Си устаревшее говно, пригодное только для того, чтобы месить байты.

Но это интуитивно понятное говно

Привычное скорее. Я после PL/I долго не мог въехать в адресную арифметику - это казалось слишком тупым и до идиотизма опасным.

Вижу Rust, как Си с новой парадигмой работы с памятью плюс плюшки в воде трейтов, имплементаций, коллекций и т.п.

Вопрос, является ли «Си с новой парадигмой памяти» всё еще Си %) Но да, я тоже надеюсь, что Rust станет именно этим.

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

Привычное скорее. Я после PL/I долго не мог въехать в адресную арифметику - это казалось слишком тупым и до идиотизма опасным.

Да не тупая она. Просто довольно низкоуровневая вещь, естественным образом вытекающая из системы адресации PDP11.

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

Многовато, но статический хелловорлд на Си и 32-бит системе ~600k.

Вот хотелось бы улучшения в данном вопросе, что бы линковался необходимый минимум. ЕМНИП даже в сишечке не всё замечательно в этом вопросе.
А тут новый язык, новые возможности, естественно хочется большего.

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

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

У разработчиков пока просто руки не дошли, сам язык еще не до конца утрясли.

m0rph ★★★★★
()

Меня всегда интересовал вопрос: если у них так много изменений в каждом релизе, постоянные переписывания библиотеки и документации, то сколько человек над этим rust-ом работают?

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

А выхлоп где? Только топчатся на месте. Другие языки не имели такого вливания усилий и добились большего.

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

Другие языки не имели такого вливания усилий и добились большего.

Примеры в студию можно? Язык, усилия, чего добились, за какое время.

А то ведь окажется, что некоторые языки старее, чем кажется.

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

Это, кстати, плохой пример. Его код на С++ - говно.

Пример хороший. Его C++ код действительно имеет пару замечаний, но, даже если его переписать, получится монстр. Не веришь - попробуй сам.

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

Я переписал. Получилась конфетка. Кстати, его код на хаскеле тоже говно. Там даже нет хвостовой рекурсии.

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

А выхлоп где? Только топчатся на месте.

Судя по заданному вопросу, за разработкой Rust ты не следишь. Но мнение о прогрессе имеешь.

Другие языки не имели такого вливания усилий и добились большего

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

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

А выхлоп где? Только топчатся на месте. Другие языки не имели такого вливания усилий и добились большего.

Ну по моим субъективным ощущениям чего-то добились в последнее время только Scala и Go. Оба имели кучу внимания и потребовали громадных усилий. D продолжают пилить, но своей ниши он не занял из-за слишком большой универсальности и сторонние бибилиотеки периодически возникают и отваливаются.

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

Не веришь - попробуй сам.

Сколько же криворуких даунов... От упоротых хаскелистов до лоровских аналитиков. Хорошо, что существуют анонимусы.

template<typename T>
auto runLengthEncode( const list<T>& as ) {
    list<pair<T, int>> r;
		
    for( const T& v : as ) {
        if( r.empty() || v != r.back().first )
            r.push_back( v, 1 );
        else
            r.back().second++;
    }

    return r;
};
anonymous
()
Ответ на: комментарий от Vudod

Scala и Clojure добрались до первой версии за два года. В эти годы над ними работали по большому счёту по одному человеку: Одерски и Хикки. А потом уже народ увидел, что это хорошо, и подхватил. D тоже до первой версии пилился только Брайтом.

А Rust сразу пилять всем миром. Такое ощущение, что Mozilla платит за его разработку. Не знаю, может так и есть на самом деле. Rust больше похож на Go, который тоже делает отдельно взятая компания.

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

Да лучше даже:

Согласен, а если еще специально сэкономить на «буквах»:

template<typename T>
auto runLengthEncode( list<T> as ) {
    list<pair<T, int>> r;
		
    for( T it : as )
        r.empty() || it != r.back().first ?
            r.emplace_back( it, 1 ) :
            r.back().second++;

    return r;
};
anonymous
()
Ответ на: комментарий от rupert

Другие языки не имели такого вливания усилий и добились большего.

С чем сравниваешь? Скажем, два мейнстримовых языка (С# и джава) имели гораздо больше «вливание усилий».

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

Scala и Clojure добрались до первой версии за два года

Scala за 2 года добралась до первого internal release (по словам Одерского, даже для обучения это еще не годилось); таких релизов у Rust было уже десяток.

В эти годы над ними работали по большому счёту по одному человеку: Одерски и Хикки

Линка сейчас нет, но, по-моему, Одерски говорил, что над Scala работала небольшая группа.

А потом уже народ увидел, что это хорошо, и подхватил.

А Rust сразу пилять всем миром

В начале над Rust работал только Хоар (до Rust 0.2, кажется - первого компилятора Rust, написанного на Rust ), потом он и еще пара человек из Мозиллы. «Весь мир» начал присоединяться 2-3 года назад.

Так что можно сказать, что Scala дошла до 1.0 быстрее, чем Rust, но это и всё. Clojure вообще не стоит сравнения - еще один динамический недоязычок.

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

Rust 0.11,0.12,0.13... До версии 1.0 таки еще долго ждать.

1.0 - это точка сингуларности.

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

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

Ну почему же, это круто. Кто бы запилил язык, где бы всякий математический мусор ('<', '>', '{', '}', '+', '(', ')', '%' etc.) не был бы частью языка. Математика уже давно по факту используется ну может в 0.001% софтварных проектов, и то, на уровне базовой алгебры, и казалось бы, не должно это быть это частью языка (стандартной библиотеки — может быть, но не частью синтаксиса), ибо делает код нечитабельным, ан нет тащат везде, как священную корову.

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

самое плохое - показать пользователю MessageBox

fixed. За MessageBox'ы надо тестикулы без наркоза удалять.

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

Что полезного Вы можете сделать по экзепшену «не могу выделить память»?

Ну например вернуть 500 на попытку соединения на веб-сервере, и продолжить как ни в чём не бывало обрабатывать уже установленные соединения. Убивать целиком весь веб-сервер из-за такой ерунды — вершина идиотизма.

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