LINUX.ORG.RU

Rust 1.9

 


0

3

Анонсирована очередная версия языка программирования Rust 1.9, разрабатываемого Mozilla совместно с сообществом. Примечательно то, что с момента релиза первого стабильного выпуска прошел 1 год.

Основные изменения:

  • Стабилизирован модуль std::panic, позволяющий перехватывать раскрутку стека. Соответствующие функции рекомендуется применять только в исключительных ситуациях, но никак не для эмуляции механизма try-catch.
  • Стабилизированы методы настройки TCP и UDP соединений; расширены возможности OsString, BTreeSet и HashSet; char может быть получен из UTF-16 последовательности; стабилизирована функция copy_from_slice(); появилась возможность работы с волатильными переменными с помощью read_volatile и write_volatile; сырые указатели обрели .as_ref() и .as_mut(), которые возвращают Option<&T>, где null будет представлен как None; в libcore для всех типов реализован Debug.
  • Разработчикам библиотек доступен атрибут #[deprecated], разрешающий компилятору слать предупреждения при использовании устаревшего API.
  • Специализация уже используется в ночном релизе и будет доступна в стабильном 1.11 через 3 месяца, но оптимизация .to_owned() и .to_string() таки попала в текущий стабильный выпуск.
  • Расширен список поддерживаемых платформ: mips-unknown-linux-musl, mipsel-unknown-linux-musl, i586-pc-windows-msvc.
  • Ускорено время компиляции монады с одинаковыми функциями.

Изменения в менеджере зависимостей Cargo:

  • В системе могут работать несколько cargo одновременно, блокировки теперь применяются на файлы.
  • Переменную окружения RUSTFLAGS можно использовать для передачи произвольных флагов компилятору.

Для кросс-компиляции подготовлен инструмент rustup, обеспечивающий тривиальное взаимодействие с каналами сборок компилятора (stable, beta, nightly), стандартными библиотеками и их документацией к различным операционным системам, а также обновление всего этого зоопарка одной командой.

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



Проверено: Falcon-peregrinus ()
Последнее исправление: shaiZaigh (всего исправлений: 2)
Ответ на: комментарий от RazrFalcon

Одна строка - одно действие.

Из аргументов только сложности отладки или что-то поинтереснее будет?

let res = a + b + c;

И даже вот так записать нельзя?

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

Разный - это одна возвращает Result

Нет, это как ты выше рассказывал про IoError. Т.е. take_data() может возвращать Result<Data,IoError>, preprocess может возвращать Result<PreparedData,ValidationError>, process может возвращать Result<CalculationResult,MathError> и т.д.

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

Представим, например, что я пишу свой кодогенератор, который принимает на входе язык X и на выход отдает код на ANSI C. Вопрос, почему я должен вообще делать какие-либо заявления о архитектурах и платформах? Почему недостачно того что я гарантирую соответствие стандарту? Если мой код не компилируется/не запускается на архитектуре Y это ведь не значит что мой язык Х не поддерживает архитектуру Y, это всего лишь означает что пользователь взял компилятор который не соблюдает стандарт. возьмет хороший компилятор, все будет работать.
Вот еще один пример такого подхода, язык lua, который работает на огромном количестве платформ, вот что у них написано в документации:

Lua is implemented in pure ANSI C and compiles unmodified in all known platforms. All you need to build Lua is an ANSI C compiler (gcc is a popular one). Lua also compiles cleanly as C++.

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

В самом сложном случае, когда все ошибки из чужих крейтов, определить тип сумму enum{Err1(Error1), Err2(Error2), ...} и заимплементить для него From<Error1>, From<Error2> и т.д.

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

Это одно действие: вычисление суммы a, b и c

Усложняем задачу:

let mut res...
// ...
res = (a + b) / c;

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

Чой-то я не пойму.

Берем простой псевдокод на С. Допустим, что IoError — это typedef int IoError;. А ValidationError — это struct ValidationError { char error_class; char error_num; }. Соотвественно, Result<Data, IoError> будет представлять из себя нечто вроде:

struct Result_Data_IoError {
  char type; // Data or IoError.
  union {
    Data v1;
    IoError v2;
  } value;
};
А Result<PreparedData, ValidationError> — нечто вроде:
struct Result_PreparedData_ValidationError {
  char type;
  union {
    PreparedData v1;
    ValidationError v2;
  } value;
};
Каким образом ValidationError и IoError в показанных выше случаях будут обобщенны?

Или ты ведешь к тому, что в Rust-е Result всегда должен содержать реализацию трейта Error и, фактически, речь будет идти о чем-то вроде:

struct Result_Data_IoError {
  char type; // Data or IoError.
  union {
    Data v1;
    IoError * v2;
  } value;
};
А Result<PreparedData, ValidationError> — нечто вроде:
struct Result_PreparedData_ValidationError {
  char type;
  union {
    PreparedData v1;
    ValidationError * v2;
  } value;
};

?

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

почему я должен вообще делать какие-либо заявления о архитектурах и платформах?

Я могу сказать, что лично мне ты ничего не должен. Более того, мне нафиг не нужны _твои_ заявления. Я просил ссылку на заявление авторов Nim. Если ее нет, окей.

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

Ну я и говорю, зашибись.

Видимо, Rust-оманы устали от темпа развития ИТ и хотят вернуться в конец 1980-х. Чтобы с нуля, самим, реализовывать свои GUI-библиотеки поверх WinAPI. Ибо у всех существующих есть один фатальный недостаток...

Шучу :)

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

Каким образом ValidationError и IoError в показанных выше случаях будут обобщенны?

Я не уверен, что понимать под «обобщен» и зачем что-то обобщать. Оператор "?" очевидным образом рассахаривается в стандартный Rust: https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception...

с нуля, самим, реализовывать свои GUI-библиотеки поверх WinAPI. Ибо у всех существующих есть один фатальный недостаток...

Тебе смешно, а народ тащится от nuklear

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

Я вот про вот это из твоей ссылки:

enum MyError {
    IoError(io::Error),
    JsonError(json::Error),
    OtherError(...)
}
Кто-то все это должен будет описать. И написать From.

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

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

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

Ты говоришь о несовпадении типов возвращаемого зеачения функции и типа, выдаваемого оператором "?"? Да, конечно, потребуется какое-то преобразование.

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

Из аргументов только сложности отладки или что-то поинтереснее будет?

А этого недостаточно? Тогда еще читабельность накину.

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

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

Твое личное мнение понятно. Но я спрашивал о мнении core team.

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

Ну я и говорю, зашибись.

Такое нужно, если требуется разбираться в сортах ошибок. Если достаточно записать сообщение об ошибке в лог, то можно сделать

fn do_it() -> Result<Data, Box<Error>> {
  postprocess(process(preprocess(take_data()?)?)?)?
}
red75prim ★★★
()
Ответ на: комментарий от tailgunner

Да, конечно, потребуется какое-то преобразование.

Ну вот о том и речь. В случаях с исключениями такое преобразование нужно только если кто-то захочет преобразовывать чужие исключения в свои.

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

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

Data do_it() {
  postprocess(process(preprocess(take_data())));
}

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

В сишном виде возвращаться будет

struct Result_Data_ErrorTraitObject {
  char type;
  union {
    PreparedData v1;
    struct {
       void* pErrorObject;
       ErrorVtable* pErrorVtable
    };
  } value;
};

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

Если так, то применимость Rust-а в системах реального времени — это очень такой открытый вопрос. Т.к. там работа с динамической памятью более чем ограничена. Впрочем, тут tailgunner-у виднее :)

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

А этого недостаточно?

Это проблемы инструментов.

Тогда еще читабельность накину.

А это не обязательно проблема. В смысле, не всегда страдает.

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

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

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

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

Чем это отличается от haskell?

Rust императивный, разрешает побочные эффекты. В Rust кажется вариант линейной системы типов(linear type system), но это догадка. Можно иметь несколько указателей на одну переменную(только она не всегда переменна).

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

Я не могу понять почему ты требуешь от core team указание архитектур и платформ. А если будет язык который компилируется в джаваскрипт то ты тоже попросишь core team написать поддерживаемые архитектуры процессоров?

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

let _ = do_some_operation();

В расте принято писать do_some_operation().unwrap(). А у тебя, по сути, то же самое игнорирование.

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

Быдлокод в кубе!

Илитокодер в треде!

Одна строка - одно действие.

А среднее арифметическое ты, конечно же, считаешь так:

int tmp = a + b;
int mean = tmp / 2;
Esper
()
Ответ на: комментарий от x86_64

Выпустить приемлемую версию. Что бы не надо было срочно выгрызать что-либо.

Уже сделано, называется rust 1.0

Постоянно что-то ломают в минорщине.

Если глупость повторить 10 раз она не станет менее глупой.

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

Проекты в продакшене живут по-разному. Бывает что поддерживается для sun OS v2.6, которая запускается только на машинах, снятых с производства 20+ лет назад, а бывает, что проект развивается. В первом случае есть прибитая гвоздями версия компилятора, под которую проект соберётся, причём вообще не важно, сколько там будет ворнингов. Во втором случае обновления компилятора и библиотек происходят постоянно и постоянно приходится рефакторить код под изменения в них. И в этом втором случае важно, чтоб обновления не были связаны с единомоментным переписывание всего, иначе обновление затормозится и проект превратится в говно мамонта, в котором нельзя подключить ничего нового или исправить ошибку в сторонней библиотеке путём её обновления.

Причем отсутствие предупреждений важно.

Ничуть не более, чем количество строк. Впрочем, если вопрос просто в наличии предупреждений, предупреждения определённого типа можно отключить.

Условностями они не являются. Разработчик не ДОЛЖЕН следить за изменениями в языке.

Ээээ... Даже не знаю что ответить... Я бы предположил что как раз предупреждения об устаревании как раз и нужны, чтоб разработчик не обязан был знать о планах разработчиков библиотек и компиляторов. А вот как из этого «не должен» следует важность минорных или мажорных версий - это выше моего понимания. Когда-то могли десятилетие дрочить минорные обновления, теперь вот модно выпускать мажорные каждые пару месяцев и никто кроме вас этому значения не продаёт. Linux вон обновился до 4й версии просто потому что надоела 3я, продакшеновая Java из 1.x перешла в x.0.

Когда в минорщине появляется предупреждение о устаревании просто забъют на него до перехода на версию 2.

Ну если Вася после посещения туалета не моет руки - это не повод убирать умывальники из всех туалетов

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

Не знаю, кто строит дурачка. Я тебе намекнул, что в подобных «цепочечных» вызовах, аналогично арифметическим выражениям, промежуточный результат сам по себе не всегда имеет смысл, и однозначно кричать «Говнокод!!1» про такое - несколько опрометчиво. Ну и на раста, вдогонку:

let numbers = 1..10;
let mapped = numbers.map(|a| a*a);
let sum = mapped.fold(0, Add::add);

Всё же офигенно, одна строка - одно действие, да?

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

Ну не я же.

Поясняю: я подразумевал одно логическое действие. Суммируем, вычисляем, фильтруем и тд. Такое, которое легко охарактеризовать одним словом.

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

Против кода, из вашего примера, ничего против не имею. Он делает, в моём понимании, одно действие.

Вот если бы вы написали, что-то типа:

(1..)
    .filter(|&x| x % 2 == 0)
    .filter(|&x| x % 3 == 0)
    .take(5)
    .collect::<Vec<i32>>();
Вот это уже совсем не тривиальный код.

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

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

я подразумевал одно логическое действие
Такое, которое легко охарактеризовать одним словом.

Давай так: я считаю, что действие, которое легко охарактеризовать одним словом, нет смысла выносить в отдельный statement, если его результат нельзя осмысленно охарактеризовать одним словом. Ты с этим не согласен?

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

Если глупость повторить 10 раз она не станет менее глупой.

Если 10 раз повторить что факт является глупостью, факт глупостью не станет.

Простыню пропущу. Продакшен в котором постоянно что-то переписывают не по причине добавления функциональности, а по причине изменения версий библиотек и компиляторов явно находится в параллельной вселенной.

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

Для продакшена только один вариант является полностью приемлимым. Когда в версии 2.0 появляется предупреждение об устаревании а в 3.0 выкидывают. Остальное лишь некритично плохо.

Ну если Вася после посещения туалета не моет руки - это не повод убирать умывальники из всех туалетов

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

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

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

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

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

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

Одна проблема. Такое возможно только на начальной стадии. Как только часть функциональности реализована описанная ситуация исчезает.

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

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

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

Примеры

Диалог о числах между тобой и мной где-то в параллельной реальности:

-Число 1087 явно не подпадает под определение целых чисел!
-WAT?
-Посмотри примеры в википедии, там нет числа 1087!

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

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

Ну только если шланг.
А так да, биде заимствованно из фарси, а о комбинации биде+унитаз особенно в Италии, Испании, Португалии или Франции никто не слыхивал!

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

Ну только если шланг.

А так да, биде заимствованно из фарси, а о комбинации биде+унитаз особенно в Италии, Испании, Португалии или Франции никто не слыхивал!

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

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

Биде́ (фр. bidet) — небольшая ванна с фонтанчиком для мытья наружных половых органов и ануса; обычно устанавливается рядом с унитазом

ЛОР-овское быдло прибщаемся к цивиллизации. Из фонтанчика биде воду не пить, козлёночком станете. У ха-ха-ха ха! :)

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