LINUX.ORG.RU

Rust 1.24

 


3

9

Команда Rust рада сообщить о выпуске Rust 1.24.0. Rust — это системный язык программирования, нацеленный на безопасность, быстрое и параллельное исполнение программ.

Если у вас уже установлена предыдущая версия через rustup, для обновления просто выполните

$ rustup update stable

Для новой установки скачайте rustup и не забудьте прочитать примечания к выпуску 1.24.0 на GitHub.

Что нового в Rust 1.24.0?

rustfmt

Несколько лет мы ждали инструмент для автоматического приведения исходного кода на Rust в «стандартный вид». Встречайте предварительную версию rustfmt! Чтобы попробовать, просто выполните

$ rustup component add rustfmt-preview

Нужно отметить два важных момента: во-первых, вы должны использовать именно rustup component add, а не cargo install. Если вы ранее использовали rustfmt через cargo install, вам необходимо предварительно его удалить. Во-вторых, не забывайте о том, что rustfmt ещё не достиг версии 1.0. Некоторые детали пока в разработке, а баги в процессе исправления. Как только rustfmt достигнет версии 1.0, компонент rustfmt-preview будет объявлен устаревшим и заменён на rustfmt.

В ближайшее время мы планируем написать отдельный пост об этой стратегии выпусков. Для дополнительной информации смотрите страницу rustfmt на GitHub.

Пошаговая сборка

Ещё в сентябре 2016 года мы подробно писали об этом в нашем блоге. Идея пошаговой компиляции довольна проста: если поддерживается этот механизм, то пересобираться будет только тот код, который был изменён с момента предыдущей компиляции. Это намного быстрее, чем полностью собирать весь проект, даже если изменения исходного кода достаточно малы. Начиная с версии 1.24, пошаговая компиляция включена по умолчанию. Не забудьте о cargo check, если будете пытаться достигнуть минимально возможного времени сборки.

Важно отметить, что и работа над производительностью компилятора в целом, и над пошаговой сборкой в частности, будет продолжена. Кое-что доступно уже в этом выпуске 1.24.0 — значение codegen-units теперь 16 по умолчанию. Одно небольшое замечание об этом изменении: оно делает компиляцию быстрее, но исполняемый файл получается немного медленнее. Для максимальной скорости программы выставьте codegen-units в 1 в вашем Cargo.toml.

Другие изменения

Есть ещё одно изменение, о котором мы хотели бы поговорить: неопределённое поведение (undefined behavior). Как правило, Rust старается избегать неопределённого поведения, исключив его полностью из безопасного (safe) кода, и сведя к минимуму в небезопасном (unsafe) коде. Одним местом, где вы всё ещё могли получить неопределённое поведение, была ситуация, когда вызов panic! проходит через FFI.

extern "C" fn panic_in_ffi() {
        panic!("Test");
}

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

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

Стабилизация библиотек

Если вы любитель функции str::find, которая используется для нахождения char в &str, вы будете рады узнать, что она стала быстрее в 10 раз! Этого удалось достигнуть использованием memchr. [u8]::contains теперь также его использует, хотя прирост скорости оказался более умеренным.

Несколько новых API были стабилизированы в этом выпуске:

Следующие функции теперь могут быть использованы в постоянных выражениях (constant expressions), например при инициализации static:

  • new функции для Cell, RefCell и UnsafeCell
  • new функции для различных целочисленных Atomic типов
  • {integer}::min_value и max_value
  • size_of и align_of для mem
  • ptr::null и null_mut

Смотрите примечания к выпуску для более подробной информации.

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

★★★★★

Проверено: jollheef ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от shkolnick-kun

Что за испорченный телефон? Один [censored] ляпнул тупость и теперь весь форум за ним повторяет. memchr это не функция из сишки, это функция из libstd написанная на чистом расте, и работает на всех платформах без исключения.

Неужели так сложно посмотреть первоисточник? https://github.com/rust-lang/rust/pull/46735/files

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

А конкретнее (не всё ж с хэйтерками препираться)?

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

Трейт-объекты - понятно, а в структуре памяти (чего?) зачем разбираться? Толстая ссылка на трейт объект - это пара указатель на данные/указатель на таблицу функций, в этом вроде особо разбирать нечего.

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

А почему кода становится все больше? Я думал должен быть прогресс, все должно быть проще, короче. А в 2018 нету нормальных формошлепок (у gambas, qt, lazarus но языки нете! Да и серьезные только qt, lazarus).
https://github.com/kraj/uClibc/blob/master/libc/string/memchr.c#L17
vs
https://github.com/rust-lang/rust/pull/46735/files#diff-69c293cdc7f454b8c690a...
Или я неправильно понимаю цель раста? Он за memsafe что угодно убьет?) Я без тролинга.)

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

https://github.com/kraj/uClibc/blob/master/libc/string/memchr.c#L17

Кхм. Ты сравниваешь объем навороченной реализации с блэкджеком, шлюхами и тестами, с объемом тупого прохода по массиву байтов?

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

Чушь. При реализации крупного проекта, его вначале проектируют на бумаге, учитывают все риски и целесообразности, а только затем начинают воплощать в жизнь.

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

Что до важности проектирования и «и эти люди претендуют на звание системного языка», в java, кажется, 8 исправили небольшой косяк с хэшмапом: до этого в случае коллизии хэшмап вырождался в связанный список. Даже не в массив, а именно в связанный список. И это при том, что хэши не солились никак, т.е. можно было подобрать строки и повесить сервер. C++ десятилетиями сидел на деревьях и связанных списках, и только в 11й версии стандарта добавили unordered_map, но api спроектировали так, что вменяемая реализация невозможна, только те же бакеты являющихся связанными списками. Можно вспомнить ещё auto_ptr, который добавили чтоб тут же выкинуть.

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

Ну сейчас сравним. Как там в расте запросить 512 мб памяти? Через box но как массив то взять. И какой флаг для rustc == -Ofast? Я все это знал но забыл.

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

Как там в расте запросить 512 мб памяти?

const ARRAY_SIZE: usize = 1024 * 1024 * 512;
let vec = vec![0u8; ARRAY_SIZE];
let array_on_heap = vec.into_boxed_slice();

Ты сам бокс попросил, если что, он тут совершенно не обязателен, вектор — это уже твои 512мб.

какой флаг для rustc == -Ofast

Ты ищешь флаги, специфичные для одного компилятора в другом. Зачем?

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

Я уже заюзал вектор, да. Только нужен rust unstable которого у меня на OpenBSD нет.)) Компелять как я понял надо, лучше в виртуалочку поставлю. linux запущу.

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

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

linuhs_user
()

В TinyCore не заработала мышка. Никто не хочет сравнить memchr из unstable с этим? А то у меня на флешку live образы не влезут, а виртуалка тормозная.
Rust: https://pastebin.com/h4DxcNj2
C: https://pastebin.com/GK8GHCGn

А я пойду диск поищу, с моими познаниями Only-OpenBSD это слишком.

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

А что-нибудь существенное на нем когда-нибудь напишут? 7 лет уже, время подводить какие-никакие итоги...

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

Ты сделал баг в раст версии, причем такой что портит скор :) в си версии ты ищешь 7 а потом 77 а в раст версии ты два раза ищешь 7. Семерка находится дальше чем 77, так что время будет больше.

Я поправил:

$ rustc -C opt-level=3 -C target-cpu=native main.rs && time ./main
real	0m0.989s
user	0m0.767s
sys	0m0.214s

$ clang -Ofast -march=native main.c && time ./a.out 
real	0m2.566s
user	0m2.336s
sys	0m0.210s

И еще я для сравнения вызвал memchr из libc

$ clang -Ofast -march=native main.c && time ./a.out
real	0m0.792s
user	0m0.570s
sys	0m0.213s
pftBest ★★★★
()
Ответ на: комментарий от pftBest

Спасиба.

в си версии ты ищешь 7 а потом 77 а в раст версии ты два раза ищешь 7

А это я копипастой вставил, я и скобку забыл закрыть, мде.

Ох ну странно, я думал будет быстрее.

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

Браузеры (servo, куски firefox), игры (SHAR), тулзы (mdbook, ripgrep, alacritty, pijul), операционные системы (redox), оконные менеджеры (way-cooler) и прочие подобные мелочи считаются?

quantum-troll ★★★★★
()
Ответ на: комментарий от linuhs_user
clang version 3.9.1-4ubuntu3~16.04.2 (tags/RELEASE_391/rc2)

clang -Ofast -march=native main.c && time ./a.out

real    0m1.890s
user    0m1.641s
sys     0m0.219s

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.6) 5.4.0 20160609

gcc main.c -Ofast -march=native && time ./a.out

real    0m2.038s
user    0m1.781s
sys     0m0.250s

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

gcc умеет

for(i = 0;i != MAX;i++)
    buff[i] = 0;
заменять на
memset(buff, 0, MAX);
я вот думал что то такое будет, и выйдет примерно так же.

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

Трейт-объекты - понятно, а в структуре памяти (чего?) зачем разбираться? Толстая ссылка на трейт объект - это пара указатель на данные/указатель на таблицу функций, в этом вроде особо разбирать нечего.

На хелоувордах - да, а когда надо было делфи код переписать, то даже с помощью сообщества не удалось сделать. См. ниже.

А конкретнее (не всё ж с хэйтерками препираться)?

Virtuos86 В сущности вот задача:

канал связи имеет одинаковые методы (настроить, открыть, писать, читать, 
закрыть), но физически может соответствовать разным сущностям COM, Ethernet, 
GSM, Различные преобразователи.

Счётчики имеют общие для своего типа (воды, электричества, тепла) методы и 
индивидуальные методы (прочитать журнал событий), а так же у каждого счётчика 
разный протокол. Ну и один и тот же счётчик можно подключить к разным каналам 
связи. Счётчик не должен знать, через что идут его команды. объекту главное 
видеть свой запрос по протоколу и ответ от физического счётчика, чтобы 
изменить своё состояние (например, расход электричества).
В общем, есть типаж для канала связи. Есть типаж для счётчиков и 108 реализаций различных протоколов обмена. Боль в том, что просто типаж указать нельзя для типов в структуре (объекте), нужно юзать типа Weak\Arc<Trait>, тут появляются косяки с тем что типажи имеющие type в себе не могут быть получены из конструкций аля Arc<Trait<Type = xxx>>. И если переносить код один в один, то окажется, что канал связи ссылается на счётчик, а счётчик внезапно на канал связи. И кто-то из объектов не может быть unsized и т.д.

В итоге, реализация данной задумки стала для меня сущим адом. Но возможно, что у меня появиться достаточно свободного времени чтобы глубоко разобраться в проблеме и решить её. Но пока это выглядит не подъёмным.

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

на макоси у меня gcc нету, поэтому в этот раз тестил на другом компе:

$ rustc -C opt-level=3 -C target-cpu=native main.rs && time ./main
real	0m0.595s
user	0m0.442s
sys	0m0.150s

$ gcc -Ofast -march=native main.c && time ./a.out
real	0m2.055s
user	0m1.898s
sys	0m0.152s

glibc:
$ gcc -Ofast -march=native main.c && time ./a.out
real	0m0.489s
user	0m0.339s
sys	0m0.147s

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

Браузеры (servo, куски firefox)

Так ч0, servo взлетел? Детские болезни - вроде отъедания 16 Гб памяти и 1000 потоков на 2 сайтиках сумел перебороть? Вроде авторы решил забить на него и заняться каким-либо другим креативным творчеством. А в лисе rust'а ну настолько мало и написан на нем такой малоответственный участок, что даже смешно.

mdbook, ripgrep, alacritty, pijul

Хм, пейсатели на питухоне напряглись. (Да, я быстро погуглил по названиям.)

операционные системы (redox), оконные менеджеры (way-cooler)

Кто-нибудь это использует? Продукты прошли горнило практического использования? Или это оскорбительно для поделий потребителей смузи?

anonymous
()
Ответ на: комментарий от red75prim
gcc main.c -O3 -march=native -o gcc-vesrion
clang main.c -O3 -march=native -o clang-version
hazker$ time ./gcc-vesrion  
0x154e2efc4000
0x154e2efc4000
0x154e2efc4000
0x154e2efc4000
0x154e2efc4000
0x154e2efc4000
0x154e2efc4000
0x154e2efc4000
0x154e171c4000
0x154e171c4000
0x154e171c4000
0x154e171c4000
0x154e171c4000
0x154e171c4000
0x154e171c4000
0x154e171c4000
    0m04.16s real     0m03.55s user     0m00.34s system
hazker$ time ./clang-version  
0x1a1ccea22000
0x1a1ccea22000
0x1a1ccea22000
0x1a1ccea22000
0x1a1ccea22000
0x1a1ccea22000
0x1a1ccea22000
0x1a1ccea22000
0x1a1cb6c22000
0x1a1cb6c22000
0x1a1cb6c22000
0x1a1cb6c22000
0x1a1cb6c22000
0x1a1cb6c22000
0x1a1cb6c22000
0x1a1cb6c22000
    0m07.59s real     0m06.72s user     0m00.59s system

<troll> Короче все ясно, раст там наверное за 20 секунд выполняется совсем. Просто вы заговорщики, а сишка самая быстрая даже без оптимизаций </troll>

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

добавили unordered_map, но api спроектировали так, что вменяемая реализация невозможна

Можно чуть подробнее, о чем речь?

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

Если у тебя есть только стабильная версия компилятора то ты можешь воспользоваться секретным флажком в переменной окружения:

RUSTC_BOOTSTRAP=1 rustc -C opt-level=3 -C target-cpu=native main.rs && time ./main

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

Извини что назвал тебя нехорошим словом, просто я был очень недоволен тем что прочитал.

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

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

Статистика на гитхабе с тобой не согласна.

А в лисе rust'а ну настолько мало и написан на нем такой малоответственный участок, что даже смешно.

Я бы не сказал, что webrender это совсем уж маленький и малоответственный участок.

quantum-troll ★★★★★
()
Ответ на: комментарий от linuhs_user

Что-то в твоей libc не так, ну не может она быть на пол секунды медленнее чем тривиальный цикл. Может она у тебя без оптимизаций собрана?

pftBest ★★★★
()
Последнее исправление: pftBest (всего исправлений: 1)
Ответ на: комментарий от pftBest
gcc with u_memchr
    0m10.03s real     0m09.11s user     0m00.63s system
	
gcc with string.h memchr
    0m10.24s real     0m09.24s user     0m00.71s system
	
clang with u_memchr
    0m08.30s real     0m07.00s user     0m01.01s system
	
clang with string.h memchr
    0m10.54s real     0m09.14s user     0m01.10s system
	
rust version
    0m02.51s real     0m01.45s user     0m01.07s system

Обидно.)

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

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

В арче надо лазить в аур, дебиан новый не хочет мои видео-драйвера ставить, не хочет выключать компьютер, отходит сеть, старый дебиан - старый, void - там какие то проблемы, не помню.)) И пакетов мало. Винда BSODит/виснет установщик на новых.

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

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

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

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

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

Что касается ваших [censored], то разбирайтесь с ними сами, не перенося на меня их тупости...

Кстати, связь с glibc memchr тут все таки есть.

Очередная демонстрация NIH-елизма!

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

Что касается ваших [censored], то разбирайтесь с ними сами, не перенося на меня их тупости...

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

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

Кстати, связь с glibc memchr тут все таки есть.

Нету никакой связи. Ноль. Прочитай еще раз что там в комментарии написано, а потом посмотри что в коммите сделано.

Я думал «компетентным людям» будет видно что в коде нет SIMD инструкций.

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