Короче
Я нашёл комикс, который начинается, как slice of life с тупыми гэгами, но постепенно перерастает в удивительно трогательную историю дружбы (при этом, что удивительно, не перерастающей в романтические отношения) с крайне живыми и убедительными персонажами (которые ещё и растут психологически по мере развития истории!).
Я вот только что дочитал последний, пятисотый эпизод, и я тронут, у меня глаза на влажном месте.
Почитать можно тут (в приложении удобнее):
webtoons.com/en/slice-of-life/waffles-and-pancakes/list?title_no=1310
Единственное: это совсем не детский комикс. Нет, какой-то особой жести там, но ругательств и некоторой небольшой дичи там хватает. И не говорите, что я вас не предупреждал.
Я нашёл комикс, который начинается, как slice of life с тупыми гэгами, но постепенно перерастает в удивительно трогательную историю дружбы (при этом, что удивительно, не перерастающей в романтические отношения) с крайне живыми и убедительными персонажами (которые ещё и растут психологически по мере развития истории!).
Я вот только что дочитал последний, пятисотый эпизод, и я тронут, у меня глаза на влажном месте.
Почитать можно тут (в приложении удобнее):
webtoons.com/en/slice-of-life/waffles-and-pancakes/list?title_no=1310
Единственное: это совсем не детский комикс. Нет, какой-то особой жести там, но ругательств и некоторой небольшой дичи там хватает. И не говорите, что я вас не предупреждал.
www.webtoons.com
Waffles & Pancakes
Two best friends attempt to answer life's greatest mysteries, such as "what if our butts had nipples?" This is a story of fart jokes and friendship. Currently updates on Tue, Thur, Sat. May not be suitable for younger audiences due to strong language and…
🤮4👍2🫡1
Внемлите мне, люди, ибо есть единственная — наиважнейшая! — причина обновиться до Rust 1.71.0:
стабилизация
стабилизация
CStr::is_empty()
drops mic👍7🔥2
Ну а теперь серьёзно.
#prog #rust #rustreleasenotes
Вышла версия Rust 1.71.0! Как обычно, тут только избранные куски, а все изменения в ченджлоге.
▪️Новый вариант опции атрибута
▪️ Уже имеющиеся варианты ABI обзавелись
Это изменение сделает более удобным разработку проектов, смешивающих код на Rust с кодом на других языках. Не
▪️Ещё одно изменение, связанное с паниками, но уже исключительно в рамках Rust. Ранее паника во время паники приводила к немедленному аборту процесса. Теперь это ограничение несколько ослабили: паника во время паники не приводит к аборту при условии, что она перехватывается на границе реализации
Но в одном аспекте требования к паникам, наоборот, сделали строже: паника внутри хука на панику сразу ведёт к аборту. В реальном коде это приводило к дедлоку из-за того, что рантайм держал блокировку на глобальный лок для бектрейса.
▪️Стало возможным включать в бинарники скрипты для визуализации значений пользовательских типов в отладчиках. Без этих скриптов в отладчике значение, скажем,
▪️Обновлена версия MUSL, используемая для *-linux-musl. Главным образом это означает, что 64-битная версия time_t, позволяющая избежать проблемы 2038 года, используется безусловно для всех систем, включая 32-битные.
▪️Макрос
* в этих случаях в результирующем коде теперь меньше виртуальных вызовов
* как следствие, макросы вроде log::info! теперь не вредят производительности из-за пробрасывания аргументов через
* core::fmt::Arguments::as_str() теперь чаще возвращает
* в бинаре теперь может сильно распухнуть секция
▪️Несколько изменений докатились до стейбла: улучшения расчёта раскладки типов, фикс расчёта приватности для Self-конструктора у кортежных структур, документация для const-инициализации thread local статиков, стабилизация BuildHasher::hash_one.
#prog #rust #rustreleasenotes
Вышла версия Rust 1.71.0! Как обычно, тут только избранные куски, а все изменения в ченджлоге.
▪️Новый вариант опции атрибута
#[link] — конкретно kind="raw-dylib" — позволяет на Windows линковаться с динамическими библиотеками, не требуя их наличия во время компиляции. Кросс-компиляция стала немного проще. А, и ещё атрибуты для импорта и экспорта символом из/в DLL, но я недостаточно в этом разбираюсь, чтобы понять разницу.▪️ Уже имеющиеся варианты ABI обзавелись
"*-unwind" вариантами (полный список). Как нетрудно догадаться, паники и исключения, вызывающую раскрутку стека, могут проходить границу между языками. В частности, это означает, что исключения из C++ могут проходить через фреймы Rust-кода, а растовая паника может проходить через фреймы C++-кода. Ловить раскрутку стека, впрочем, можно лишь в фреймах того языка, в котором она была начата.Это изменение сделает более удобным разработку проектов, смешивающих код на Rust с кодом на других языках. Не
*-unwind варианты ABI, как и раньше, абортят процесс, если раскрутка стека пытается пройти по FFI.▪️Ещё одно изменение, связанное с паниками, но уже исключительно в рамках Rust. Ранее паника во время паники приводила к немедленному аборту процесса. Теперь это ограничение несколько ослабили: паника во время паники не приводит к аборту при условии, что она перехватывается на границе реализации
drop. Иными словами, паники внутри деструкторов — которые сами могут быть вызваны из-за паники — могут быть перехвачены и корректно обработаны, не приводя к немедленному прекращению работы.Но в одном аспекте требования к паникам, наоборот, сделали строже: паника внутри хука на панику сразу ведёт к аборту. В реальном коде это приводило к дедлоку из-за того, что рантайм держал блокировку на глобальный лок для бектрейса.
▪️Стало возможным включать в бинарники скрипты для визуализации значений пользовательских типов в отладчиках. Без этих скриптов в отладчике значение, скажем,
Vec<i32> выглядело бы не как последовательность чисел, а как набор из адреса, длины и ёмкости — что, очевидно, не слишком-то полезно. Такими скриптами для визуализации укомплектовывается std. Новый механизм позволяет использовать этот же механизм и пользователям Rust.▪️Обновлена версия MUSL, используемая для *-linux-musl. Главным образом это означает, что 64-битная версия time_t, позволяющая избежать проблемы 2038 года, используется безусловно для всех систем, включая 32-битные.
▪️Макрос
format_args! (на который опираются куча макросов как в std, так и вне её) теперь инлайнит форматируемые значения в форматные строки, если они являются литералами или вложенными format_args!. Если наглядно, то следующие пары вызовов теперь эквивалентны даже не на уровне бинарного кода, а ещё на уровне HIR:println!("Hello, {}!", "World");
println!("Hello, World!");
println!("[info] {}", format_args!("error"));
println!("[info] error");
println!("[{}] {}", status, format_args!("error: {}", msg));
println!("[{}] error: {}", status, msg);
println!("{} + {} = {}", 1, 2, 1 + 2);
println!("1 + 2 = {}", 1 + 2);
Из того, на что на это влияет:* в этих случаях в результирующем коде теперь меньше виртуальных вызовов
fmt-методов;* как следствие, макросы вроде log::info! теперь не вредят производительности из-за пробрасывания аргументов через
format_args!;* core::fmt::Arguments::as_str() теперь чаще возвращает
Some(_);* в бинаре теперь может сильно распухнуть секция
.text из-за большего количества уникальных строк — особенно, если в коде активно используется макрос dbg!. Не то, чтобы это было большой проблемой, но может выйти боком, если проект компилируется, скажем, под embedded, где каждый байт на счету.▪️Несколько изменений докатились до стейбла: улучшения расчёта раскладки типов, фикс расчёта приватности для Self-конструктора у кортежных структур, документация для const-инициализации thread local статиков, стабилизация BuildHasher::hash_one.
blog.rust-lang.org
Announcing Rust 1.71.0 | Rust Blog
Empowering everyone to build reliable and efficient software.
👍8🎉2❤1👎1
▪️rustdoc теперь предупреждает о возможно пропущенных бектиках в док-комментах. Но линт для этого нужно включать явно. Пример:
▪️Гомогенные кортежи и массивы той же длины до 12 элементов включительно теперь можно конвертировать между собой через
▪️Очередная пачка API из разряда "стоп, почему такую элементарную вещь стабилизировали только сейчас":
* CStr::is_empty()
* BuildHasher::hash_one
* Пачка методов для обращения знака у
▪️
#![warn(rustdoc::unescaped_backticks)]Вывод:
/// `add(a, b) is the same as `add(b, a)`.
pub fn add(a: i32, b: i32) -> i32 { a + b }
warning: unescaped backtick▪️
--> src/lib.rs:3:41
|
3 | /// `add(a, b) is the same as `add(b, a)`.
| ^
|
help: a previous inline code might be longer than expected
|
3 | /// `add(a, b)` is the same as `add(b, a)`.
| +
help: if you meant to use a literal backtick, escape it
|
3 | /// `add(a, b) is the same as `add(b, a)\`.
| +
cargo new/cargo init внутри воркспейса теперь автоматически подтягивает поля из воркспейса выше.▪️Гомогенные кортежи и массивы той же длины до 12 элементов включительно теперь можно конвертировать между собой через
From/Into.▪️Очередная пачка API из разряда "стоп, почему такую элементарную вещь стабилизировали только сейчас":
* CStr::is_empty()
* BuildHasher::hash_one
* Пачка методов для обращения знака у
NonZero*-типов (во всех вариациях).▪️
read{, _unaligned} на сырых указателях теперь можно использовать в const-контексте — как методы, так и свободные функции в модуле std::ptr. Также в const-контексте теперь можно вызывать split_at (но почему-то всё ещё нельзя split_at_mut :/)GitHub
rustdoc: Add a new lint for broken inline code by lukas-code · Pull Request #105848 · rust-lang/rust
This patch adds rustdoc::unescaped_backticks, a new rustdoc lint that will detect broken inline code nodes.
The lint woks by finding stray backticks and with some heuristics tries to guess where th...
The lint woks by finding stray backticks and with some heuristics tries to guess where th...
👍5
Блог*
Причины переехать в Армению: 1. Можно читать twitter без VPN
Так, причин переезжать в Армению не осталось
👎6👍3😁2
#prog #rust #article
Writing a Test Case Generator for a Programming Language
В статье автор шаг за шагом строит генератор валидных WASM-программ — который, кстати, оказался полезным для нахождения багов в инструментах анализа WASM-кода.
Принципы, которые излагает автор, достаточно общие, чтобы помочь с написанием произвольного случайного структурированного входа.
Writing a Test Case Generator for a Programming Language
В статье автор шаг за шагом строит генератор валидных WASM-программ — который, кстати, оказался полезным для нахождения багов в инструментах анализа WASM-кода.
Принципы, которые излагает автор, достаточно общие, чтобы помочь с написанием произвольного случайного структурированного входа.
Fitzgeraldnick
Writing a Test Case Generator for a Programming Language
Maxime Chevalier-Boisvert requested resources for learning about fuzzingprogramming language implementations on Twitter:
👍7
Как вызвать лютую зависть всего за восемь слов (фото упомянутого кота выше на канале):
👍2
#prog #article
Swarm Testing
В тестировании софта есть такое направление, как тестирование на случайном входе. Фаззинг — это то, что на слуху, но этим, как правило, называют тестирование на случайных байтах. Это неплохой подход для тестирования парсеров медиаформатов, архивов, сетевых пакетов и прочего в этом духе, но этот подход не особо полезен для тестирования программ с высокоструктурированным входом — например, компиляторов. Для более эффективного тестирования со случайным входом для таких программ требуются генераторы подобного высокоструктурированного входа (вроде Csmith или wasm-smith).
Подобные генераторы, как правило, имеют ручки для настройки того, какие именно элементы будут генерироваться в их выходе. Скажем, Csmith можно указать, генерировать ли операции с указателями или код с объединениями. Среди пользователей таких генераторов распространено мнение, что для наиболее продуктивного использования подобного рода генераторов нужно использовать все возможные подобные фичи для генерации — возможно, настроив при этом их относительный вес, но всё же. Swarm testing же — это другой подход к использованию таких генераторов: вместо того, чтобы прогонять много тестов с одним и тем же набором активированных фич, прогонять тесты пачками, в каждой из которых активированы только часть фич для генерации.
Данный папир показывает результаты эмпирического исследования, которое показывает, что swarm testing — вопреки ожиданиям — ничуть не хуже "традиционного" случайного тестирования, а по некоторым метрикам даже превосходит, и при этом в состоянии дать больший охват багов при меньших затратах процессорного времени. Авторы также спекулируют на тему того, почему swarm testing настолько эффективно.
Swarm Testing
В тестировании софта есть такое направление, как тестирование на случайном входе. Фаззинг — это то, что на слуху, но этим, как правило, называют тестирование на случайных байтах. Это неплохой подход для тестирования парсеров медиаформатов, архивов, сетевых пакетов и прочего в этом духе, но этот подход не особо полезен для тестирования программ с высокоструктурированным входом — например, компиляторов. Для более эффективного тестирования со случайным входом для таких программ требуются генераторы подобного высокоструктурированного входа (вроде Csmith или wasm-smith).
Подобные генераторы, как правило, имеют ручки для настройки того, какие именно элементы будут генерироваться в их выходе. Скажем, Csmith можно указать, генерировать ли операции с указателями или код с объединениями. Среди пользователей таких генераторов распространено мнение, что для наиболее продуктивного использования подобного рода генераторов нужно использовать все возможные подобные фичи для генерации — возможно, настроив при этом их относительный вес, но всё же. Swarm testing же — это другой подход к использованию таких генераторов: вместо того, чтобы прогонять много тестов с одним и тем же набором активированных фич, прогонять тесты пачками, в каждой из которых активированы только часть фич для генерации.
Данный папир показывает результаты эмпирического исследования, которое показывает, что swarm testing — вопреки ожиданиям — ничуть не хуже "традиционного" случайного тестирования, а по некоторым метрикам даже превосходит, и при этом в состоянии дать больший охват багов при меньших затратах процессорного времени. Авторы также спекулируют на тему того, почему swarm testing настолько эффективно.
👍6
#prog #rust #article
Back-end parallelism in the Rust compiler
Очередная статья от Nicholas "nnethercote" Nethercote об ускорении компилятора Rust.
LLVM позволяет разбивать LLVM IR, составляющий программу, на несколько кусков — которые называются codegen units (CGU) — и обрабатывать каждый из этих кусков параллельно. Не смотря на то, что, очевидно, это вредит качеству генерируемого кода — так как LLVM не может проводить оптимизации, требующие глобального анализа — на практике это заметно ускоряет компиляцию и потому используется по умолчанию для отладочных билдов.
В этой статье Николас описывает свои попытки ускорить связанную с CGU часть компиляции. Спойлер: большинство попыток ускорить ничего не добились.
Back-end parallelism in the Rust compiler
Очередная статья от Nicholas "nnethercote" Nethercote об ускорении компилятора Rust.
LLVM позволяет разбивать LLVM IR, составляющий программу, на несколько кусков — которые называются codegen units (CGU) — и обрабатывать каждый из этих кусков параллельно. Не смотря на то, что, очевидно, это вредит качеству генерируемого кода — так как LLVM не может проводить оптимизации, требующие глобального анализа — на практике это заметно ускоряет компиляцию и потому используется по умолчанию для отладочных билдов.
В этой статье Николас описывает свои попытки ускорить связанную с CGU часть компиляции. Спойлер: большинство попыток ускорить ничего не добились.
Nicholas Nethercote
Back-end parallelism in the Rust compiler
This post describes some performance work I have been doing recently on rustc. I spent several weeks on a particular problem with only a small amount of success. I hope a write-up will be interesting and educational, and may even lead to suggestions that…
🔥2