#prog #rust #python
Pre-PEP: Rust for CPython
Отдельно отмечается, что компилятор Rust в настоящее время поддерживает все платформы, официально поддерживаемые CPython.
Pre-PEP: Rust for CPython
In summary, Rust provides many extremely useful benefits that would improve CPython development. Increasing memory safety would be a significant improvement in of itself, but it is far from the only benefit Rust provides.Историческое событие.
Отдельно отмечается, что компилятор Rust в настоящее время поддерживает все платформы, официально поддерживаемые CPython.
Discussions on Python.org
Pre-PEP: Rust for CPython
Introduction We (@emmatyping, @eclips4) propose introducing the Rust programming language to CPython. Rust will initially only be allowed for writing optional extension modules, but eventually will become a required dependency of CPython and allowed to be…
🔥14🤡2
#prog #article #amazingopensource
zizmor — статический анализатор для Github Actions, рождённый из-за фрустрации автора, вызванной тем, насколько легко использовать Github Actions небезопасно. Инструмент намеренно нацелен на то, чтобы иметь высокий signal to noise ratio по умолчанию.
В статье Introducing zizmor: now you can have beautiful clean workflows автор рассказывает о том, что это за инструмент и мотивации для его создания, а также некоторые детали реализации (написан на Rust, BTW).
В более технической статье Fun with finite state transducers автор рассказывает о том, как снизил на порядок количество данных, включаемых в инструмент. Эти данные используются для идентификации того, в каких контекстах YAML-файлов, настраивающих Github Actions, включение внешних данных небезопасно.
Если вы сомневаетесь, насколько этот инструмент нужен, то в статье zizmor would have caught the Ultralytics workflow vulnerability автор рассказывает, как zizmor мог бы предотвратить инцидент, который привёл к публикации как минимум двух вредоносных версий Python-библиотеки для машинного обучения и, предположительно, к компроментации репозитория целиком.
zizmor — статический анализатор для Github Actions, рождённый из-за фрустрации автора, вызванной тем, насколько легко использовать Github Actions небезопасно. Инструмент намеренно нацелен на то, чтобы иметь высокий signal to noise ratio по умолчанию.
В статье Introducing zizmor: now you can have beautiful clean workflows автор рассказывает о том, что это за инструмент и мотивации для его создания, а также некоторые детали реализации (написан на Rust, BTW).
В более технической статье Fun with finite state transducers автор рассказывает о том, как снизил на порядок количество данных, включаемых в инструмент. Эти данные используются для идентификации того, в каких контекстах YAML-файлов, настраивающих Github Actions, включение внешних данных небезопасно.
Если вы сомневаетесь, насколько этот инструмент нужен, то в статье zizmor would have caught the Ultralytics workflow vulnerability автор рассказывает, как zizmor мог бы предотвратить инцидент, который привёл к публикации как минимум двух вредоносных версий Python-библиотеки для машинного обучения и, предположительно, к компроментации репозитория целиком.
👍4🔥1
Блог*
#prog #rust #article How to speed up the Rust compiler in December 2025
#prog #rust
Одно из изменений, упомянутых в статье — это переделка fmt::Arguments (aka того, что возвращает format_args!). До этого изменения в структуре были три слайса (точнее, ссылок на них): слайс строковых составляющих форматной строки, слайс с опциями форматирования и слайс собственно аргументов (со стёртыми типами). Шесть машинных слов — это довольно много. После её изменения этот тип состоит из всего двух машинных слов: указатель на шаблон и указатель на аргументы, что позволяет передавать значения этого типа в регистрах.
Как это работает? Представление подробно расписано в исходниках, но если коротко: строка, описывающая шаблон, переписывается в байтовый массив, который содержит куски разных типов. В зависимости от префикса каждый кусок распознаётся как литерал строки, как ссылка на аргумент для форматирования или описание опций форматирования. Среди этих кусков также есть и маркер конца шаблона: ноль. Хранение конца шаблона внутри самого шаблона позволяет не хранить ни длину шаблона, ни длину слайса аргументов.
Как Мара пишет в Mastodon:
Надо отметить, что по сравнению со старым дизайном новый кое в чём проигрывает: отдельные литеральные части шаблона теперь лежат внутри неделимого массива и потому не могут быть дедуплицированы. На практике, впрочем, это не должно быть большой проблемой, поскольку зачастую эти строковые куски занимают меньше места, чем (толстые) указатели на них.
Одно из изменений, упомянутых в статье — это переделка fmt::Arguments (aka того, что возвращает format_args!). До этого изменения в структуре были три слайса (точнее, ссылок на них): слайс строковых составляющих форматной строки, слайс с опциями форматирования и слайс собственно аргументов (со стёртыми типами). Шесть машинных слов — это довольно много. После её изменения этот тип состоит из всего двух машинных слов: указатель на шаблон и указатель на аргументы, что позволяет передавать значения этого типа в регистрах.
Как это работает? Представление подробно расписано в исходниках, но если коротко: строка, описывающая шаблон, переписывается в байтовый массив, который содержит куски разных типов. В зависимости от префикса каждый кусок распознаётся как литерал строки, как ссылка на аргумент для форматирования или описание опций форматирования. Среди этих кусков также есть и маркер конца шаблона: ноль. Хранение конца шаблона внутри самого шаблона позволяет не хранить ни длину шаблона, ни длину слайса аргументов.
Как Мара пишет в Mastodon:
'Hello world' compiles 3% faster and a few bigger projects like Ripgrep and Cargo compile 1.5% to 2% faster. And those binaries are roughly 2% smaller. 🎊
Надо отметить, что по сравнению со старым дизайном новый кое в чём проигрывает: отдельные литеральные части шаблона теперь лежат внутри неделимого массива и потому не могут быть дедуплицированы. На практике, впрочем, это не должно быть большой проблемой, поскольку зачастую эти строковые куски занимают меньше места, чем (толстые) указатели на них.
GitHub
New format_args!() and fmt::Arguments implementation by m-ou-se · Pull Request #148789 · rust-lang/rust
Part of #99012
This is a new implementation of format_args!() and fmt::Arguments. With this implementation, fmt::Arguments is only two pointers in size. (Instead of six, before.) This makes it the ...
This is a new implementation of format_args!() and fmt::Arguments. With this implementation, fmt::Arguments is only two pointers in size. (Instead of six, before.) This makes it the ...
👍7🤔2❤1
#prog #c #article #abnormalprogramming
Серия из трёх (на текущий момент) статей о странностях C
Weekend projects: getting silly with C
Getting silly with C, part (void*)2
Getting silly with C, part ~(~1<<1)
Наверное, мои самый любимые примеры кода из статей — это многострочный комментарий:
и абьюз type punning-а на сигнатуре
Серия из трёх (на текущий момент) статей о странностях C
Weekend projects: getting silly with C
Getting silly with C, part (void*)2
Getting silly with C, part ~(~1<<1)
Наверное, мои самый любимые примеры кода из статей — это многострочный комментарий:
#include <stdio.h>
int main() {
puts("Hello world");
asm("/*");
/* Nested comment */
for (int i = 0; i < 10; i++) puts("I LIKE PANCAKES!");
asm("*/");
puts("Goodbye world");
}
и абьюз type punning-а на сигнатуре
main для доставания "Главного ответа о вселенной, смысле жизни и всего такого" из воздуха:#include <stdio.h>
int main(int i) {
do do do do "baby shark!";
while (++i % 2);
while (i == 2);
while (i % 3);
while (i % 7);
printf("The answer is %d.\n", i);
}
😁12👍2🤯2🍌1
#prog #article
Afternoon project: JPEG DCT text lossifizer
Чел сделал штуку (веб-приложение), которая применяет к тексту процесс, аналогичный сжатию с потерями в JPEG: разбирает текст как семпл на частоты, огрубляет их и собирает обратно.
Пара моментов:
В JPEG квантизация в основном огрубляет (и отбрасывает) высокие частоты. В случае же с текстом это приводило к слишком большой деградации, поэтому программа сначала отбрасывает низкие частоты.
Первоначальная реализация использовала ASCII-коды напрямую, но комментатор предложил другую кодировку, в которой символы со схожим написанием/звучанием имели близкие коды, и это положительно сказалось на читаемости сжатого текста даже с весьма большим огрублением.
Afternoon project: JPEG DCT text lossifizer
Чел сделал штуку (веб-приложение), которая применяет к тексту процесс, аналогичный сжатию с потерями в JPEG: разбирает текст как семпл на частоты, огрубляет их и собирает обратно.
Пара моментов:
В JPEG квантизация в основном огрубляет (и отбрасывает) высокие частоты. В случае же с текстом это приводило к слишком большой деградации, поэтому программа сначала отбрасывает низкие частоты.
Первоначальная реализация использовала ASCII-коды напрямую, но комментатор предложил другую кодировку, в которой символы со схожим написанием/звучанием имели близкие коды, и это положительно сказалось на читаемости сжатого текста даже с весьма большим огрублением.
🤯11❤4🔥2
#prog #rust #article
In defense of lock poisoning in Rust
In defense of lock poisoning in Rust
<...> I keep coming back to how unbounded the downside of an undetected panic is, and how easy it is to get wedged in this state. Mutexes and poisoning have value separate from each other, but I don’t think they are as independent as they seem at first. My understanding from writing Rust code over many years is that almost all uses of mutexes benefit from poisoning, and almost all instances of poisoning one needs to care about are with mutex-guarded data.
#prog #amazingopensource #article (и даже в какой-то мере #algo)
Stacktower.io (репозиторий) — инструмент для создания визуализаций зависимостей в духе известного комикса xkcd + история о его создании, с инкрементальным улучшением, начиная с брутфорса. История хорошо демонстрирует, насколько хорошо помогает знать prior art в computer science.
Stacktower.io (репозиторий) — инструмент для создания визуализаций зависимостей в духе известного комикса xkcd + история о его создании, с инкрементальным улучшением, начиная с брутфорса. История хорошо демонстрирует, насколько хорошо помогает знать prior art в computer science.
👍16🌚3❤🔥2
#prog #rust #rustreleasenotes
Вышла версия Rust 1.92.0! Как всегда, тут только интересные мне моменты — всё остальное в детальных заметках о релизе.
▪️Информация по оптимизации времени сборки теперь есть прямо в Cargo book 🎉 (PR)
▪️Линты про проблемы, связанные с never type fallback, теперь deny by default.
▪️Теперь на функциях можно комбинировать
▪️Операции
▪️Линт unused_must_use теперь не срабатывает на значениях Result<T, E>, где тип E не населён.
▪️
▪️Методы
▪️Стабилизированы некоторые API:
🔸std::panic::Location::file_as_cstr (полезно для интеропа с C/C++)
🔸RwLockWriteGuard::downgrade для понижения блокировки на запись до блокировки на чтение
🔸
🔸
▪️Методы
▪️Поиск в rustdoc теперь скрывает методы трейтов на типах из результатов поиска, если в списке есть сам метод трейта. Например, поиск по "last" покажет
▪️Компилятор теперь по умолчанию генерирует таблицы для раскрутки стека даже с -C panic=abort. Это сделано для рабочих трассировок стека (которые могут быть созданы не только паникой). Убрать эти таблицы можно ключём
Вышла версия Rust 1.92.0! Как всегда, тут только интересные мне моменты — всё остальное в детальных заметках о релизе.
▪️Информация по оптимизации времени сборки теперь есть прямо в Cargo book 🎉 (PR)
▪️Линты про проблемы, связанные с never type fallback, теперь deny by default.
▪️Теперь на функциях можно комбинировать
#[track_caller] и #[no_mangle]. Технически это можно было делать и раньше, но до этого релиза преобразование подобной функции в указатель на функцию сохраняло атрибут #[no_mangle], что приводило к ошибкам линковки. Если что, работает эта комбинация только на функциях с extern "Rust".▪️Операции
&raw const/&raw mut для взятия адреса теперь можно использовать на полях объединений в safe коде.▪️Линт unused_must_use теперь не срабатывает на значениях Result<T, E>, где тип E не населён.
▪️
Iterator::eq{, by} теперь может сделать ранний возврат на TrustedLen итераторах. Да, это означает, что теперь этот метод может отбрасывать операции с побочными эффектами.▪️Методы
count и last на iter::Repeat теперь паникуют вместо входа в бесконечный цикл.▪️Стабилизированы некоторые API:
🔸std::panic::Location::file_as_cstr (полезно для интеропа с C/C++)
🔸RwLockWriteGuard::downgrade для понижения блокировки на запись до блокировки на чтение
🔸
new_zeroed и new_zeroed_slice на умных указателях. Сами конструкторы safe, потому что возвращают аллокации с MaybeUninit вместо значений напрямую.🔸
insert_entry на btree_map::Entry и btree_map::VacantEntry, которые вставляют переданное значение и возвращают OccupiedEntry (аналогичные методы для HashMap стабилизировали год назад)▪️Методы
rotate_left и rotate_right на слайсах теперь можно вызывать в const-контекстах.▪️Поиск в rustdoc теперь скрывает методы трейтов на типах из результатов поиска, если в списке есть сам метод трейта. Например, поиск по "last" покажет
Iterator::last и BTreeSet::last (метод на BTreeSet, не имеющий отношения к Iterator), но не покажет, скажем, std::vec::IntoIter::last.▪️Компилятор теперь по умолчанию генерирует таблицы для раскрутки стека даже с -C panic=abort. Это сделано для рабочих трассировок стека (которые могут быть созданы не только паникой). Убрать эти таблицы можно ключём
-C force-unwind-tables=no.blog.rust-lang.org
Announcing Rust 1.92.0 | Rust Blog
Empowering everyone to build reliable and efficient software.
👍5🎉3