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

В первых строчках упоминают Армстронга и его детище - зачётно.

Спасибо за ссылку.

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

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

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

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

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

Внезапно в расте пытаются собрать лучшие возможности и черты множества языков:

У меня очень большие сомнения в нормальном результате и вот почему:

1. Разные подходы подразумевает много разных инструментов, что приводит в первую очередь к перегруженному синтаксису. Собственно, это я уже слышал про Rust.

Вот, кстати, вот хороший пример сравнения реализации куска алгоритма на Haskell и на C++: http://www.youtube.com/watch?v=b9FagOVqxmI&feature=youtu.be&t=47m37s

2. Сложность языка. То же, что и предыдущее, но с точки зрения девелопера. Чтобы нормально пользоваться языком придется учиться. Звучит смешно? А теперь давайте вспомним сколько программистов проходят нормальное обучение перед тем, как начать что-то делать и писать свое «фе» на форумах.

Недавно я открыл для себя исключения в C++. Нет, про try ... throw ... catch я знал очень давно, и даже как-то их использовал. Кстати, слышал не раз, что некоторые не рекомендуют использовать исключения, так как иногда приводит к феерическим проблемам. Но потом я посмотрел вот это: http://www.youtube.com/watch?v=N9bR0ztmmEQ (ну, и еще почитал немного) и все стало на свои места. При кажущейся простоте и очевидности, исключения просто нужно уметь использовать.

Это я к тому, что, Rust либо придется выбрать основную парадигму, чтобы снизить порог вхождения, но пожертвовать «универсальностью», либо терпеть критику в стиле «неудобно» и «феерические проблемы», как это терпит C++.

ИМХО.

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

либо терпеть критику в стиле «неудобно» и «феерические проблемы», как это терпит C++

да ему не нужно будет терпеть, критическую массу он не наберет

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

Недавно я открыл для себя исключения в C++

Когда Вы покодите еще немного лет, то поймете, что кидание экзепшенами не панацея, а путь в пропасть. Что полезного Вы можете сделать по экзепшену «не могу выделить память»? А использовать его для «не могу открыть файл» - по меньшей мере глупо.
P.S. Если Ваша программа выкинула экзепшен, то самое плохое - показать пользователю MessageBox с номером ошибки :)

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

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

Исключение - это просто один из способов возврата кода ошибки. С ним можно делать всё то же, что и с кодом ошибки.

А использовать его для «не могу открыть файл» - по меньшей мере глупо.

Ну так не надо поступать глупо.

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

Ну, что будет если я еще покодю - посмотрим. Но пока я в корне не согласен.

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

1) Показать нормальное user-friendly сообщение вместо того, чтобы просто вывалиться как при сегфолте.
2) Выгрузить какие-то данные для освобождения памяти и продолжения нормальной работы, если это возможно в программе.

А использовать его для «не могу открыть файл» - по меньшей мере глупо.

Глупо каждый fopen и другие 100500 функций оборачивать в что-то типа if (result==-1) ... ; если любая ошибка должна привести просто к выходу из функции. А еще интересней, если при выходе из функции нужно не просто return, а еще какой-то delete или fclose. А если это еще происходит в какой-то f5(), вызванной из f4(), вызванной из f3()..., и вышеупомянутая ошибка должна привести к завершению всей цепочки вплоть до f1(), то if (result==-1){...} становится самой частоиспользуемой конструкцией и не сильно сказывается на читаемости кода. Ну и т. п.

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

Глупо каждый fopen и другие 100500 функций оборачивать в что-то типа if (result==-1) ... ; если любая ошибка должна привести просто к выходу из функции. А еще интересней, если при выходе из функции нужно не просто return, а еще какой-то delete или fclose. А если это еще происходит в какой-то f5(), вызванной из f4(), вызванной из f3()..., и вышеупомянутая ошибка должна привести к завершению всей цепочки вплоть до f1(), то if (result==-1){...} становится самой частоиспользуемой конструкцией и не сильно сказывается на читаемости кода. Ну и т. п.

Вам надо на Яве кодить тога, если у вас такие необходимости. Или по крайней мере использовать какие-нибудь языки со сборкою мусора типа D или Go.

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

Вам надо на Яве кодить тога, если у вас такие необходимости. Или по крайней мере использовать какие-нибудь языки со сборкою мусора типа D или Go.

Зачем? В C++ есть для этого все необходимые и удобные инструменты.

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

А если это еще происходит в какой-то f5(), вызванной из f4(), вызванной из f3()..., и вышеупомянутая ошибка должна привести к завершению всей цепочки вплоть до f1(), то if (result==-1){...} становится самой частоиспользуемой конструкцией и не сильно сказывается на читаемости кода.

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

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

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

Освободить кеши и попробовать выполнить операцию ещё раз.

А использовать его для «не могу открыть файл» - по меньшей мере глупо.

Ничего глупого.

P.S. Если Ваша программа выкинула экзепшен, то самое плохое - показать пользователю MessageBox с номером ошибки :)

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

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

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

Почему ты рассматриваешь exception именно именно как ошибку? Это не ошибка, а просто механизм ветвления, аналогично с if.

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

Разные подходы подразумевает много разных инструментов, что приводит в первую очередь к перегруженному синтаксису.

Пока он не перегружен до уровня плюсов с поддержкой больших возможностей ничего плохого нет.

Сложность языка. То же, что и предыдущее, но с точки зрения девелопера. Чтобы нормально пользоваться языком придется учиться.

Ясен хрен придется, сложности хаскеля вроде не намечается, поэтому массы должно осилить.

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

Совсем не очевидно, ну вижу проблемы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ну например вернуть 500 на попытку соединения на веб-сервере

У Вас нет свободной памяти, чтобы создавать объекты.
P.S. И я бы хотел не вдаваться в детали, а в целом показать, что механизм экзепшенов - совсем не серебряная пуля.

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

Ты про stacktrace не знаешь что-ли, петушок?

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