Блог*
#prog #rust #article Replacing a Rust Enum with a 64-bit Word Made My Interpreter 17% Faster <...> That being said, sha256_unfixed is still running 12% faster with the new value representation than with the old version, even though it's allocating a total…
#prog #rust #article
Plush's New Register-Based Interpreter Is Insanely Fast
Plush's New Register-Based Interpreter Is Insanely Fast
I'll go into some detail on how the interpreter was rewritten to switch from a stack-based design like CPython, to a register-based design like Lua, and optimized to deliver some surprising, and I think pretty impressive results. One thing I'll say right away is that if you care about interpreter performance, you probably should not be writing stack-based bytecode interpreters in 2026.
🤔7👍1🔥1
#prog #rust #article
Could Cargo's scheduler be better?
Автор поста собрала записи того, сколько времени уходит на компиляцию каждого крейта во время сборки разных проектов, и решила проверить, можно ли было ускорить сборку за счёт использования порядка сборки, отличного от того, что используется в cargo. В качестве приоритета она использовала т. н. b-level — фактически критический путь в графе зависимостей в терминах длительности компиляции.
TL;DR: этот гипотетический вариант эффективнее cargo и переживает добавление нормально распределённого шума (с разбросом ±60%) и схлопывание информации о длительности до одного бита (долго/недолго).
Could Cargo's scheduler be better?
Автор поста собрала записи того, сколько времени уходит на компиляцию каждого крейта во время сборки разных проектов, и решила проверить, можно ли было ускорить сборку за счёт использования порядка сборки, отличного от того, что используется в cargo. В качестве приоритета она использовала т. н. b-level — фактически критический путь в графе зависимостей в терминах длительности компиляции.
TL;DR: этот гипотетический вариант эффективнее cargo и переживает добавление нормально распределённого шума (с разбросом ±60%) и схлопывание информации о длительности до одного бита (долго/недолго).
❤6👍1
#prog #rust #rustlib #article
The Design Behind wincode, a Faster Rust Serializer
TL;DR: запись в предоставленный MaybeUninit буфер, батчинг валидаций для последовательностей "простых" значений, специализация по типам, использующая сгенерированную derive-макросами метаинформацию (facet на минималках)
The Design Behind wincode, a Faster Rust Serializer
wincode is a fast, bincode-wire-compatible serializer and deserializer for Rust, built by Anza originally for the Agave validator. It is not a fork of bincode. It is a new implementation with its own traits and derive macros that produces the same bytes as bincode's default configuration
TL;DR: запись в предоставленный MaybeUninit буфер, батчинг валидаций для последовательностей "простых" значений, специализация по типам, использующая сгенерированную derive-макросами метаинформацию (facet на минималках)
🔥3🤔1
#prog #rust #article
Proving my Rust NVR doesn't leak memory (it did)
К сожалению, описанные методы диагностирования специфичны для MacOS
Proving my Rust NVR doesn't leak memory (it did)
К сожалению, описанные методы диагностирования специфичны для MacOS
🤔2
#prog #rust #article
Rust: When Empty Isn't Bottom
Или почему
Rust: When Empty Isn't Bottom
Или почему
! в Rust не является bottom типом. TL;DR: в Rust нет отношения подтипизации для типов, не включающих лайфтаймы.❤4🤔2
Блог*
#prog #ml #menacingopensource gremllm — библиотека для Python, которая позволяет создавать по описанию объекты, для которых поля и методы создаются LLM по мере необходимости. from gremllm import Gremllm # Be sure to tell your gremllm what sort of thing…
#prog #ml #rust #abnormalprogramming
slopc
(thanks @saddevdiary)
slopc
A proc macro that uses an hallucination machine to write your function bodies at compile time. Throw a signature, slap #[slop] on it, and pray. If it doesn't compile, it feeds the errors back and retries until it does (or gives up).(thanks @saddevdiary)
🔥9
Блог*
#prog #rust В Google переписывают Android binder (компонент ядра для IPC) с C на Rust. Это компонент, который используется практически всем на Android, а потому для нормального функционирования он должен быть быстрым и корректным. Авторы ожидают, что переписывание…
#prog #rust
Версия binder на Rust вошла в состав ядра в версии 6.18, а в патче, который должен попасть в ядро версии 7.4, старую версию, на C, полностью удалили.
Версия binder на Rust вошла в состав ядра в версии 6.18, а в патче, который должен попасть в ядро версии 7.4, старую версию, на C, полностью удалили.
🎉14👍2
#prog #rust #article
Why building a Rust LSP is hard
Why building a Rust LSP is hard
This will be a (hopefully coherent) story about how Rust LSPs work, from the perspective of both rust-analyzer and Rust Glancer: how things that seem easy turn out to be hard, things that seem hard turn out to be even harder, and things I didn't expect to exist at all somehow do.
LSP is more of a guess game, where at each step all you are presented with is the potentially incorrect state, and your goal is to guess what would make sense for the user.
❤6💯2
🤔4❤1👍1
#prog #rust #article
Rewriting an entire UI in Rust
(С Tauri на Iced)
И рандомная цитата:
Rewriting an entire UI in Rust
(С Tauri на Iced)
So. Was it worth it?
I answer: Yes.
И рандомная цитата:
One would think, that the software known as Windows, would be good at managing windows. One would, of course, be wrong.
❤13😁7
#prog #rust #rustlib #article
Deser: Rethinking Rust Serialization
Статья про новую библиотеку (де)сериализации. Решает проблемы, которые есть в serde и которые очень сложно или почти невозможно решить из-за архитектуры.
Разумеется, это не строго лучше serde, и в статье подробно об этом рассказывается. В частности, в отличие от serde, deser поддерживает только self-describing форматы.
Deser: Rethinking Rust Serialization
Статья про новую библиотеку (де)сериализации. Решает проблемы, которые есть в serde и которые очень сложно или почти невозможно решить из-за архитектуры.
Разумеется, это не строго лучше serde, и в статье подробно об этом рассказывается. В частности, в отличие от serde, deser поддерживает только self-describing форматы.
Armin Ronacher's Thoughts and Writings
Deser: Rethinking Rust Serialization
Can we do better than Serde?
👍8❤1
#prog #rust #rustreleasenotes
Вышел Rust 1.99.0! Бла-бла-бла, детали.
▪️В Rust добавили вариадики! ...Сишные. Раньше эти функции можно было декларировать, а теперь можно и определять:
Список типов, значения которых можно доставать через
Также такие функции могут быть
▪️Пачка линтов
▪️Теперь гарантируется, что получить доступ к содержимому
▪️
▪️Если имя метода неправильное (несуществующее), но является именем из
▪️Стабилизировали API, включая:
🔸
🔸VecDeque::retain_back: выкинуть из деки все элементы, кроме указанного числа последних.
🔸Box::into_non_null и Box::from_non_null.
🔸
🔸
🔸
▪️В rustdoc добавили линт, предупреждающий о неиспользованных сносках в документации.
Вышел Rust 1.99.0! Бла-бла-бла, детали.
▪️В Rust добавили вариадики! ...Сишные. Раньше эти функции можно было декларировать, а теперь можно и определять:
/// SAFETY: must be called with (at least) 2 i32 arguments.
unsafe extern "C" fn sum(mut args: ...) -> i32 {
// SAFETY: guaranteed by the caller.
let a = unsafe { args.next_arg::<i32>() };
let b = unsafe { args.next_arg::<i32>() };
a + b
}
fn foo() -> i32 {
unsafe { sum(0i32, 2i32) }
}
Список типов, значения которых можно доставать через
next_arg, ограничен sealed трейтом VaArgSafe. Связано это с тем, что в C значения некоторых типов при передаче в вариадическую функцию кастуются в более крупные типы, поэтому их по определению из VaList достать нельзя. Кстати, сам VaList, если сильно нужно, можно передавать явно и даже клонировать.Также такие функции могут быть
#[naked], и по очевидным причинам их нужно писать на ассемблере.▪️Пачка линтов
unused теперь включает в себя unreachable_cfg_select_predicates.▪️Теперь гарантируется, что получить доступ к содержимому
UnsafeCell<T> можно через каст сырого указателя в указатель на T, использовать UnsafeCell::get необязательно. Общие правила насчёт unsafe, соблюдающего правила языка, остаются в силе.▪️
RangeInclusive исторически плохо оптимизировался из-за того, что последняя итерация должна была обрабатываться отдельно. Это в какой-то мере исправили, добавив в трейт Step, на который опираются диапазоны, методы для итерации с возвратом флага переполнения.▪️Если имя метода неправильное (несуществующее), но является именем из
#[doc(alias)] на существующем методе, то этот метод будет предложен в первую очередь, выше имён со схожим написанием.▪️Стабилизировали API, включая:
🔸
IntoIterator на Box<[T; N]>, &Box<[T; N]> и &mut Box<[T; N]>.🔸VecDeque::retain_back: выкинуть из деки все элементы, кроме указанного числа последних.
🔸Box::into_non_null и Box::from_non_null.
🔸
Vec::into_parts и Vec::from_parts, где parts — это тройка из NonNull указателя на аллокацию, длины и ёмкости.🔸
core::mem::{size_of_val_raw, align_of_val_raw} и core::alloc::Layout::for_value_raw, аналогичные существующим функциям без *_raw, но работающие на сырых указателях. Разумеется, unsafe.🔸
std::fs::{set_times, set_times_nofollow} для установки временных отметок на файлах. На всех OS можно менять время доступа и модификации. Дополнительно на Windows и OS от Apple можно менять время создания. *_nofollow вариант при использовании на символической ссылке меняет атрибуты самой ссылки, а не файла, на который она указывает (довольно кривой дизайн, кмк: что, если потом нужно расширить набор флагов? Не делать же по функции на каждую комбинацию).▪️В rustdoc добавили линт, предупреждающий о неиспользованных сносках в документации.
blog.rust-lang.org
Announcing Rust 1.99.0 | Rust Blog
Empowering everyone to build reliable and efficient software.
👍8💩2👎1
#prog #rust #article
Generic Const Args and You
Статья о текущем состоянии экспериментальной поддержки констант в типовой системе Rust.
Generic Const Args and You
Статья о текущем состоянии экспериментальной поддержки констант в типовой системе Rust.
blog.rust-lang.org
Generic Const Args and You | Inside Rust Blog
Want to follow along with Rust development? Curious how you might get involved? Take a look!
❤7
#prog #rust #rustlib
hashify v0.3: compile-time perfect hashing, now 4 to 12 times faster than phf
hashify v0.3: compile-time perfect hashing, now 4 to 12 times faster than phf
hashify is a procedural macro crate that turns a fixed set of keys into a perfect hash lookup at compile time. The generated code has no runtime dependencies, never allocates and contains no unsafe.🔥7
#prog #rust #suckassstory
github.com/rust-lang/rust/issues/164250
github.com/rust-lang/rust/issues/164250
use std::sync::Mutex;
static KEPT: Mutex<Vec<Box<dyn std::any::Any + Send>>> =
Mutex::new(Vec::new());
struct Q<T: 'static + Send>(Option<T>);
impl<T: 'static + Send> Drop for Q<T> {
fn drop(&mut self) {
if let Some(t) = self.0.take() {
KEPT.lock().unwrap().push(Box::new(t));
}
}
}
fn main() {
{
let l = String::from("hello world, this is long enough");
let mut q = Q(None);
q.0 = Some(&l);
}
let _z = String::from("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
let k = KEPT.lock().unwrap();
println!("{}", k[0].downcast_ref::<&'static String>().unwrap());
}
I expected to see this happen: program is not accepted
Instead, this happened: program compiles and prints XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. With asan, the program will crash with a AddressSanitizer: stack-use-after-scope
GitHub
struct's lifetime requirements can be bypassed via covariant field assignment · Issue #164250 · rust-lang/rust
NoteGiven that this issue has been shared online and is currently getting quite a few visitors, here's some additional context. Rust's type system is intended to prevent memory unsafety. Up...
😭11👍1🔥1
#prog #rust #rustasync #article
Tokio Gives Progress, Not Ordering: Scheduling 1M Tasks
TL;DR:
Tokio Gives Progress, Not Ordering: Scheduling 1M Tasks
TL;DR:
Spawned early doesn't mean first-polled early. First-polled early doesn't mean completed early.
If there is an application-level unit of fairness you expect Tokio to honor, like the event in our case, the runtime doesn't know it exists. The bounds should be added by the application.
👍3🤔2
#prog #rust #suckassstory
Rust issue
Из-за небольшого смешивания стейта просто совпадения текста без сепараторов недостаточно, нужно ещё, чтобы звёзды сошлись по длине компонентов.
rustcuses thePathhash code to identify files, and thePathhash implementation is particularly weak because it ignores separators. As of PR #127297, it tries to compensate by mixing the component lengths into the hash, but it's still easy to manufacture collisions. That includes collisions where both sides look like plausible source paths, not gibberish, e.g.data/baselines/table.rswill conflict withdatabase/line/stable.rs.
When the hash codes of two paths collide,rustcsubstitutes the first file's contents when compiling the second one.
Rust issue
Из-за небольшого смешивания стейта просто совпадения текста без сепараторов недостаточно, нужно ещё, чтобы звёзды сошлись по длине компонентов.
GitHub
miscompilation via engineered StableSourceFileId hash collisions · Issue #164348 · rust-lang/rust
rustc uses the Path hash code to identify files, and the Path hash implementation is particularly weak because it ignores separators. As of PR #127297, it tries to compensate by mixing the componen...
🤯5🤣4
#prog #rust хайлайты:
Добавили быстрый путь для итераторов BTreeMap. Эффект колоссальный: бенчмарки, которые итерируются по
Добавили быстрый путь для итераторов BTreeMap. Эффект колоссальный: бенчмарки, которые итерируются по
BTreeMap целиком, стали требовать в среднем -65% времени!🔥18🥰5👍2