#prog #rust #article
What does it take to ship Rust in safety-critical?
Статья про очень конкретные препятствия к использованию Rust в safety-critical системах.
Это именно препятствия, а не блоки — в этих областях Rust уже используется в проде.
What does it take to ship Rust in safety-critical?
Статья про очень конкретные препятствия к использованию Rust в safety-critical системах.
Это именно препятствия, а не блоки — в этих областях Rust уже используется в проде.
blog.rust-lang.org
What does it take to ship Rust in safety-critical? | Rust Blog
Empowering everyone to build reliable and efficient software.
🤔2
#prog #rust #article
Офигенно!
Rust's standard library on the GPU
Офигенно!
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 customhostcallframework. A hostcall is analogous to a syscall. A hostcall is a structured request from GPU code to the host CPU to perform something it cannot execute itself. You can think of it like a remote procedure call from the GPU to the host to achieve syscall-like functionality.
To end users, Rust's std APIs appear unchanged and act as one would expect.
❤12👍8
#prog #c #article
You (probably) don’t need to learn C
You (probably) don’t need to learn C
I’m all for learning C if it will be useful for the job at hand, but you can write lots of great software without knowing C. [выделение моё]
A few people repeated the idea that C teaches you how code “really” executes. But C is an abstract model of a computer, and modern CPUs do all kinds of things that C doesn’t show you or explain. Pipelining, cache misses, branch prediction, speculative execution, multiple cores, even virtual memory are all completely invisible to C programs.
C is an abstraction of how a computer works, and chip makers work hard to implement that abstraction, but they do it on top of much more complicated machinery.
Nedbatchelder
You (probably) don’t need to learn C
I’m tired of this: “You have to learn C so you can understand how a computer really works.”
❤5👍3💩3😁2
#math #article
Hobby’s algorithm for aesthetic Bézier splines
Разновидность сплайнов для "гладкой" интерполяции точек, которая быстро работает (пропорционально числу точек) и зачастую даёт эстетически приятные результаты. Из недостатков: передвижение опорных точек меняет форму всей кривой, и малое передвижение опорной точки может привести к радикальной смене формы кривой в районе этой точки.
В самом начале есть интерактивная демонстрация.
Hobby’s algorithm for aesthetic Bézier splines
Разновидность сплайнов для "гладкой" интерполяции точек, которая быстро работает (пропорционально числу точек) и зачастую даёт эстетически приятные результаты. Из недостатков: передвижение опорных точек меняет форму всей кривой, и малое передвижение опорной точки может привести к радикальной смене формы кривой в районе этой точки.
В самом начале есть интерактивная демонстрация.
🤔2
#prog #article
A Tale Of Four Fuzzers
Восхитительная статья от matklad-а, в частности, хорошая демонстрация того, как писать фаззеры.
A Tale Of Four Fuzzers
Восхитительная статья от matklad-а, в частности, хорошая демонстрация того, как писать фаззеры.
Some time ago we overhauled TigerBeetle’s routing algorithm to better handle varying network topologies in a cluster. That turned out to be an interesting case study of practical generative testing (or fuzzing) for non-trivial, real-world code. We ended up adding not one, not even two, but four very different new fuzzers to the system! Let’s talk about why just one fuzzer is not enough.
👍6
#prog #article
BTW PVS-Studio развивают версию своего анализатора для #go, и хотя для широкой публики анализатор ещё не доступен (в апреле будет бета-версия), он уже находит множество ошибок, которые не находит
BTW PVS-Studio развивают версию своего анализатора для #go, и хотя для широкой публики анализатор ещё не доступен (в апреле будет бета-версия), он уже находит множество ошибок, которые не находит
go vet. Все найденные ошибки при этом на Go не завязаны, так что, возможно, в будущем анализатор станет ещё полезнее конкретно для Go.👍9
#prog #rust #article
В стандартной библиотеке Rust есть несколько ассоциативных контейнеров:
Возьмём в качестве примера HashMap::get:
Как видно из кода, тип для поиска (
В процессе поиска значения на хранимых ключах вызывается метод
Но у этого API есть недостаток. Именно, оно требует, чтобы предоставляемое значение было ссылкой и чтобы из ссылки на ключ можно было получить ссылку на
В короткой статье Borrowed tuple indexing for HashMap рассказывается, как с некоторым количеством бойлерплейта можно обойти это ограничение.
Для сравнения, hashbrown (поверх которого сделаны мапы в std) от подобных ограничений не страдает, поскольку там в API используется более гибкий трейт Equivalent:
В стандартной библиотеке Rust есть несколько ассоциативных контейнеров:
HashMap, HashSet, BTreeMap и BTreeSet. Часто на практике в качестве ключей в них хранятся строки — String. Требовать от пользователя для поиска значение типа String неудобно и чревато проблемами в производительности. Потому у этих структур данных есть API, позволяющие использовать для поиска ключи других, "похожие" на те, что хранятся в контейнере.Возьмём в качестве примера HashMap::get:
fn get<Q>(&self, k: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
Как видно из кода, тип для поиска (
Q) не обязан совпадать с типом хранимых ключей (K), но на K есть ограничение K: Borrow<Q>. Трейт Borrow выглядит таким образом:trait Borrow<Borrowed>
where
Borrowed: ?Sized,
{
fn borrow(&self) -> &Borrowed;
}
В процессе поиска значения на хранимых ключах вызывается метод
<K as Borrow<Q>>::borrow, и результат возвращаемого значения сравнивается со значением, переданным в get. Именно благодаря этому API (и реализациям в std, разумеется) коллекцию HashMap<String, Thing> можно индексировать значениями типа &str.Но у этого API есть недостаток. Именно, оно требует, чтобы предоставляемое значение было ссылкой и чтобы из ссылки на ключ можно было получить ссылку на
Q. Это ограничивает применимость API. Если, например, в мапе в качестве ключей хранятся (String, String), то логичный невладеющий эквивалент для индексации (&str, &str) не будет работать, потому что это кортеж ссылок, а не ссылка.В короткой статье Borrowed tuple indexing for HashMap рассказывается, как с некоторым количеством бойлерплейта можно обойти это ограничение.
Для сравнения, hashbrown (поверх которого сделаны мапы в std) от подобных ограничений не страдает, поскольку там в API используется более гибкий трейт Equivalent:
trait Equivalent<K>
where
K: ?Sized,
{
fn equivalent(&self, key: &K) -> bool;
}
👍10🤯3🤡1
Блог*
#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
#article
2025 Recap: so many projects
нравоучительная сказка от Амоса про опасности безконтрольного yak shaving
2025 Recap: so many projects
fasterthanli.me
2025 Recap: so many projects
I’ve been working on so many projects in 2025, I thought it was important for me to make a recap, if only just to clear my head.
There are many, many, many things to go through and we don’t have a ...
There are many, many, many things to go through and we don’t have a ...
❤2🤔2
#prog #article
Compendium: A Linux Syscall Tracer
Compendium: A Linux Syscall Tracer
Having a love-hate relationship with strace I ended up yearning for something new.
Enter Compendium: a friendlier strace-like tool, with sane defaults, that optionally produces a clean html report that you can view in your browser of choice.
It tracks file descriptors across their lifetime, distinguishes files from sockets, aggregates I/O stats, registers events for memory operations (both vm and actual page faults), threads/subprocesses and more in real time and produces a summary at the end.
👍13
#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 #article
Мой плохой код — это ваша вина
Очередной плач про то, как в этом вашем IT всё криво
(от @blog_pogromista)
Мой плохой код — это ваша вина
Очередной плач про то, как в этом вашем IT всё криво
(от @blog_pogromista)
🤡6🔥5
#prog #article
I’m a former CTO. Here is the 15 sec coding test I used to instantly filter out 50% of unqualified applicants.
TL;DR: тест представлен в виде куска кода с циклом на три итерации, нужно сказать значение одной из переменных после него. Некоторые особо неквалифицированные люди просто пастят код в своего любимого AI-ассистента и получают неверный ответ, потому что копируют символ "=" в условии внутри цикла, меняя условие с ">" на ">=". При этом знак равно в условии средствами HTML скрыт и имеет нулевой размер шрифта, поэтому людям не виден.
I’m a former CTO. Here is the 15 sec coding test I used to instantly filter out 50% of unqualified applicants.
TL;DR: тест представлен в виде куска кода с циклом на три итерации, нужно сказать значение одной из переменных после него. Некоторые особо неквалифицированные люди просто пастят код в своего любимого AI-ассистента и получают неверный ответ, потому что копируют символ "=" в условии внутри цикла, меняя условие с ">" на ">=". При этом знак равно в условии средствами HTML скрыт и имеет нулевой размер шрифта, поэтому людям не виден.
😁20🤡5🔥1
#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