LINUX.ORG.RU

Rust 1.25.0

 


3

9

Сегодня вышел Rust 1.25.0 (2018-03-29).

Rust это системный язык программирования, нацеленный на надёжность, скорость и параллельное выполнение.
Если вы имеете предыдущую версию Rust, установленную через rustup, для получения версии 1.25.0 достаточно ввести в терминале:

$ rustup update stable

Что нового в 1.25.0 stable

Синтаксис

Компилятор

Библиотека

Стабилизированные API

  • Location::column;
  • ptr::NonNull;

    Наиболее значимое событие — это std::ptr::NonNull<T>. Этот тип похож на *mut T, но является ненулевым (non-null) и ковариантным. Если вкратце, NonNull<T> гарантирует, что никогда не будет равен null, а это означает, что Option<NonNull<T>> имеет тот же размер, что и *mut T. Если вы создаете структуру данных с небезопасным кодом, NonNull<T> зачастую будет правильным выбором для вас.

    Следующие функции теперь могут быть использованы в константных выражениях, т.е. например, static MINUTE: Duration = Duration::from_secs(60);:

  • Duration::new;
  • Duration::from_secs;
  • Duration::from_millis;
  • Duration::from_micros;
  • Duration::from_nanos.

Cargo

Разное

Примечания по поводу совместимости

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

★★★★★

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

Ответ на: комментарий от Crocodoom

Найди мне тут по 2 проверки на каждой итерации

fn no_checks(data: &mut [u8]) {
    for i in 0..data.len() {
        data[i] = data[i ^ i];
    }
}
elision::no_checks:
 testq   %rsi, %rsi
 je      .LBB0_6
 leaq    -1(%rsi), %rcx
 movl    %esi, %eax
 andl    $3, %eax
 cmpq    $3, %rcx
 jae     .LBB0_7
 xorl    %ecx, %ecx
 testq   %rax, %rax
 jne     .LBB0_4
 jmp     .LBB0_6
.LBB0_7:
 subq    %rax, %rsi
 xorl    %ecx, %ecx
.LBB0_8:
 movzbl  (%rdi), %edx
 movb    %dl, (%rdi, %rcx)
 movzbl  (%rdi), %edx
 movb    %dl, 1(%rdi, %rcx)
 movzbl  (%rdi), %edx
 movb    %dl, 2(%rdi, %rcx)
 movzbl  (%rdi), %edx
 movb    %dl, 3(%rdi, %rcx)
 addq    $4, %rcx
 cmpq    %rcx, %rsi
 jne     .LBB0_8
 testq   %rax, %rax
 je      .LBB0_6
.LBB0_4:
 addq    %rdi, %rcx
 negq    %rax
.LBB0_5:
 movzbl  (%rdi), %edx
 movb    %dl, (%rcx)
 addq    $1, %rcx
 addq    $1, %rax
 jne     .LBB0_5
.LBB0_6:
 retq

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

а нахер вообще нужна быстрая сортировка, если можно индексы сортировать в отдельном массиве?

в жизни же не надо сортировать что-то простое.

ckotinko ☆☆☆
()
Ответ на: комментарий от mersinvald

ты эти индексы хоть как-то оптимизируешь, или просто наобум?

если бы мне пришлось реально что-то жуткое сортировать, я бы сперва оценил «пространство вариантов», например как int256_t. затем для каждого ключа считал бы int256_t и добавил бы к нему границы «ошибки» то есть реально после поиска надо еще побродить в (key-d,key+d).

ну это если реально большая мапа.

а если она мелкая, то какая разница?

а если большая, то просто алгоритм сортировки бесполезен.

ckotinko ☆☆☆
()
Ответ на: комментарий от mersinvald

Бремя доказательств висит на доказывающем.

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

Даже выборки по ЛОР достаточно, чтобы понять - отнюдь не все сишники «отбитые» (хотя ты не опубликовал определения этого термина).

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

Есть нормальные

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

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

ваш вопрос был бы содержательным, если бы содержал версию qsort на C++, с которой предлагаете сравнивать версию на rust

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

в теории можно обойтись и без случайных чисел, выбирая опорный элемент алгоритмом k-й порядковой статистики за O(n). Но на практике так, понятное дело, не пишут.

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

Можно сравнить хотя бы с qsort на Rust с использованием unsafe. Ссылку я давал выше.

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

я лишь транслирую мнение большинства.

Т.е. «все сишники „отбитые“» - это мнение большинства? Большинства кого?

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

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

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

С такими «обсуждениями» я скоро начну постить подобные материалы куда-нибудь в свой бложик, а не на ЛОР. Там, конечно, в комментариях нет таких замечательных и неординарных личностей, как здесь, но для этого у меня есть я, зато можно подробно обмусолить каждый информационный аспект, а не склочничать.

Virtuos86 ★★★★★
() автор топика

можно использовать `|` в начале ветки сопоставления.

Охохо. Как в цацкеле делают, видно в стадо умученых от с++ растаманов перебегают умученые от с++ цацкелисты в поисках настоящего убийцы с++

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

можно использовать `|` в начале ветки сопоставления.

Охохо. Как в цацкеле делают

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

Virtuos86 ★★★★★
() автор топика
Ответ на: Ненавистникам и обожателям Rust от FAT_EXORCIST

1. Он запрещает делать всё, что в С и С++ вызывает неопределенное поведение. Статически за счет системы типов и динамически за счет стандартной библиотеки. В случаях (редких), когда это чересчур ограничивает программиста, есть unsafe, в котором появляются указатели, ассемблерные вставки и прочие радости, но unsafe можно инкапсулировать, покрыть тестами, доказать как теорему и т.п., и быть уверенным, что твоя программа не попортит память в абсолютно случайной строчке кода, не допустит buffer overflow, не упустит нолик в нуль-терминированной строке и т.д. Само собой разумеется, что это защищает только от определенного класса эксплойтов (хотя и очень большого) и не поможет, если твой веб-сервер плейнтекстом гоняет пароли по сети.

2. Языки для разных задач, но а) детерминированное управление ресурсами вместо сборки мусора, б) дженерики, в) move semantics и константность переменных по умолчанию, что сильно влияет на весь стиль программирования. Можно поспорить, но, ИМХО, в лучшую сторону.

3. К синтаксису можно привыкнуть. Для поддержки ПО критична архитектура, а не способ объявлять переменные. Засранную архитектуру, возможно, поддерживать будет сложнее, потому что может быть сложнее закостылить какую-то фичу за час до дедлайна, но это такой себе недостаток.

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

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

2. Перед Го преимущество, например, в большем числе гарантий и возможностей, которые Го и не снились.*

3. Но все вышеперечисленное отнюдь не означает, что Раст нам ниспослан Богом и все должны срочно учить Раст. Все вышеперечисленное означает, что за все нужно платить. За все те гарантии и возможности вы платите соответствующими ограничениями и синтаксис их яркий пример. Нет, привыкнуть к нему возможно далеко не всегда. И даже привыкнув, вы все равно будете менее продуктивны, чем могли бы. Я глубоко сомневаюсь, что датасайентист променяет свой Питон или R на Rust несмотря на все гарантии последнего. В Rust'е ты вместо того, чтобы решать свою задачу по нахождению экстремума целевой фукнции ты будешь бороться с временем жизни переменной, которую ты и ввел-то только чтобы проверить какое влияние она окажет на данные. Так что для всего есть свой инструмент и есть задачи где Rust сияет, а есть где лучше его не использовать.

* ну и я бы не сказал, что Раст лучше Го или наоборот, это два заметно разных языка, правильнее задать вопрос для каких задач они лучше

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

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

Это было правдой до фейла с Therac-25/червя Морриса/Code Red, или после?

Может, на самом деле эти профессионалы просто поняли, что все такие «возможности» обойти не получится даже с поставленными процессами код-ревью и выход за буферы в программах на C/C++ будет всегда, заебались обходить эти возможности вместо того, чтобы заниматься решением бизнес-задач, и ищут способы спихнуть эту тупую работу компилятору?

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

и ищут способы спихнуть эту тупую работу компилятору?

Расскажите, как Rust защитит от фейла Therac-25. Очень интересно.

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

Расскажите, как Rust защитит от фейла Therac-25. Очень интересно.

Судя по Wikipedia, Therac-25 был обширным набором фейлов и никакой ЯП от них всех не защитил бы. Но Rust защитил бы от этого:

The equipment control task did not properly synchronize with the operator interface task, so that race conditions occurred

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

Но Rust защитил бы от этого

Если эти таски были независимыми процессами в какой-нибудь RTOS, то не защитил бы.

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

Если эти таски были независимыми процессами в какой-нибудь RTOS

Если бы там была RTOS с процессами.

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

Зависит, вообще говоря. Интерфейс IPC при правильном подходе должен полагаться на Send/Sync и их гарантии.

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

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

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