▪️Несколько багфиксов:
🔸Греческая буква Σ (сигма) имеет две формы нижнего регистра: ς при использовании в конце слова и σ во всех остальных позициях.
🔸Функции
🔸Компилятор теперь предупреждает, когда во вложенном определении используется конструктор
🔸В паттернах теперь нельзя использовать функциональные указатели и сырые указатели, полученные не путём каста из числового значения.
🔸Теперь нельзя преобразовывать в трейт-объекты трейты, у которых есть ограничения вида
🔸Для ReentrantLockGuard (внутренней реализации
▪️Некоторые стабилизированные API:
🔸
🔸Option::take_if — как
🔸Множество методов на
🔸Методы split_at{, _mut}_checked на слайсах и на
🔸Методы trim{, _start, _end}_ascii на байтовых слайсах и на
🔸Метод into_flattened для преобразования
▪️
🔸Греческая буква Σ (сигма) имеет две формы нижнего регистра: ς при использовании в конце слова и σ во всех остальных позициях.
str::to_lowercase теперь корректно обрабатывает этот граничный случай.🔸Функции
env::set_var и env::remove_var теперь являются unsafe функциями в Edition 2024 (как и должны быть, но эта смена невозможна в более старых редакциях из-за гарантий обратной совместимости).🔸Компилятор теперь предупреждает, когда во вложенном определении используется конструктор
Self, относящийся к определению выше в области видимости. В будущем это сделают ошибкой компиляции.🔸В паттернах теперь нельзя использовать функциональные указатели и сырые указатели, полученные не путём каста из числового значения.
🔸Теперь нельзя преобразовывать в трейт-объекты трейты, у которых есть ограничения вида
Self: Trait на отдельных определениях внутри (не на определении трейта целиком). Ранее это было разрешено и позволяло написать код, который сегфолтился в рантайме при попытке вызвать из vtable функцию, которой там не было :/ Закрывает issue от аж мая 2018 года.🔸Для ReentrantLockGuard (внутренней реализации
StdinLock и StderrLock) исправили реализацию Sync. Как следствие, StdinLock и StderrLock более не реализуют Sync.▪️Некоторые стабилизированные API:
🔸
size_of, size_of_val, align_of и align_of_val. Да, это не новые API, но теперь они включены в прелюдию.🔸Option::take_if — как
Option::take, но с предикатом (который может и модифицировать содержимое).🔸Множество методов на
NonNull, которые были ранее доступны на сырых указателях (слишком много, чтобы перечислять здесь).🔸Методы split_at{, _mut}_checked на слайсах и на
str — как split_at, но возвращает None при выходе за границу. Почему только сейчас?🔸Методы trim{, _start, _end}_ascii на байтовых слайсах и на
str.🔸Метод into_flattened для преобразования
Vec<[T; N]> -> Vec<T> и аналогичные методы as_flattened{, _mut} на слайсах.▪️
check-cfg теперь всегда работает — иными словами, компилятор ловит опечатки в атрибутах #[cfg]👍4🥰2
#prog #article
RocksDB: Not A Good Choice for a High-Performance Streaming Platform
TL;DR:
- Катастрофическое падение производительности при использовании из нескольких потоков;
- Создание и удаление column families является квадратичными от числа column families операциями. В проде это не было проблемой, но в тестах (со значительным использованием property-based testing) новые colum family создавались и удалялись для каждого теста. Общее время прогона тестов из-за этого увеличилось с двух минут до тридцати.
- Невозможность задействовать rkyv. rkyv — библиотека для Rust, которая позволяет переводить типы в их "архивные" версии в виде байтовых слайсов, из которых можно восстановить исходные данные с минимальными вычислительными затратами и без копирования данных. Для корректной работы rkyv накладывает некоторые ограничения на выравнивание "архивных" данных, но эти ограничения невозможно зафорсить в RocksDB — все значения имеют единичное выравнивание.
- Переусложнённая настройка — настолько, что для нахождения оптимальных конфигураций сделали отдельную машобуч-модель — которая всё равно не даёт большой возможности скорректировать настройки в сторону производительности.
RocksDB: Not A Good Choice for a High-Performance Streaming Platform
TL;DR:
- Катастрофическое падение производительности при использовании из нескольких потоков;
- Создание и удаление column families является квадратичными от числа column families операциями. В проде это не было проблемой, но в тестах (со значительным использованием property-based testing) новые colum family создавались и удалялись для каждого теста. Общее время прогона тестов из-за этого увеличилось с двух минут до тридцати.
- Невозможность задействовать rkyv. rkyv — библиотека для Rust, которая позволяет переводить типы в их "архивные" версии в виде байтовых слайсов, из которых можно восстановить исходные данные с минимальными вычислительными затратами и без копирования данных. Для корректной работы rkyv накладывает некоторые ограничения на выравнивание "архивных" данных, но эти ограничения невозможно зафорсить в RocksDB — все значения имеют единичное выравнивание.
- Переусложнённая настройка — настолько, что для нахождения оптимальных конфигураций сделали отдельную машобуч-модель — которая всё равно не даёт большой возможности скорректировать настройки в сторону производительности.
Feldera
RocksDB: Not A Good Choice for a High-Performance Streaming Platform
We go over our findings when trying to use RocksDB as our storage engine
🤔5😁1😢1
#prog #rust #article
Лодочник пишет о Pin.
Именно, в первой статье — Pin — автор объясняет, для чего нужен Pin и почему решения, предлагаемые на замену, не подходят и были в конечном счёте отброшены при дизайне async/await. В конце автор расписывает проблемы с Pin — включая эргономические.
В статье Pinned places лодочник рассказывает о возможном обратно совместимом расширении языка, которое интегрирует закрепление мест (places в терминологии Rust reference) в язык глубже. Как показывает автор, это позволяет значительно удобнее писать низкоуровневый (в стиле вызова poll) асинхронный код — без лишнего unsafe и с гораздо более прозрачным pin projection.
Лично я считаю предлагаемое расширение языка с моей дилетантской точки зрения довольно перспективным.
Лодочник пишет о Pin.
Именно, в первой статье — Pin — автор объясняет, для чего нужен Pin и почему решения, предлагаемые на замену, не подходят и были в конечном счёте отброшены при дизайне async/await. В конце автор расписывает проблемы с Pin — включая эргономические.
В статье Pinned places лодочник рассказывает о возможном обратно совместимом расширении языка, которое интегрирует закрепление мест (places в терминологии Rust reference) в язык глубже. Как показывает автор, это позволяет значительно удобнее писать низкоуровневый (в стиле вызова poll) асинхронный код — без лишнего unsafe и с гораздо более прозрачным pin projection.
Лично я считаю предлагаемое расширение языка с моей дилетантской точки зрения довольно перспективным.
👍9❤1
#music
Из сюрреалистичного шутера Post void.
karlflodin.bandcamp.com/track/post-void-single-feat-ycjy
Из сюрреалистичного шутера Post void.
karlflodin.bandcamp.com/track/post-void-single-feat-ycjy
Karl Flodin
POST VOID SINGLE (feat. YCJY), by Karl Flodin
track by Karl Flodin
#prog #article
A type system for RCL
Implementing a typechecker in Rust
Статья о некоторых деталях реализации тайпчекера разработанного автором языка конфигурации, который является ML-like расширением над JSON.
Это четвёртая статья в серии об этом языке, так что рекомендую также прочитать предыдущие.
В более ранней статье A reasonable configuration language автор рассказывает, что побудило его на разработку нового языка. В качестве неожиданного побочного эффекта он получил более удобную (для него) замену jq.
A type system for RCL
Implementing a typechecker in Rust
Статья о некоторых деталях реализации тайпчекера разработанного автором языка конфигурации, который является ML-like расширением над JSON.
Это четвёртая статья в серии об этом языке, так что рекомендую также прочитать предыдущие.
В более ранней статье A reasonable configuration language автор рассказывает, что побудило его на разработку нового языка. В качестве неожиданного побочного эффекта он получил более удобную (для него) замену jq.
Ruudvanasseldonk
A type system for RCL: Implementing a typechecker in Rust
I am adding a type system to RCL, my configuration language. In part 4, we look at how the typechecker is implemented in Rust, and at how it is able to generate good error messages.
👍1💩1