1.84K subscribers
3.17K photos
125 videos
15 files
3.48K links
Блог со звёздочкой.

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

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
#prog #rust #rustreleasenotes

Вышла версия Rust 1.88.0! Как всегда, тут только кусочки, всё остальное — в детальных заметках о релизе.

▪️Наконец-то стабилизировали let chains! 🎉🎉🎉 Джва года ждал. Пример утащу прям из блогопоста:

if let Channel::Stable(v) = release_info()
&& let Semver { major, minor, .. } = v
&& major == 1
&& minor == 88
{
println!("`let_chains` was stabilized in this version");
}


К сожалению, из-за соображений обратной совместимости, связанных с временем жизни временных выражений в if let, эта фича доступна только в edition 2024.

▪️Специфическая вещь: стабилизировали так называемые naked functions — функции, для которых не генерирует при кодгене пролог и эпилог. Их тело состоит из ассемблерного кода. Периодически требуется для написания низкоуровневого кода.

▪️В cfg-атрибутах теперь можно использовать литералы true и false. Как пишут в блогопосте:

Previously, empty predicate lists could be used for unconditional configuration, like cfg(all()) for enabled and cfg(any()) for disabled, but this meaning is rather implicit and easy to get backwards. cfg(true) and cfg(false) offer a more direct way to say what you mean.


▪️В Rust вызов методов автоматически создаёт ссылку, если метод вызывается на значении. Это удобно, но иногда позволяет написать код, который делает потенциально небезопасную операцию и при этом не выглядит таковым. Именно, если значение, на котором вызывается метод, является результатом разыменовывания сырого указателя, то для корректности этого вызова нужно, чтобы указатель не был null, указывал на корректное значение и был корректно выровнен — иными словами, чтобы указатель удовлетворял требованиям корректности для ссылки. Для того, чтобы отлавливать подобные ошибки, добавили для этого линт. Пока что он warn by default, но в будущем планируют поднять до deny by default.

▪️Для array::from_fn добавили гарантию, что переданная функция вызывается по порядку индексов. Актуально, если вызывается с некоторым замыканием, которое захватывает и мутирует стейт.

▪️Стабилизировали некоторые API:
🔸Cell::update — наверное, один из самых частых паттернов использования Cell.
🔸extract_if для HashMap и для HashSet.
🔸Default для сырых указателей (ожидаемо, null).
🔸Целая пачка геттеров для proc_macro::Span. Позволит писателям процедурных макросов делать более полезные диагностики.
🔸<[T]>::as_chunks, который разбивает переданный слайс на слайс массивов переданного const-параметром длины и остаток, который не влез, вместе с мутабельными вариациями, unchecked (UB, если остаток не пустой и длина нужных массивов равна нулю) и разбитием в обратную сторону.
🔸std::hint::select_unpredictable. Вызов select_unpredictable(cond, true_val, false_val) аналогичен if cond { true_val } else { false_val }, но сигнализирует оптимизатору, что процессор навряд ли сможет корректно предсказать условие (читай, просит использовать cmov-подобные операции вместо явных ветвлений). Используется, например, в реализации двоичного поиска в std.

Дополнительно некоторые API теперь доступны в const контекстах:
🔸NonNull::replace и <*mut T>::replace
🔸std::ptr::swap_nonoverlapping
🔸Пачка методов на Cell: replace, get, get_mut, from_mut и as_slice_of_cells.

▪️Cargo теперь умеет автоматически удалять старые файлы из кеша. Именно, на тяжёлых командах проверяет и удаляет скаченные файлы старше трёх месяцев и файлы из локальной файловой системы старше месяца. К сожалению, пороги не настраиваются.

▪️Cargo теперь использует zlib-rs для операций, требующих (за, рас)паковки gzip-файлов (например, cargo package). Для пользователя ничего не поменялось, но соответствующие операции стали работать быстрее. В pull request-е приводится в пример windows-bindgen, для которого cargo package работает на 60% (!) быстрее.

▪️Для rustdoc стабилизировали флаги, позволяющие указывать внешние программы, используемые для запуска док-тестов, требующих кросс-компиляции. Также ignore-*-атрибуты на док-тестах позволяют указывать цели компиляции, на которых док-тест не должен компилироваться.
👍147🤡2🤮1😐1
👍13😁5😢1🎉1
#prog #rust #article

"Why is the Rust compiler so slow?"

Чел погрузился в кроличью нору с твиками флагов LLVM, чтобы ускорить сборку в докере сервера для своего сайта.

Спойлер: из всех средств наиболее эффективным оказалось то, что подсказали автору уже после публикации. Именно, замена базового образа с Alpine на Debian (-69% времени сборки).
😁33👌5
#prog #ml #menacingopensource

gremllm — библиотека для Python, которая позволяет создавать по описанию объекты, для которых поля и методы создаются LLM по мере необходимости.

from gremllm import Gremllm

# Be sure to tell your gremllm what sort of thing it is
counter = Gremllm('counter')
counter.value = 5
counter.increment()
print(counter.value) # 6?
print(counter.to_roman_numerals()) # VI?

В число фич также входит т. н. "wet mode", при котором возвращаемые значения также являются Gremllm.

(thanks @random_rust_dev)
🌚195👍1
#prog #rust #haskell #article

Reflections on Haskell and Rust

For most of my professional experience, I have been writing production code in both Haskell and Rust, primarily focusing on web services, APIs, and HTTP stack development. My journey started with Haskell, followed by working with Rust, and most recently returning to the Haskell ecosystem.

This experience has given me perspective on both languages' strengths and limitations in real-world applications. Each language has aspects that I appreciate and miss when working with the other. This post examines the features and characteristics that stand out to me in each language.

TL;DR: оба языка хороши, но на текущий момент автор считает Rust более прагматичным выбором.
👍21👎1
#prog #rust #article

Unsoundness and accidental features in the #[target_feature] attribute

Researching the SemVer hazards of the #[target_feature] attribute led to finding unexpected unsoundness, discovering an "accidental feature" in Rust, finding bugs in rustdoc, the creation of an RFC that evolves the Rust language, and the addition of a dozen new SemVer lints. My work on cargo-semver-checks benefits the Rust ecosystem in more ways than just preventing breakage!
👍3
#prog #rust #article

Alternative Blanket Implementations for a Single Rust Trait

Или как решить проблему с кодом вида

impl<T: TraitA> MyTrait for T { ... }
impl<T: TraitB> MyTrait for T { ... }
1🌚1🤨1
#prog #rust #article

A Newbie's First Contribution to (Rust for) Linux

Статья о написании драйвера для Linux с использованием R4L вкупе с написанием вспомогательных абстракций для него. Спойлер: написание кода, даже со скидкой на то, что это рерайт, было далеко не самой сложной вещью из того, что нужно было сделать для добавления кода в ядро.
👍6👎1
#prog #article

Building the Rust compiler with GCC

О том, как (частично) забустрапить rustc через rustc_codegen_gcc и почему это далеко не простая задача.

(от того же человека, который пилит кодген rustc под .NET)
#prog #rust #article

The scary and surprisingly deep rabbit hole of Rust's temporaries

After learning so much about the niche Rust topic of temporaries, I'm determined to also burden you with this unholy knowledge, if you're just willing to read a few thousand words on it.


Пара замечаний по статье.

Во-первых, хотя информация в статье и познавательна, знать всё это совершенно необязательно. На практике достаточно просто писать код и вставлять let в местах, где расширения времени жизни не происходит, и для этого даже не нужно, как правило, думать, потому что компилятор сам предлагает нужные изменения.

Во-вторых, как справедливо заметили в обсуждении статьи на r/rust, в примерах, где отсутствует расширение времени жизни, используется Some(&expr), и на nightly эти примеры компилируются из-за расширения соответствующих правил на случай кортежных конструкторов.
#prog #rust #article

Variadic Generics ideas that won't work for Rust

The discussion is long-running enough that I’ve seen some arguments show up again and again in various forms from various people, over a span of a decade.

<...>

Today, I’ll focus on three proposals that people bring up a lot in associated discussions, and try to explain why these proposals wouldn’t work for the Rust language.
🙏1
#prog #abnormalprogramming #retroit #ml

ZX Spectrum проходит тест Тьюринга: учим 8-битный процессор проходить CAPTCHA

(UPD: ссылка не работает, держи wayback machine)

Представьте: вы открываете чердак и находите пыльный ZX Spectrum. «Музейный экспонат», — думаете вы. А что если я скажу, что эта коробка с 48 килобайтами памяти может с 95.5% точностью распознавать рукописные цифры и проходить те самые CAPTCHA-тесты «Я не робот» из 2010-х?

Более того: технически она могла это делать с момента выпуска в 1982 году. Мы просто не знали правильный алгоритм 43 года.


(thanks @tech_b0lt_Genona)
🔥14
😁27🌚5💯5
#prog #meme про OS

И это даже жиза, ибо у меня на работе перестал запускаться проект. На мастере, в который коммит в последний раз был пару месяцев назад. Почему ничего не может просто, блин, работать?
😁18💯5🤔3🌚3💩1
#prog #db #article

PSA: SQLite WAL checksums fail silently and may lose data

In the previous posts I mentioned that SQLite does not do checksums by default, but it has checksums in WAL mode. However, on checksum errors, instead of raising error, it drops all the subsequent frames. Even if they are not corrupt. This is not a bug; it’s intentional.


(thanks @nosingularity)
🌚4
Вроде #prog #rust #meme, но говорят, что объявление реальное.

Source
🤡20😁14
Небольшой #prog текст от Грейдона Хоара (который автор Rust)

losing language features: some stories about disjoint unions

A long time ago I wrote on twitter (now erased): "surprising how much computer stuff makes sense viewed as tragic deprivation of sum types".

<...>

One of the things he [Casey Muratori — прим. моё] discusses in here is that safe and correctly-designed disjoint unions aren't just an ML thing, they were around in the early 60s at least.

<...>

But another thing Muratori points out is that is that Dahl and Nygaard copied the feature in safe working form into Simula, and Stroustrup knew about it and intentionally dropped it from C++, thinking it inferior to the encapsulation you get from inheritance.
🤬8😁32🌚1