1.96K subscribers
3.92K photos
149 videos
15 files
4.07K links
Блог со звёздочкой.

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
😁18😢21
😁52🤣2👌1
#prog #rust #zig #article

How Our Rust-to-Zig Rewrite is Going

Переписывание в данном случае — компилятора языка Roc. В статье, разумеется, указываются причины для выбора языка реализации, и они вполне здравые.
👍5
#prog #rust #video

(Greg Kroah-Hartman, конечно, скромничает, но его мнение, как человека, через которого проходят все CVE в Linux, имеет достаточно большой вес)

youtube.com/watch?v=Nzmj7K0FNRY
👍10🤔4❤‍🔥2🤣1
#prog #rust #article

Query cycles: A compiler murder mystery

Или как сделать баг настолько мощный, что отваливаются отладочные инструменты.
🤔4❤‍🔥3
#prog #rust

Enabling the next iteration of the borrow checker on nightly

Несколько урезанную версию Polonius наконец довели до адекватного состояния по производительности и начали использовать по умолчанию на nightly, с планами стабилизировать в ближайшем будущем! 🎉

Для тех, кто не следит столь пристально за Rust: Polonius alpha — новая версия borrow checker-а, которая является flow sensitive и потому разрешает больше корректных паттернов кода, чем сегодняшний компилятор.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍3😱2
#prog #rust #ml

rust-lang/rust is adopting an LLM policy

TL;DR: политика формализует правила, которые уже были неофициально.

I've seen LLMs causing three main issues for our community:

* Polished technical products no longer indicate effort and understanding.
* Making code easier to write exacerbates our existing issues with review bandwidth.
* People mechanically copy-pasting to and from an LLM is a waste of our time.

As time went on, these issues grew and grew, until we had to create dedicated channels and moderation policy for how to deal with them. However, those channels work against our goals of being transparent and welcoming, because new contributors have no idea what the rules are.

The new policy formalizes those rules publicly, so that new contributors know how to join our community without getting their PRs closed for reasons they don't understand, and so that existing reviewers can easily point to the rules as an actionable reason when closing PRs that don't follow them.
👍12🤮2
#prog #rust #meme

r/rustjerk, откуда ж ещё
12😭4
#prog #rust

Call for testing: Restricting trait implementability and field mutability

Две фичи на nightly. impl_restriction позволяет указать на определении трейта, в каких модулях можно писать его реализацию.

pub mod foo {
pub mod bar {
pub(crate) impl(super) trait Foo {}
}

// `Foo` may be implemented here.
impl bar::Foo for i8 {}
}

// Error: `Foo` cannot be implemented here.
impl foo::bar::Foo for u8 {}

mut_restriction позволяет указывать на полях, в каких модулях его можно изменять:

pub mod foo {
pub struct Bar {
pub mut(self) alpha: &'static str,
}

impl Bar {
pub fn mutate_inner(&mut self) {
// `alpha` may be mutated here.
self.alpha = "inner";
}
}
}

impl foo::Bar {
pub fn mutate_outer(&mut self) {
// Error: `alpha` cannot be mutated here.
self.alpha = "outer";
}
}


Первая фича с impl(crate) позволяет выразить паттерн sealed trait напрямую.
👍8👎4
Блог*
#prog #rust #article Rust threads on the GPU
#prog #rust #article

Rust SIMD on the GPU

Код на Rust, использующий core::simd, может быть использован на GPU без изменений на уровне исходников!

К сожалению, на текущий момент применимость этого подхода несколько ограничена, поскольку core::simd всё ещё закрыта за фичей portable_simd, и авторам пришлось внести изменения в компилятор для устранения оверхеда.
🔥5👍32
#prog #rust #article

Downcasting Arcs in Rust

...И о том, как можно (небезопасно) сделать это настолько дешёвым, насколько возможно
👍1🤔1
#prog #rust #menacingopensource

nil

🦀🚀🔥 A blazingly fast and memory-efficient implementation of if err != nil 🔥🚀🦀


use nil::*;

fn thing() -> (isize, error) {
(1, nil)
}

fn main() {
let (n, err) = thing();
if err != nil {
println!("Oh no!");
}

println!("Got {n}.");
}
😁27😭12
#prog #rust #article

Protecting the Rust standard library from accidental breakage

Accidental breakage can happen in any codebase. The Rust standard library isn't magically exempt from this — so it too now uses cargo-semver-checks to prevent accidental breakage. Here's why this took months of work by multiple Rustaceans, dozens of pull requests, and 15,000+ lines of code across the Rust repo, cargo-semver-checks, and its component libraries.
😁5🤔2👍1
#prog #rust

Enabling the next-generation trait solver on nightly

И о том, что это значит для Rust
👍9🔥6
#prog #rust #rustreleasenotes

Вышел Rust 1.98.0! Как всегда, кусочки — тут, мясо — там.

▪️Обычно я пишу про новые вещи в порядке: фичи языка, добавления в std, изменения в cargo. В этот раз я напишу сначала про фичу, которая номинально является новым API в std, но которая даёт возможности, ранее невыразимые в языке (без использования интринсиков, по крайней мере).

Как известно, типы с плавающей точкой не обладают свойствами, которые имеются у действительных чисел в математике — в частности, у чисел с плавающей точкой сложение не является ассоциативной операцией. Это связывает руки оптимизатору, который обязан предохранять поведение. Например, если есть код типа

fn dot(a: &[f32], b: &[f32]) -> f32 {
let mut sum = 0.0;
for i in 0..a.len() {
sum += a[i] * b[i];
}
sum
}


, то компилятор обязан генерировать код, который считывает и суммирует произведения чисел из слайсов по одному. Он не может, скажем, векторизовать код, поскольку подобная трансформация неизбежно меняет порядок, в котором суммируются числа, и это может заметно повлиять на результаты (это, кстати, был мотивирующий пример для предложения добавить API, описанный ниже).

Типы f32 и f64 (а также f16 и f128, но их ещё не стабилизировали) обзавелись методами algebraic_{add, sub, mul, div, rem}. Они выполняют указанные арифметические операции, но, в отличие от обычных арифметических операций, оптимизатор может переупорядочивать их, используя тождества, справедливые для действительных чисел и, вообще говоря, неверные для чисел с плавающей точкой. Взамен компилятор в состоянии оптимизировать код значительно лучше — в частности, пример выше можно переписать в виде

fn dot(a: &[f32], b: &[f32]) -> f32 {
let mut sum = 0.0f32;
for i in 0..a.len() {
sum = sum.algebraic_add(a[i].algebraic_mul(b[i]));
}
sum
}


, и тогда генерируемый код теперь использует SIMD и на процессорах, поддерживающих набор инструкций AVX2, код может работать до восьми раз быстрее!

Данные операции идейно схожи с ключами -ffast-math, но обладают большей гранулярностью и, в отличие от них, не страдают от драконовских ограничений в виде UB на операциях с NaN.

▪️Компилятор теперь реагирует на #[no_mangle] функции, которые некорректно переопределяют функции, ожидаемые рантаймом (ошибка компиляции) и ожидаемые std (предупреждение).

▪️Компилятор теперь предупреждает, если функция возвращает core::ffi::c_void по значению. Тип void в C и C++ отображается на () в Rust, а c_void нужно использовать, только через указатель.

▪️Атрибут #[repr(transparent)] можно применить на структуру, где одно поле "значимо", а остальные имеют "тривиальные" типы. Ранее ими считались все типы нулевого размера с единичным выравниванием, но с этой версии из этого списка исключили #[repr(C)] типы, типы с приватными полями и #[non_exhaustive] типы.

▪️#[derive(PartialOrd)] в генерируемом коды теперь просто возвращает Some(self.cmp(rhs)), если используется одновременно с #[derive(Ord)]. Из-за ограничений инфраструктуры по раскрытию макросов есть забавная особенность: комбинации

#[derive(PartialOrd, Ord)]
struct A;

#[derive(Ord, PartialOrd)]
struct B;

#[derive(Ord)]
#[derive(PartialOrd)]
struct C;


получают упрощённый вариант кода, а вот

#[derive(PartialOrd)]
#[derive(Ord)]
struct D;


— нет.
13
#prog #rust

В Rust стабилизировали тип never. Да, опять. Но на этот раз вроде окончательно, все крейты, сломанные из-за смены фоллбека или получили апдейты, или дико старые. Если всё пройдёт гладко, дойдёт до stable в красивой версии 1.100.
🔥142
#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 of 3,149,052 boxed integer values in a span of about 490 ms. That seemed a bit crazy to me, but having a copying GC with a bump allocator means that we can allocate objects really fast.
👍3🫡2