#prog #rust #video
(Greg Kroah-Hartman, конечно, скромничает, но его мнение, как человека, через которого проходят все CVE в Linux, имеет достаточно большой вес)
youtube.com/watch?v=Nzmj7K0FNRY
(Greg Kroah-Hartman, конечно, скромничает, но его мнение, как человека, через которого проходят все CVE в Linux, имеет достаточно большой вес)
youtube.com/watch?v=Nzmj7K0FNRY
👍10🤔4❤🔥2🤣1
#prog #rust #article
Query cycles: A compiler murder mystery
Или как сделать баг настолько мощный, что отваливаются отладочные инструменты.
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 и потому разрешает больше корректных паттернов кода, чем сегодняшний компилятор.
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: политика формализует правила, которые уже были неофициально.
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.
blog.rust-lang.org
rust-lang/rust is adopting an LLM policy | Inside Rust Blog
Want to follow along with Rust development? Curious how you might get involved? Take a look!
👍12🤮2
#prog #rust
Call for testing: Restricting trait implementability and field mutability
Две фичи на nightly.
Первая фича с
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 напрямую.blog.rust-lang.org
Call for testing: Restricting trait implementability and field mutability | Inside Rust Blog
Want to follow along with Rust development? Curious how you might get involved? Take a look!
👍8👎4
Блог*
#prog #rust #article Rust threads on the GPU
#prog #rust #article
Rust SIMD on the GPU
Код на Rust, использующий
К сожалению, на текущий момент применимость этого подхода несколько ограничена, поскольку
Rust SIMD on the GPU
Код на Rust, использующий
core::simd, может быть использован на GPU без изменений на уровне исходников!К сожалению, на текущий момент применимость этого подхода несколько ограничена, поскольку
core::simd всё ещё закрыта за фичей portable_simd, и авторам пришлось внести изменения в компилятор для устранения оверхеда.Vectorware
Rust SIMD on the GPU
GPU code can now use Rust's portable SIMD. We share the implementation approach and what this unlocks for GPU programming.
🔥5👍3❤2
#prog #rust #article
Downcasting Arcs in Rust
...И о том, как можно (небезопасно) сделать это настолько дешёвым, насколько возможно
Downcasting Arcs in Rust
...И о том, как можно (небезопасно) сделать это настолько дешёвым, насколько возможно
👍1🤔1
#prog #rust #menacingopensource
nil
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
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
👍9🔥6
#prog #rust #rustreleasenotes
Вышел Rust 1.98.0! Как всегда, кусочки — тут, мясо — там.
▪️Обычно я пишу про новые вещи в порядке: фичи языка, добавления в std, изменения в cargo. В этот раз я напишу сначала про фичу, которая номинально является новым API в std, но которая даёт возможности, ранее невыразимые в языке (без использования интринсиков, по крайней мере).
Как известно, типы с плавающей точкой не обладают свойствами, которые имеются у действительных чисел в математике — в частности, у чисел с плавающей точкой сложение не является ассоциативной операцией. Это связывает руки оптимизатору, который обязан предохранять поведение. Например, если есть код типа
, то компилятор обязан генерировать код, который считывает и суммирует произведения чисел из слайсов по одному. Он не может, скажем, векторизовать код, поскольку подобная трансформация неизбежно меняет порядок, в котором суммируются числа, и это может заметно повлиять на результаты (это, кстати, был мотивирующий пример для предложения добавить API, описанный ниже).
Типы
, и тогда генерируемый код теперь использует SIMD и на процессорах, поддерживающих набор инструкций AVX2, код может работать до восьми раз быстрее!
Данные операции идейно схожи с ключами
▪️Компилятор теперь реагирует на
▪️Компилятор теперь предупреждает, если функция возвращает
▪️Атрибут
▪️
получают упрощённый вариант кода, а вот
— нет.
Вышел 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 #rustreleasenotes Вышел Rust 1.98.0! Как всегда, кусочки — тут, мясо — там. ▪️Обычно я пишу про новые вещи в порядке: фичи языка, добавления в std, изменения в cargo. В этот раз я напишу сначала про фичу, которая номинально является новым API…
#prog #rust
Ииииии на этой версии обнаружили P-Critical баг: компилятор может генерировать vtable с null. К счастью, должны пофиксить быстро, потому что на бете уже не воспроизводится.
Ииииии на этой версии обнаружили P-Critical баг: компилятор может генерировать vtable с null. К счастью, должны пофиксить быстро, потому что на бете уже не воспроизводится.
😁11🫡4👍1
#prog #rust
В Rust стабилизировали тип never. Да, опять. Но на этот раз вроде окончательно, все крейты, сломанные из-за смены фоллбека или получили апдейты, или дико старые. Если всё пройдёт гладко, дойдёт до stable в красивой версии 1.100.
В Rust стабилизировали тип never. Да, опять. Но на этот раз вроде окончательно, все крейты, сломанные из-за смены фоллбека или получили апдейты, или дико старые. Если всё пройдёт гладко, дойдёт до stable в красивой версии 1.100.
🔥14❤2
#prog #rust #article
Replacing a Rust Enum with a 64-bit Word Made My Interpreter 17% Faster
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