#rust #article #suckassstory
parking_lot: ffffffffffffffff...
История разбора противного бага, который в конечном счёте свёлся к логической ошибке в parking_lot. Напоминание о том, что Rust позволяет удостовериться в том, что примитивы синхронизации корректно используются, но не особо помогают с реализацией этих примитивов.
Из хороших новостей: этот баг в parking_lot в итоге пофиксили, а разработчики в процессе фикса бага построили инфраструктуру для сбора метрик об исполнении кода.
parking_lot: ffffffffffffffff...
История разбора противного бага, который в конечном счёте свёлся к логической ошибке в parking_lot. Напоминание о том, что Rust позволяет удостовериться в том, что примитивы синхронизации корректно используются, но не особо помогают с реализацией этих примитивов.
Из хороших новостей: этот баг в parking_lot в итоге пофиксили, а разработчики в процессе фикса бага построили инфраструктуру для сбора метрик об исполнении кода.
Fly
parking_lot: ffffffffffffffff...
Gnarliest Rust proxy bug yet.
❤6
#prog #rust #article
bzip2 crate switches from C to 100% rust
TL;DR: новая версия кода быстрее реализации на C и за счёт того, что написана на Rust, проще кросс-компилируется.
bzip2 crate switches from C to 100% rust
Why bother working on this algorithm from the 90s that sees very little use today? The thing is that many protocols and libraries still need to support bzip2 to be compliant with their specification, so many project still, deep down in their dependency tree, depend on bzip2.
TL;DR: новая версия кода быстрее реализации на C и за счёт того, что написана на Rust, проще кросс-компилируется.
🔥21
#prog #rust хайлайты:
Добавили
Добавили
Vec::peek_mut
. Метод схож с уже существующим BinaryHeap::peek_mut: он возвращает опциональное значение, позволяющее менять последний элемент вектора и при необходимости доставать его без необходимости разворачивать Option
. Судя по обсуждению, есть шанс, что стабилизируют его под другим именем.GitHub
add Vec::peek_mut by Qelxiros · Pull Request #142046 · rust-lang/rust
Tracking issue: #122742
#prog #rust #rustreleasenotes
Вышла версия Rust 1.88.0! Как всегда, тут только кусочки, всё остальное — в детальных заметках о релизе.
▪️Наконец-то стабилизировали let chains! 🎉🎉🎉 Джва года ждал. Пример утащу прям из блогопоста:
К сожалению, из-за соображений обратной совместимости, связанных с временем жизни временных выражений в
▪️Специфическая вещь: стабилизировали так называемые naked functions — функции, для которых не генерирует при кодгене пролог и эпилог. Их тело состоит из ассемблерного кода. Периодически требуется для написания низкоуровневого кода.
▪️В cfg-атрибутах теперь можно использовать литералы true и false. Как пишут в блогопосте:
▪️В Rust вызов методов автоматически создаёт ссылку, если метод вызывается на значении. Это удобно, но иногда позволяет написать код, который делает потенциально небезопасную операцию и при этом не выглядит таковым. Именно, если значение, на котором вызывается метод, является результатом разыменовывания сырого указателя, то для корректности этого вызова нужно, чтобы указатель не был null, указывал на корректное значение и был корректно выровнен — иными словами, чтобы указатель удовлетворял требованиям корректности для ссылки. Для того, чтобы отлавливать подобные ошибки, добавили для этого линт. Пока что он warn by default, но в будущем планируют поднять до deny by default.
▪️Для
▪️Стабилизировали некоторые API:
🔸Cell::update — наверное, один из самых частых паттернов использования
🔸
🔸
🔸Целая пачка геттеров для proc_macro::Span. Позволит писателям процедурных макросов делать более полезные диагностики.
🔸<[T]>::as_chunks, который разбивает переданный слайс на слайс массивов переданного const-параметром длины и остаток, который не влез, вместе с мутабельными вариациями, unchecked (UB, если остаток не пустой и длина нужных массивов равна нулю) и разбитием в обратную сторону.
🔸std::hint::select_unpredictable. Вызов
Дополнительно некоторые API теперь доступны в const контекстах:
🔸NonNull::replace и <*mut T>::replace
🔸std::ptr::swap_nonoverlapping
🔸Пачка методов на
▪️Cargo теперь умеет автоматически удалять старые файлы из кеша. Именно, на тяжёлых командах проверяет и удаляет скаченные файлы старше трёх месяцев и файлы из локальной файловой системы старше месяца. К сожалению, пороги не настраиваются.
▪️Cargo теперь использует zlib-rs для операций, требующих (за, рас)паковки gzip-файлов (например, cargo package). Для пользователя ничего не поменялось, но соответствующие операции стали работать быстрее. В pull request-е приводится в пример windows-bindgen, для которого cargo package работает на 60% (!) быстрее.
▪️Для rustdoc стабилизировали флаги, позволяющие указывать внешние программы, используемые для запуска док-тестов, требующих кросс-компиляции. Также
Вышла версия Rust 1.88.0! Как всегда, тут только кусочки, всё остальное — в детальных заметках о релизе.
▪️Наконец-то стабилизировали let chains! 🎉🎉🎉 Джва года ждал. Пример утащу прям из блогопоста:
if let Channel::Stable(v) = release_info()
&& let Semver { major, minor, .. } = v
&& major == 1
&& minor == 88
{
println!("`let_chains` was stabilized in this version");
}
К сожалению, из-за соображений обратной совместимости, связанных с временем жизни временных выражений в
if let
, эта фича доступна только в edition 2024.▪️Специфическая вещь: стабилизировали так называемые naked functions — функции, для которых не генерирует при кодгене пролог и эпилог. Их тело состоит из ассемблерного кода. Периодически требуется для написания низкоуровневого кода.
▪️В cfg-атрибутах теперь можно использовать литералы true и false. Как пишут в блогопосте:
Previously, empty predicate lists could be used for unconditional configuration, like cfg(all()) for enabled and cfg(any()) for disabled, but this meaning is rather implicit and easy to get backwards. cfg(true) and cfg(false) offer a more direct way to say what you mean.
▪️В Rust вызов методов автоматически создаёт ссылку, если метод вызывается на значении. Это удобно, но иногда позволяет написать код, который делает потенциально небезопасную операцию и при этом не выглядит таковым. Именно, если значение, на котором вызывается метод, является результатом разыменовывания сырого указателя, то для корректности этого вызова нужно, чтобы указатель не был null, указывал на корректное значение и был корректно выровнен — иными словами, чтобы указатель удовлетворял требованиям корректности для ссылки. Для того, чтобы отлавливать подобные ошибки, добавили для этого линт. Пока что он warn by default, но в будущем планируют поднять до deny by default.
▪️Для
array::from_fn
добавили гарантию, что переданная функция вызывается по порядку индексов. Актуально, если вызывается с некоторым замыканием, которое захватывает и мутирует стейт.▪️Стабилизировали некоторые API:
🔸Cell::update — наверное, один из самых частых паттернов использования
Cell
.🔸
extract_if
для HashMap и для HashSet.🔸
Default
для сырых указателей (ожидаемо, null).🔸Целая пачка геттеров для proc_macro::Span. Позволит писателям процедурных макросов делать более полезные диагностики.
🔸<[T]>::as_chunks, который разбивает переданный слайс на слайс массивов переданного const-параметром длины и остаток, который не влез, вместе с мутабельными вариациями, unchecked (UB, если остаток не пустой и длина нужных массивов равна нулю) и разбитием в обратную сторону.
🔸std::hint::select_unpredictable. Вызов
select_unpredictable(cond, true_val, false_val)
аналогичен if cond { true_val } else { false_val }
, но сигнализирует оптимизатору, что процессор навряд ли сможет корректно предсказать условие (читай, просит использовать cmov-подобные операции вместо явных ветвлений). Используется, например, в реализации двоичного поиска в std.Дополнительно некоторые API теперь доступны в const контекстах:
🔸NonNull::replace и <*mut T>::replace
🔸std::ptr::swap_nonoverlapping
🔸Пачка методов на
Cell
: replace
, get
, get_mut
, from_mut
и as_slice_of_cells
.▪️Cargo теперь умеет автоматически удалять старые файлы из кеша. Именно, на тяжёлых командах проверяет и удаляет скаченные файлы старше трёх месяцев и файлы из локальной файловой системы старше месяца. К сожалению, пороги не настраиваются.
▪️Cargo теперь использует zlib-rs для операций, требующих (за, рас)паковки gzip-файлов (например, cargo package). Для пользователя ничего не поменялось, но соответствующие операции стали работать быстрее. В pull request-е приводится в пример windows-bindgen, для которого cargo package работает на 60% (!) быстрее.
▪️Для rustdoc стабилизировали флаги, позволяющие указывать внешние программы, используемые для запуска док-тестов, требующих кросс-компиляции. Также
ignore-*
-атрибуты на док-тестах позволяют указывать цели компиляции, на которых док-тест не должен компилироваться.👍14❤7🤡2🤮1😐1
#prog #rust #article
"Why is the Rust compiler so slow?"
Чел погрузился в кроличью нору с твиками флагов LLVM, чтобы ускорить сборку в докере сервера для своего сайта.
Спойлер: из всех средств наиболее эффективным оказалось то, что подсказали автору уже после публикации. Именно, замена базового образа с Alpine на Debian (-69% времени сборки).
"Why is the Rust compiler so slow?"
Чел погрузился в кроличью нору с твиками флагов LLVM, чтобы ускорить сборку в докере сервера для своего сайта.
Спойлер: из всех средств наиболее эффективным оказалось то, что подсказали автору уже после публикации. Именно, замена базового образа с Alpine на Debian (-69% времени сборки).
😁33👌5
#prog #rust #haskell #article
Reflections on Haskell and Rust
TL;DR: оба языка хороши, но на текущий момент автор считает Rust более прагматичным выбором.
Reflections on Haskell and Rust
For most of my professional experience, I have been writing production code in both Haskell and Rust, primarily focusing on web services, APIs, and HTTP stack development. My journey started with Haskell, followed by working with Rust, and most recently returning to the Haskell ecosystem.
This experience has given me perspective on both languages' strengths and limitations in real-world applications. Each language has aspects that I appreciate and miss when working with the other. This post examines the features and characteristics that stand out to me in each language.
TL;DR: оба языка хороши, но на текущий момент автор считает Rust более прагматичным выбором.
👍2❤1👎1
#prog #rust #article
Unsoundness and accidental features in the #[target_feature] attribute
Researching the SemVer hazards of the
Unsoundness and accidental features in the #[target_feature] attribute
Researching the SemVer hazards of the
#[target_feature]
attribute led to finding unexpected unsoundness, discovering an "accidental feature" in Rust, finding bugs in rustdoc, the creation of an RFC that evolves the Rust language, and the addition of a dozen new SemVer lints. My work on cargo-semver-checks benefits the Rust ecosystem in more ways than just preventing breakage!👍3
#prog #rust #article
Alternative Blanket Implementations for a Single Rust Trait
Или как решить проблему с кодом вида
Alternative Blanket Implementations for a Single Rust Trait
Или как решить проблему с кодом вида
impl<T: TraitA> MyTrait for T { ... }
impl<T: TraitB> MyTrait for T { ... }
❤1🌚1🤨1
#prog #rust #article
A Newbie's First Contribution to (Rust for) Linux
Статья о написании драйвера для Linux с использованием R4L вкупе с написанием вспомогательных абстракций для него. Спойлер: написание кода, даже со скидкой на то, что это рерайт, было далеко не самой сложной вещью из того, что нужно было сделать для добавления кода в ядро.
A Newbie's First Contribution to (Rust for) Linux
Статья о написании драйвера для Linux с использованием R4L вкупе с написанием вспомогательных абстракций для него. Спойлер: написание кода, даже со скидкой на то, что это рерайт, было далеко не самой сложной вещью из того, что нужно было сделать для добавления кода в ядро.
👍6👎1
#prog #rust #article
The scary and surprisingly deep rabbit hole of Rust's temporaries
Пара замечаний по статье.
Во-первых, хотя информация в статье и познавательна, знать всё это совершенно необязательно. На практике достаточно просто писать код и вставлять
Во-вторых, как справедливо заметили в обсуждении статьи на r/rust, в примерах, где отсутствует расширение времени жизни, используется
The scary and surprisingly deep rabbit hole of Rust's temporaries
After learning so much about the niche Rust topic of temporaries, I'm determined to also burden you with this unholy knowledge, if you're just willing to read a few thousand words on it.
Пара замечаний по статье.
Во-первых, хотя информация в статье и познавательна, знать всё это совершенно необязательно. На практике достаточно просто писать код и вставлять
let
в местах, где расширения времени жизни не происходит, и для этого даже не нужно, как правило, думать, потому что компилятор сам предлагает нужные изменения.Во-вторых, как справедливо заметили в обсуждении статьи на r/rust, в примерах, где отсутствует расширение времени жизни, используется
Some(&expr)
, и на nightly эти примеры компилируются из-за расширения соответствующих правил на случай кортежных конструкторов.#prog #rust #article
Variadic Generics ideas that won't work for Rust
Variadic Generics ideas that won't work for Rust
The discussion is long-running enough that I’ve seen some arguments show up again and again in various forms from various people, over a span of a decade.
<...>
Today, I’ll focus on three proposals that people bring up a lot in associated discussions, and try to explain why these proposals wouldn’t work for the Rust language.
🙏1
#rust #article
Remark on Rust's 10th anniversary.
Remark on Rust's 10th anniversary.
<...>
Which leads us to Rust 1.87, which came out 3654 days after that date, which, through the magic of off-by-one errors, happens to be precisely 10 years after the release of Rust 1.0.
#prog #rust #article
The borrowchecker is what I like the least about Rust
Не со всем согласен, но большинство аргументов здравые.
The borrowchecker is what I like the least about Rust
Не со всем согласен, но большинство аргументов здравые.
In this post, I want to make two arguments:
1. That the borrowchecker causes serious ergonomic problems for Rust.
2. That the role of the borrowchecker in Rust's safety is overstated.
Perversely, because Rust's lifetime riddles are challenging, they are sort of fun. I believe that partly explains why so many people don't seem to mind them. Instead of thinking about how to write my code to solve the scientific problems I'm being paid to solve, I have to think about how to write it to please the borrowchecker. The latter is usually more tractable, limited in scope, have clearer requirements and is more 'puzzle-like'. In that sense, Rust enables escapism: When writing Rust, you get to solve lots of 'problems' - not real problems, mind you, but fun problems.
👍10🤡5👎1😐1
#prog #rust #rustreleasenotes
Вышла версия Rust 1.89.0! Как всегда, тут только избранные части, остальное — в детальных заметках о релизе.
▪️Стабилизировали вывод const generics в выражениях!
К сожалению, использовать
▪️Док-тесты теперь запускаются при кросс-компиляции.
▪️Атрибуты вида
▪️После фиксов для согласования с существующими компиляторами C/C++ теперь можно использовать
▪️Как я уже писал, продление времени жизни временных значений теперь работает и с кортежными конструкторами (кортежных структур и кортежных вариантов
▪️Стабилизированы интринсики (и связанные с ними target feature [1], [2]) из наборов инструкций AVX512, SHA512, SM3 и SM4 для x86-64.
▪️Макро-фрагмент в декларативных макросах без указанного типа теперь является ошибкой компиляции на всех edition.
▪️Результат вычисления format_args! теперь можно сохранять в переменных!🎉
▪️
▪️
▪️К слову о локах, для
▪️
Вышла версия Rust 1.89.0! Как всегда, тут только избранные части, остальное — в детальных заметках о релизе.
▪️Стабилизировали вывод const generics в выражениях!
pub fn all_false<const LEN: usize>() -> [bool; LEN] {
[false; _]
}
К сожалению, использовать
_
для const generics в сигнатурах всё ещё нельзя.▪️Док-тесты теперь запускаются при кросс-компиляции.
▪️Атрибуты вида
#![doc(test(attr(..)))]
(которые добавляют #[attr(..)] ко всем док-тестам в модуле) теперь можно использовать везде, включая корень крейта.▪️После фиксов для согласования с существующими компиляторами C/C++ теперь можно использовать
i128
и u128
в extern "C"
определениях, интероп корректно работает и, как следствие, improper_ctypes_definitions
более не триггерится.▪️Как я уже писал, продление времени жизни временных значений теперь работает и с кортежными конструкторами (кортежных структур и кортежных вариантов
enum
-ов).▪️Стабилизированы интринсики (и связанные с ними target feature [1], [2]) из наборов инструкций AVX512, SHA512, SM3 и SM4 для x86-64.
▪️Макро-фрагмент в декларативных макросах без указанного типа теперь является ошибкой компиляции на всех edition.
▪️Результат вычисления format_args! теперь можно сохранять в переменных!
▪️
std::array::IntoIter
теперь реализовывает Default. Значение по умолчанию при этом является итератором, который ничего не возвращает. Полезно, когда нужно предоставить итерацию по опциональному массиву и при этом не хочется прокидывать Option
в возвращаемое значение.▪️
LazyCell
и LazyLock
теперь реализуют DerefMut. Одной причиной использовать once_cell
меньше.▪️К слову о локах, для
File
теперь есть пачка методов ({, try_}lock{, _shared}
и unlock
) для работы с платформо-специфичными способами блокировки файлов. Напоминаю, что на Linux эти функции требуют кооперации: коду нужно явно указывать на то, что он обращает внимание на блокировки, а по умолчанию они ничего для сторонних процессов не делают.▪️
NonNull
можно безопасно создать из ссылки, поскольку ссылки в Rust обязаны не быть null. Для этого есть реализация From<&T> for NonNull<T>
. К сожалению, этот способ конвертации не очень очевиден, и на практике многие писали код с NonNull::new_unchecked
, в котором ссылка приводилась к сырому указателю по месту вызова. Видимо, чтобы сделать безопасный способ конвертации более видимым и очевидным в исходниках, к NonNull
добавили конструктор from_ref (и from_mut для конвертации из &mut T
). Также этому типу добавили методы для работы с provenance (expose_provenance, with_exposed_provenance, without_provenance), которые аналогичны таковым для сырых указателей, но принимают/возвращают NonZero<usize>
вместо usize
.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🔥2