#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 #ml #menacingopensource
gremllm — библиотека для Python, которая позволяет создавать по описанию объекты, для которых поля и методы создаются LLM по мере необходимости.
В число фич также входит т. н. "wet mode", при котором возвращаемые значения также являются
(thanks @random_rust_dev)
gremllm — библиотека для Python, которая позволяет создавать по описанию объекты, для которых поля и методы создаются LLM по мере необходимости.
from gremllm import Gremllm
# Be sure to tell your gremllm what sort of thing it is
counter = Gremllm('counter')
counter.value = 5
counter.increment()
print(counter.value) # 6?
print(counter.to_roman_numerals()) # VI?
В число фич также входит т. н. "wet mode", при котором возвращаемые значения также являются
Gremllm
.(thanks @random_rust_dev)
🌚19❤5👍1
#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 #article
Building the Rust compiler with GCC
О том, как (частично) забустрапить rustc через rustc_codegen_gcc и почему это далеко не простая задача.
(от того же человека, который пилит кодген rustc под .NET)
Building the Rust compiler with GCC
О том, как (частично) забустрапить rustc через rustc_codegen_gcc и почему это далеко не простая задача.
(от того же человека, который пилит кодген rustc под .NET)
#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
#prog #abnormalprogramming #retroit #ml
ZX Spectrum проходит тест Тьюринга: учим 8-битный процессор проходить CAPTCHA
(UPD: ссылка не работает, держи wayback machine)
(thanks @tech_b0lt_Genona)
ZX Spectrum проходит тест Тьюринга: учим 8-битный процессор проходить CAPTCHA
(UPD: ссылка не работает, держи wayback machine)
Представьте: вы открываете чердак и находите пыльный ZX Spectrum. «Музейный экспонат», — думаете вы. А что если я скажу, что эта коробка с 48 килобайтами памяти может с 95.5% точностью распознавать рукописные цифры и проходить те самые CAPTCHA-тесты «Я не робот» из 2010-х?
Более того: технически она могла это делать с момента выпуска в 1982 году. Мы просто не знали правильный алгоритм 43 года.
(thanks @tech_b0lt_Genona)
🔥14
#prog #db #article
PSA: SQLite WAL checksums fail silently and may lose data
(thanks @nosingularity)
PSA: SQLite WAL checksums fail silently and may lose data
In the previous posts I mentioned that SQLite does not do checksums by default, but it has checksums in WAL mode. However, on checksum errors, instead of raising error, it drops all the subsequent frames. Even if they are not corrupt. This is not a bug; it’s intentional.
(thanks @nosingularity)
🌚4
Небольшой #prog текст от Грейдона Хоара (который автор Rust)
losing language features: some stories about disjoint unions
losing language features: some stories about disjoint unions
A long time ago I wrote on twitter (now erased): "surprising how much computer stuff makes sense viewed as tragic deprivation of sum types".
<...>
One of the things he [Casey Muratori — прим. моё] discusses in here is that safe and correctly-designed disjoint unions aren't just an ML thing, they were around in the early 60s at least.
<...>
But another thing Muratori points out is that is that Dahl and Nygaard copied the feature in safe working form into Simula, and Stroustrup knew about it and intentionally dropped it from C++, thinking it inferior to the encapsulation you get from inheritance.
🤬8😁3❤2🌚1
Блог*
#prog #article #amazingopensource Jujutsu (jj) — система контроля версий, которая концептуально проще git и при этом мощнее. Неплохой (но местами устаревший) обзор Jujutsu — jj init — сделал Chris Krycho. Также есть пока что неполный туториал от Стива Клабника…
#prog #article
Jujutsu Megamerges and jj absorb
Или как Jujutsu позволяет работать над несколькими ветками одновременно без перескакивания между ними (технически такое можно и в git, но крайне неудобно)
Jujutsu Megamerges and jj absorb
Или как Jujutsu позволяет работать над несколькими ветками одновременно без перескакивания между ними (технически такое можно и в git, но крайне неудобно)
❤5🔥1