1.98K subscribers
4.01K photos
159 videos
15 files
4.15K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Блог*
#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

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%) и схлопывание информации о длительности до одного бита (долго/недолго).
❤6👍1
#prog #rust #rustlib #article

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
🤔2
#prog #rust #article

Rust: When Empty Isn't Bottom

Или почему ! в Rust не является bottom типом. TL;DR: в Rust нет отношения подтипизации для типов, не включающих лайфтаймы.
❤4🤔2
#prog #rust #article

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
#prog #rust #rustlib

Fearless SIMD v1.0 is here

fearless_simd takes unsafe out of SIMD.
🤔4❤1👍1
#prog #rust #article

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 форматы.
👍8❤1
#prog #rust #rustreleasenotes

Вышел 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 добавили линт, предупреждающий о неиспользованных сносках в документации.
👍8💩2👎1
#prog #rust #article

Generic Const Args and You

Статья о текущем состоянии экспериментальной поддержки констант в типовой системе Rust.
❤7
#prog #rust #rustlib

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 #meme

Было в r/rustjerk, но сначала выложили в r/ClaudeCode
😁23🌚3
#prog #rust #suckassstory

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
😭11👍1🔥1
#prog #rust #rustasync #article

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

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 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.rs will conflict with database/line/stable.rs.

When the hash codes of two paths collide, rustc substitutes the first file's contents when compiling the second one.


Rust issue

Из-за небольшого смешивания стейта просто совпадения текста без сепараторов недостаточно, нужно ещё, чтобы звёзды сошлись по длине компонентов.
🤯5🤣4
#prog #rust хайлайты:

Добавили быстрый путь для итераторов BTreeMap. Эффект колоссальный: бенчмарки, которые итерируются по BTreeMap целиком, стали требовать в среднем -65% времени!
🔥18🥰5👍2