Блог*
Как ни странно, больше всего проблем принёс сам факт инкремента версии...
#prog #article
Ваши тесты упали по причине JavaScript
TL;DR: в коде для UI-тестирования был
Ваши тесты упали по причине JavaScript
TL;DR: в коде для UI-тестирования был
if по версии VS Code, который сравнивал версию (заданную строкой) с литералом "1.44.0", и лексикографическое сравнение строк перестало быть корректным в данном случае, когда минорная версия VS Code перевалила за сотню и стала умещаться в три символа, а не два.🤩13❤2
#prog #go #article
The Green Tea Garbage Collector
Статья о дизайне нового сборщика мусора для Go, который идейно является всё тем же mark and sweep, но сканирует память страницами вместо того, чтобы отслеживать в очереди каждую индивидуальную аллокацию.
Разумеется, выигрыш по производительности сильно зависит от формы графа объектов (и в некоторых случаях может быть хуже предыдущего), но на практике даже сканирование страниц памяти по 2 процента за раз уже даёт выигрыш.
The Green Tea Garbage Collector
Статья о дизайне нового сборщика мусора для Go, который идейно является всё тем же mark and sweep, но сканирует память страницами вместо того, чтобы отслеживать в очереди каждую индивидуальную аллокацию.
Разумеется, выигрыш по производительности сильно зависит от формы графа объектов (и в некоторых случаях может быть хуже предыдущего), но на практике даже сканирование страниц памяти по 2 процента за раз уже даёт выигрыш.
go.dev
The Green Tea Garbage Collector - The Go Programming Language
Go 1.25 includes a new experimental garbage collector, Green Tea.
👍8🤡3
#prog #rust #rustlib
TIL что в bindgen есть возможность прицепить коллбеки, которые будут вызываться для определений, обрабатываемых во время генерации биндингов, и что есть уже готовый CargoCallbacks, который печатает
для каждого обрабатываемого файла и каждой явно заданной переменной окружения.
TIL что в bindgen есть возможность прицепить коллбеки, которые будут вызываться для определений, обрабатываемых во время генерации биндингов, и что есть уже готовый CargoCallbacks, который печатает
cargo:rerun-if-changed...
для каждого обрабатываемого файла и каждой явно заданной переменной окружения.
docs.rs
CargoCallbacks in bindgen - Rust
A `ParseCallbacks` implementation that will act on file includes by echoing a rerun-if-changed line and on env variable usage by echoing a rerun-if-env-changed line
🤔2
#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-коды напрямую, но комментатор предложил другую кодировку, в которой символы со схожим написанием/звучанием имели близкие коды, и это положительно сказалось на читаемости сжатого текста даже с весьма большим огрублением.
🤯9❤4