Блог*
#prog #rust #article Офигенно! Rust's standard library on the GPU GPU code can now use Rust's standard library. We share the implementation approach and what this unlocks for GPU programming. This works because of our custom hostcall framework. A hostcall…
Vectorware
Async/await on the GPU
GPU code can now use Rust's async/await. We share the reasons why and what this unlocks for GPU programming.
🔥8😱3❤1😭1
#prog #rust #article
Making cargo-semver-checks faster - Google Summer of Code 2025
Making cargo-semver-checks faster - Google Summer of Code 2025
Overall, I reduced the typical runtime on very large crates down to ~2s from ~8s - nearly an 80% speedup - without compromising performance on smaller crates. Along the way I reduced test time from ~7min to ~1min.
❤6
#rust
Rust debugging survey 2026
Rust debugging survey 2026
You can fill out the survey here.
Filling the survey should take you approximately 5 minutes, and the survey is fully anonymous. We will accept submissions until Friday, March 13th, 2026.
blog.rust-lang.org
Rust debugging survey 2026 | Rust Blog
Empowering everyone to build reliable and efficient software.
🤔2
#prog #rust #rustreleasenotes
Вышла версия Rust 1.94.0! Как всегда, тут только то, что интересно мне, остальное в детальных заметках о релизе.
▪️Атрибуты для линта
▪️Касты между сырыми указателями на unsized типы с указанием лайфтаймов теперь требуют, чтобы предыдущий тип жил не меньше нового. Или, иными словами, каст из
▪️Стабилизировали array_windows! Украду пример прямо из блогпоста:
Благодаря выводу типов ещё и размер, как правило, не нужно указывать на методе явно.
▪️
▪️Для
▪️cargo теперь использует для парсинга манифестов наконец-то вышедшую версию TOML 1.1. С практической точки зрения это главным образом означает, что inline-таблицы можно писать на нескольких строках и с запятой после — или, иными словами, зависимость в Cargo.toml с большим количеством фичей теперь можно писать среди остальных и не пихать её в одну длинную строку.
▪️Ещё стабилизация: cargo теперь позволяет разбить конфиг на несколько файлов и объединить их при помощи top-level ключа
Вышла версия Rust 1.94.0! Как всегда, тут только то, что интересно мне, остальное в детальных заметках о релизе.
▪️Атрибуты для линта
dead_code (allow/warn/deny/expect) на трейтах и их частях теперь наследуются impl-ами:#[allow(dead_code)]
trait Foo {
const FOO: u32;
}
impl Foo for u32 {
const FOO: u32 = roundtrip(0);
}
// нет предупреждения о мёртвом коде
const fn roundtrip(x: u32) -> u32 {
x
}
▪️Касты между сырыми указателями на unsized типы с указанием лайфтаймов теперь требуют, чтобы предыдущий тип жил не меньше нового. Или, иными словами, каст из
*mut dyn Trait + 'a в *mut dyn Trait + 'b теперь требует 'a: 'b▪️Стабилизировали array_windows! Украду пример прямо из блогпоста:
For example, part of one 2016 Advent of Code puzzle is looking for ABBA patterns: "two different characters followed by the reverse of that pair, such as xyyx or abba." If we assume only ASCII characters, that could be written by sweeping windows of the byte slice like this:
fn has_abba(s: &str) -> bool {
s.as_bytes()
.array_windows()
.any(|[a1, b1, b2, a2]|
(a1 != b1)
&& (a1 == a2)
&& (b1 == b2)
)
}Благодаря выводу типов ещё и размер, как правило, не нужно указывать на методе явно.
▪️
LazyCell и LazyLock обзавелись методами get, get_mut и force_mut.▪️Для
iter::Peekable добавили методы next_if_map и next_if_map_mut. Пример из документации:let mut iter = "125 GOTO 10".chars().peekable();
let mut line_num = 0_u32;
while let Some(digit) = iter.next_if_map(|c| c.to_digit(10).ok_or(c)) {
line_num = line_num * 10 + digit;
}
assert_eq!(line_num, 125);
assert_eq!(iter.collect::<String>(), " GOTO 10");
▪️cargo теперь использует для парсинга манифестов наконец-то вышедшую версию TOML 1.1. С практической точки зрения это главным образом означает, что inline-таблицы можно писать на нескольких строках и с запятой после — или, иными словами, зависимость в Cargo.toml с большим количеством фичей теперь можно писать среди остальных и не пихать её в одну длинную строку.
▪️Ещё стабилизация: cargo теперь позволяет разбить конфиг на несколько файлов и объединить их при помощи top-level ключа
include (документация).👍5
#prog #rust #article
How to stop fighting with coherence and start writing context-generic trait impls
Транскрипт выступления, если что. Мне помогло понять, что же всё-таки такое context-generic programming, как это называет автор
How to stop fighting with coherence and start writing context-generic trait impls
Транскрипт выступления, если что. Мне помогло понять, что же всё-таки такое context-generic programming, как это называет автор
🔥4
#prog #rust #article
Под капотом Beetroot: как я написал менеджер буфера обмена на Tauri v2 и Rust с установщиком 6 МБ
Интерфейс на WebView, да
Под капотом Beetroot: как я написал менеджер буфера обмена на Tauri v2 и Rust с установщиком 6 МБ
Интерфейс на WebView, да
🤔6👍2
#prog #rust #article
symbolic derivatives and the rust rewrite of RE#
Растовая версия очень быстрого движка для регулярных выражений, который поддерживает, помимо прочего, конъюкцию (пересечение результатов подвыражений), отрицание и lookahead и при этом работает за линейное от входных данных время. По производительности на выражениях с большим количеством состояний обгоняет regex, особенно для поиска без учёта регистра.
Теория, поддерживающая этот движок — это развитие идей Brzozowski, но вместо того, чтобы считать производную от регулярного выражения для разных символов и потом объединять их по классам эквивалентности, новый подход считает т. н. символическую производную — производную для всех возможных входных символов сразу.
Из-за того, что данный подход поддерживает конъюкцию, движок может работать на байтах и при этом поддерживать UTF-8 просто за счёт добавления правила, которое ограничивает вход до валидных UTF-8 последовательностей:
Пример кода:
symbolic derivatives and the rust rewrite of RE#
Растовая версия очень быстрого движка для регулярных выражений, который поддерживает, помимо прочего, конъюкцию (пересечение результатов подвыражений), отрицание и lookahead и при этом работает за линейное от входных данных время. По производительности на выражениях с большим количеством состояний обгоняет regex, особенно для поиска без учёта регистра.
Теория, поддерживающая этот движок — это развитие идей Brzozowski, но вместо того, чтобы считать производную от регулярного выражения для разных символов и потом объединять их по классам эквивалентности, новый подход считает т. н. символическую производную — производную для всех возможных входных символов сразу.
Из-за того, что данный подход поддерживает конъюкцию, движок может работать на байтах и при этом поддерживать UTF-8 просто за счёт добавления правила, которое ограничивает вход до валидных UTF-8 последовательностей:
// \p{utf8} expands to:
// ([\x00-\x7F]
// | [\xC0-\xDF][\x80-\xBF]
// | [\xE0-\xEF][\x80-\xBF]{2}
// | [\xF0-\xF7][\x80-\xBF]{3})*Пример кода:
use resharp::Regex;
// basic matching
let re = Regex::new(r"hello.*world").unwrap();
assert!(re.is_match("hello beautiful world"));
// intersection: contains both "cat" and "dog", 5-15 chars
let re = Regex::new(r"_*cat_*&_*dog_*&_{5,15}").unwrap();
// complement: does not contain "1"
let re = Regex::new(r"~(_*1_*)").unwrap();
ian erik varatalu
symbolic derivatives and the rust rewrite of RE# | ian erik varatalu
👍15🔥8❤2
#prog #rust #rustlib #article
🦀Building Rust Procedural Macros Without quote!: Introducing zyn
🦀Building Rust Procedural Macros Without quote!: Introducing zyn
I've been writing proc macros for a while now. Derive macros for internal tools, attribute macros for instrumentation. And every time, the same two problems:quote!doesn't compose (you end up passingTokenStreamfragments through five layers of helper functions and writing hundreds ofletstatements), and debugging generated code meanscargo expandand then squinting at unformatted token output hoping something jumps out.
Because of this I ended up writing the same helper methods, composite AST parsing and tokenizing types, extractors etc. I would have to copy these from project to project as needed, and eventually just decided to publish a crate so I never have to do it again.
So I built zyn — a proc macro framework with a template language, composable components, and compile-time diagnostics.
I wrote the debug system after spending two days on a bug where a generated impl block was missing a lifetime bound. cargo expand spat out 400 lines of tokens and I couldn't find it, so I built a debug system.
🤔5❤1👍1🤡1