Подготовлен (https://blog.rust-lang.org/2017/07/20/Rust-1.19.html) релиз языка программирования Rust 1.19 (http://www.rust-lang.org), развиваемого проектом Mozilla, обеспечивающего автоматическое управление памятью и предоставляющего средства для высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime. Параллельно с Rust совместно с компанией Samsung развивается экспериментальный браузерный движок Servo (https://www.opennet.ru/opennews/art.shtml?num=44712), написанный (https://github.com/servo/servo/) на языке Rust и отличающийся поддержкой многопоточного рендеринга web-страниц и распараллеливанием операций с DOM (Document Object Model). На Rust также разрабатывается (https://www.opennet.ru/opennews/art.shtml?num=46459) операционная система Redox (https://www.redox-os.org/), использующая концепцию экзоядра и продвигающая принцип "все есть URL".
В подготовке нового выпуска приняли участие 144 разработчика. Основные новшества (https://github.com/rust-lang/rust/blob/master/RELEASES.md#ve...):- Добавлена поддержка структур данных "union (https://github.com/rust-lang/rfcs/blob/master/text/1444-unio...)", представляющих собой объединения, совместимые с аналогичным типом в языке Си. В отличие от структур enum, в union не производится сохранение тегов, используемых для проверки выбора корректного варианта данных во время выполнения, т.е. запись и чтение полей в "union" может применяться только в блоках unsafe. Основным назначением union является обеспечение переносимости с кодом на языке Си и упрощение создания обвязок вокруг библиотек на Си;
union MyUnion {
f1: u32,
f2: f32,
}let u = MyUnion { f1: 1 };
unsafe { u.f1 = 5 };
let value = unsafe { u.f1 };- Реализована возможность прерывания цикла с возвратом определённого значения. Например, теперь можно обойтись без создания промежуточной переменной для передачи результата и использовать конструкции вида "let x = loop { break 7; };"
- Замыкания (closures), которые не захватывают окружение, теперь могут быть приведены к типу "указатель на функцию". Например, "let f: fn(i32) -> i32 = |x| x + 1;";
- Для сжатия архивов вместо gzip по умолчанию теперь применяется сжатие с использованием xz;
- Добавлена поддержка сборки компилятора (bootstrap (https://github.com/rust-lang/rust/tree/master/src/bootstrap)) в окружении платформы Android;
- В разряд стабильных переведена новая порция (https://github.com/rust-lang/rust/blob/master/RELEASES.md) функций и методов, в том числе API OsString::shrink_to_fit, cmp::Reverse, Command::envs и thread::ThreadId. Также стабилизированы макросы "eprint!" и "eprintln!", которые работают по аналогии с "print!" "еprintn!", но выводят результат в stderr вместо stdout;
- В пакетном менеджере Cargo прекращён учёт локального рабочего каталога в индексе crates.io, что позволило добиться сокращения размера файла со сборочным реестром и уменьшить время операций клонирования. В команду "cargo bench" добавлена опция "--all" для вызова тестов сразу для всех пакетов в указанном рабочем окружении (отдельные пакеты можно исключить через опцию "--exclude"). В опции
"--features" теперь допускается перечисление нескольких значений, разделённых запятой или пробелом. Реализована возможность подключения своих обработчиков (runner) для заданных целевых платформ.Напомним, что язык Rust сфокусирован на безопасной работе с памятью и обеспечении высокого параллелизма выполнения заданий. При этом Rust обходится без использования сборщика мусора или runtime, что делает возможным создания на Rust библиотек, которые могут выступать в роли прозрачной замены библиотекам для языка Си. Для распространения библиотек на языке Rust, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo (http://blog.rust-lang.org/2014/11/20/Cargo.html), позволяющий получить нужные для программы библиотеки в один клик. Для размещения библиотек введён в строй репозиторий crates.io (https://crates.io/).
По структуре язык Rust напоминает C++, но существенно отличается в некоторых деталях реализации синтаксиса и семантики. Автоматическое управление памятью избавляет разработчика от манипулирования указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Rust поддерживает смесь императивных, процедурных и объектно-ориентированных методов с такими парадигмами, как функциональное программирование, обобщённое программирование и метапрограммирование, в статических и динамических стилях.
URL: https://blog.rust-lang.org/2017/07/20/Rust-1.19.html
Новость: http://www.opennet.ru/opennews/art.shtml?num=46900
Годно... Заменит питон в машинном обучении - вообще будет замечательно
С чего бы это? У языков совсем разные цели и характеристики.
Но зачем? Rust же не векторный язык программирования как тот же R, или уж тем более не дифференцируемый и не вероятностный. Это нерационально же будет. Надеетесь получить какую-то экономию памяти и быстродействие? Вряд-ли это выйдет существенно.
Раст претендует на функциональность. По производительности, естественно, питон он превосходит и идея в том, чтобы вообще использовать Раст в качестве основного языка, а не как нашлёпку над С++ библитеками в случае питона.
> использовать Раст в качестве основного языкаКаргокультисты as is.
Забивать гвозди молотком, подметать молотком, резать хлеб молотком и т.д.
топором
>Rust поддерживает смесь императивных, процедурных и объектно-ориентированных методов с такими парадигмами, как функциональное программирование, обобщённое программирование и метапрограммирование, в статических и динамических стилях.Будто спайс. Впрочем, пользователи Rust'a это растаманы, так что есть что-то общее.
И вот даже https://benchmarksgame.alioth.debian.org/u64q/rust.html взять тесты производительности Раста против Си. Там же четко видно, что оно быстрее, но потребляет больше и при том значительно памяти.
https://benchmarksgame.alioth.debian.org/u64q/compare.php?la...
А если взять против Си++, то он побеждает преимущественно в парсерах и мне кажется, что там победа из-за того, что используются другие алгоритмы в библиотеках раста, на комбинаторах, а не из-за преимущества языка в основном.
>И вот даже https://benchmarksgame.alioth.debian.org/u64q/rust.html взять тесты
>производительности Раста против Си. Там же четко видно, что оно быстрееТам же четко видно, что оно быстрее только в 1-м из 10-и воплощённых алгоритмов.
Когда кажется...
> Реализована возможность прерывания цикла с возвратом определённого значения.
>... использовать конструкции вида "let x = loop { break 7; };"Вот из-за таких вещей язык становиться всё больше неадекватным.
В расте же почти все - это выражения. Почему бы и нет
Ну да, внедрив одну не самую прекрасную возможность из Algol68, они не могут остановиться и комбинируют её с другой не лучшей чертой - подчёркнутой неструктурностью потока выполнения. Авторы языка, пытаясь решить одни проблемы кодирования, возводят в стандарт вещи, приводящие к другим проблемам кодирования.
Ну какие тут конкретно "проблемы кодирования"? В том же С++ это делается так:auto x = []{ for(...) return 7; }();
> Ну какие тут конкретно "проблемы кодирования"?Это в 2-х словах не объяснить, потому что требует глубокого понимания и на простых примерах никак не проявляется. В этом состоит одна из проблем любителей принимать решения на основе созерцания микроскопических кусков кода. А дело в нарушении структурности потока выполнения, которое является важной составляющей надёжного программирования. В том же MISRA C неструктурное кодирование запрещено почти полностью.
Это нововведение никак не нарушает структурность кода. Это простой ретурн из выражения, которого раньше почему-то не было во отличие от тех же ифов.В MISRA C запрещены goto и неявная рекурсия, а не возвращения значения из цикла.
> Это нововведение никак не нарушает структурностьНарушает, так как струтктурность подразумевает три вида переходов: последовательное, ветвление, цикл по условию. Никаких прыжков из середины цикла не предусмотрено в том числе.
> В MISRA C запрещены goto и неявная рекурсия, а не возвращения значения из цикла
Кроме этого там запрещены continue и return из середины функции. Один(не больше) break, хотя и нарушает структурность, но дозволен из соображений оптимальности. Возвращение значения из цикла в MISRA C не запрещено, потому что его нет в самом C, если только Вы не имеете ввиду return, так он, как раз, запрещён.
> Нарушает, так как струтктурность подразумевает три вида переходов: последовательное,
> ветвление, цикл по условию.Вы так говорите, как будто:
int foo(const char *arg1, int arg2, ... arg5) {
if (!arg1) return INVALID_ARG1;
if (arg2 < 42) return INVALID_ARG2;
..
return result;
от нечистого, зато
int foo(const char *arg1, int arg2, ... arg5) {
if(arg1) {
if(arg2 >=42) {
...
} else {
result = INVALID_ARG2;
}
} else {
result = INVALID_ARG1;
}
return result;
}return result;
}
Прям образец читаемости и вникаемости.
if (NULL == arg1) result = INVALID_ARG1;
else if (arg2 < 42) result = INVALID_ARG2;
else {
....
}
end_code(context);
return result;
При неструктурном программировании проблемы с end_code случаются регулярно, в том числе и критические, а "образец читаемости и вникаемости" (с) получается, как правило, от низкой культуры кодирования, которая, в свою очередь, прививается при использовании неструктурного подхода.
проблемы начинаются когда внутрь цикла начинают пихать десять выходов в разных "местах", по сути оптимальным было бы отсутствие операции выхода из цикла(оставить только окончание итерации и переход к условию)
>По структуре язык Rust напоминает C++От чего ушли, к тому и пришли.
А они разве уходили?
NIH жеВ каждую новость копипастят: "По структуре язык Rust напоминает C++, но".
> На Rust также разрабатывается операционная система Redox, использующая концепцию экзоядрастранно, документация говорит что система микроядерная
https://doc.redox-os.org/book/design/kernel/microkernels.html
> Redox has less then 9,000 lines of kernel code. For comparison Minix has ~6,000 lines of kernel code.
> Для сжатия архивов вместо gzip по умолчанию теперь применяется сжатие с использованием xzИ это запихнуто в сам язык? Не в либы, пристёгиваемые по выбору девелопера, а в само ядро? Ну охренеть...
Нет, это не запихано ни в язык, ни в стандартную библиотеку. Там просто начали по другому ужимать готовый бинарник самого компилятора, который вы можете скачать на сайте или через rustup.
Просто это типичный перевод новости на русский язык без понимания контекста.
Так завезут когда-то зависимые типы или как выше написали, будут и дальше копировать фичи с алгола68?
> Так завезут когда-то зависимые типы или как выше написали, будут и дальше
> копировать фичи с алгола68?Можете раскрыть тему чуть подробней?
Опишите, пожалуйста, какие потребности это должно удовлетворить. Почему Вы считаете, что зависимые типы долждны появиться в Rust? Это активно обсуждалось у разработчиков?
Обсуждалось. https://github.com/rust-lang/rfcs/pull/1933Это очень удобная фишка, которая позволяет, например, объявлять типы параметризованные значением. Не другим типом, а значением.
Там в rfc неплохой пример есть:
impl<const n: usize, T: Clone> Clone for [T; n] {
fn clone(&self) -> [T; n] {
// Clone it...
}
}Так могла бы выглядеть реализация трейта Clone, создающего копию объекта, для всех возможных типов слайсов. Сейчас в стандартной библиотеке rust'а, есть *33* реализации трейта PartialEq (это операция ==) для слайсов с размерами от 1 до 32. Да, конечно, там не 33 раза написано impl PartialEq for ... бла-бла-бла..., там ради такого написано макрос принимающий в качестве параметра значение типа usize.
Собственно за подробностями можно сходить сюда: https://doc.rust-lang.org/src/core/array.rs.html
И найти там строчки https://doc.rust-lang.org/src/core/array.rs.html#213-218 :array_impls! {
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32
}Это, так сказать, квинтэссенция всего предыдущего макрописания. Раскрытие этого макроса компилятором приводит к появлению 33*16 отдельных блоков impl (33 значения для N, и, если я не сбился со счёта, 16 трейтов, типа AsRef, AsMut, Borrow, BorrowMut, PartialEq...), каждый из которых реализует 1-2 функции.
Можно такие штуки делать макросами, но это раздувает код. И это работает только для конечного числа значений n. С зависимыми типами можно будет обойтись без макросов и написать 16 блоков impl, по одному на каждый трейт реализуемый слайсом, а затем компилятор уже будет инстанцировать эти реализации _по_мере_необходимости_.
Вау! Все перечисленные нововведения туфта, по сравнению с тем, что скорость компиляции реально выросла. Мне сложно сравнить скорость компиляции с gcc, clang или ещё кем-то (это надо делать не "на глаз", а организовать какое-то тестовое окружение и померять), но 1.19, по сравнению с тем кошмаром, который был в 1.18, просто летает.
Мозилла обещала, Мозилла сделала.
> Мозилла обещала, Мозилла сделала.Вы, случайно, не в курсе, она не обещала сделать браузер для людей?
>> Мозилла обещала, Мозилла сделала.
> Вы, случайно, не в курсе, она не обещала сделать браузер для людей?Обещала. Кстати, с выполнением этого обещание у неё тоже есть подвижки: https://metafluff.com/2017/07/21/i-am-a-tab-hoarder/
>> Мозилла обещала, Мозилла сделала.
> Вы, случайно, не в курсе, она не обещала сделать браузер для людей?А тебе-то какая разница?