#prog #rust #rustreleasenotes
Вышла версия Rust 1.83.0! Как всегда, тут только избранные части, а всё остальное в детальных заметках.
▪️В const-контекстах теперь можно использовать
Написание const-кода серьёзно упростилось. Само итоговое значение константы, впрочем, не может быть изменяемой (в том числе через внутреннюю изменяемость) ссылкой.
Также итоговое значение константы теперь может содержать
По понятным причинам итоговое значение константы не может содержать изменяемую (в том числе через внутреннюю изменяемость) ссылку на
▪️Как прямое следствие предыдущего пункта — кучу функций можно теперь использовать в const-контексте, включая множество операций над сырыми указателями (в том числе
▪️Также стабилизировали кучу новых вариантов io::ErrorKind. Забавный факт: эти варианты были и раньше и использовались в std, и в теории по ним можно было матчиться, используя реализацию
▪️Ещё в число стабилизированных API вошли
▪️Одновременные атомарные и неатомарные доступы на чтение из одной локации в памяти одного размера теперь не считаются гонкой данных и потому не являются UB (в C++ — является, поскольку атомарные доступы в C++ происходят через создание atomic_ref, абстрактная машина C++ оперирует типизированной памятью).
▪️Предыдущие версии языка ошибочно считали
следующая функция скомпилируется вне зависимости от того, определена ли она в том же крейте, что и
▪️Из забавного: компилятор теперь выдаёт ошибку на атрибут
Вышла версия Rust 1.83.0! Как всегда, тут только избранные части, а всё остальное в детальных заметках.
▪️В const-контекстах теперь можно использовать
&mut
-ссылки, а также &
-ссылки на типы с внутренней изменяемостью!const fn inc(x: &mut i32) {
*x += 1;
}
const C: i32 = {
let mut c = 41;
inc(&mut c);
c
};
Написание const-кода серьёзно упростилось. Само итоговое значение константы, впрочем, не может быть изменяемой (в том числе через внутреннюю изменяемость) ссылкой.
Также итоговое значение константы теперь может содержать
&
-ссылку на static
, если в типе нет внутренней изменяемости. static S: i32 = 25;
const C: &i32 = &S;
По понятным причинам итоговое значение константы не может содержать изменяемую (в том числе через внутреннюю изменяемость) ссылку на
static
.▪️Как прямое следствие предыдущего пункта — кучу функций можно теперь использовать в const-контексте, включая множество операций над сырыми указателями (в том числе
NonNull
) и различные функции для разбиения мутабельных слайсов на части.▪️Также стабилизировали кучу новых вариантов io::ErrorKind. Забавный факт: эти варианты были и раньше и использовались в std, и в теории по ним можно было матчиться, используя реализацию
Display
. Ещё забавный факт: стабилизацию всех этих вариантов и ещё некоторых запланировали 23 месяца назад, но первый PR со стабилизацией застопорился из-за некоторых вариантов, которые были слишком специфичны для конкретных операционных систем. Собственно, новый PR со стабилизацией приняли лишь потому, что эти варианты из списка на стабилизацию выкинули.▪️Ещё в число стабилизированных API вошли
hash_map::{Entry, VacantEntry}::insert_entry
. Эти методы вставляют переданное значение, но, в отличие от insert
, возвращают не мутабельную ссылку на значение, а OccupiedEntry
.▪️Одновременные атомарные и неатомарные доступы на чтение из одной локации в памяти одного размера теперь не считаются гонкой данных и потому не являются UB (в C++ — является, поскольку атомарные доступы в C++ происходят через создание atomic_ref, абстрактная машина C++ оперирует типизированной памятью).
▪️Предыдущие версии языка ошибочно считали
#[non_exhaustive]
-структуры с ненаселёнными полями населёнными типами вне крейта, в которых они определены. В этой версии это странное поведение исправили. Для пользователей языка это означает, что, например, с вот таким определением:enum Empty {}
#[non_exhaustive]
struct Foo(Empty);
следующая функция скомпилируется вне зависимости от того, определена ли она в том же крейте, что и
Foo
, или нет:fn eliminate<T>(f: Foo) -> T {
match f {}
}
▪️Из забавного: компилятор теперь выдаёт ошибку на атрибут
#[repr(Rust)]
, применённый на определение, которое не является перечислением, структурой или объединением.👍8❤4🎉2
Блог*
#prog #rust #rustreleasenotes Вышла версия Rust 1.83.0! Как всегда, тут только избранные части, а всё остальное в детальных заметках. ▪️В const-контекстах теперь можно использовать &mut-ссылки, а также &-ссылки на типы с внутренней изменяемостью! const…
Пока готовил список — узнал, что есть нестабильная фича для того, чтобы указывать выравнивание для функций
GitHub
Tracking Issue for `#[repr(align(...))]` on function items (fn_align) · Issue #82232 · rust-lang/rust
This feature allows specifying an alignment for function items by adding the #[repr(align(...))] attribute to them. The feature gate for the issue is #![feature(fn_align)] Example #[repr(align(16))...
👍2
Forwarded from Алиса копается
Последние полторы недели я пилила Lithium — крейт для работы с исключениями в расте.
Exceptions? In my monadic language? It's more likely than you think!
Исключения хороши тем, что они, по сравнению с
Если оставить в стороне вопрос идиоматичности, проблем с исключениями в Rust две: эргономика и производительность. К решению их обеих Lithium подступается, но не завершает, потому что это низкоуровневый крейт с фиксированным скоупом, который должен стать одним кирпичиком, а не быть идеальным решением.
Это пока обзорный пост, чтобы извиниться за лишние пинги оффтопом, потом напишу побольше.
- Эргономика
Для эргономики предоставляются функции
С одной стороны — это требует делать функции unsafe, с другой — если смотреть на существующий растовый код, опирающийся на
По сравнению с Rust-паниками снимается еще одно требование — бросаемый тип не обязан быть
- Производительность
Для производительности пробрасывание исключений идет через наиболее низкоуровневые доступные API, а не через
В API есть еще одна особенность: интерфейс позволяет поймать исключение, промодифицировать его payload и перевыбросить исключение более эффективно, чем в два шага через
Итоговый результат — на большинстве платформ идиоматичный код на Lithium работает в 2.5 раза быстрее идиоматичного кода на паниках, не теряя в экспрессивности.
Exceptions? In my monadic language? It's more likely than you think!
Исключения хороши тем, что они, по сравнению с
Result
, добавляют меньше оверхеда в success path, и поэтому, если ошибки случаются достаточно редко, оказывается выгодным их использовать для передачи ошибок.Если оставить в стороне вопрос идиоматичности, проблем с исключениями в Rust две: эргономика и производительность. К решению их обеих Lithium подступается, но не завершает, потому что это низкоуровневый крейт с фиксированным скоупом, который должен стать одним кирпичиком, а не быть идеальным решением.
Это пока обзорный пост, чтобы извиниться за лишние пинги оффтопом, потом напишу побольше.
- Эргономика
Для эргономики предоставляются функции
throw
и catch
, аналогичные конструкциям из других языков. throw
бросает произвольный T
, catch
ловит произвольный T
, никакой проверки типов нет.С одной стороны — это требует делать функции unsafe, с другой — если смотреть на существующий растовый код, опирающийся на
Result
, то там это требование всегда исполняется, поэтому проверка типов только добавила бы оверхед.По сравнению с Rust-паниками снимается еще одно требование — бросаемый тип не обязан быть
Send + 'static
, поэтому можно спокойно бросать, например, ссылки на Cell
.- Производительность
Для производительности пробрасывание исключений идет через наиболее низкоуровневые доступные API, а не через
panic!
. В случае большинства платформ это Itanium EH, на Windows это SEH. Это несколько уменьшает оверхед от вызовов, а также в большинстве случаев позволяет снизить количество аллокаций до нуля.В API есть еще одна особенность: интерфейс позволяет поймать исключение, промодифицировать его payload и перевыбросить исключение более эффективно, чем в два шага через
catch
+ throw
. Такое переиспользование буфферов тоже несколько увеличивает перф.Итоговый результат — на большинстве платформ идиоматичный код на Lithium работает в 2.5 раза быстрее идиоматичного кода на паниках, не теряя в экспрессивности.
Lib.rs
Lithium — system library interface for Rust
Lightweight exceptions
🤔13🔥6👎4👍2😱2🌚1
И да, раз декабрь начался, знаете, что это означает? Всё правильно, это означает Advent of code
👌12🤮4❤🔥3
Forwarded from Метаверсище и ИИще (Sergey Tsyptsyn ️️)
ИИ - это не только ценный с мех, это еще и способ вернуть возможность говорить немым пациентам.
Говорить - это доводить до озвучки свои попытки в голове что-то сказать.
Если эксперимент удастся воспроизвести на более разнообразных текстовых данных, а не только для тех, что использовались в статье, то это (мне кажется) невыносимо круто, учитывая заявленную точность в 90% и выход на 97% после дотренировки.
Если на TLDR-пальцах:
Человеку имплантировали 4 электрода, которые регистрировали его нейроактивность. За 30-минут обучили ИИ превращать эти сигналы в текст. Текст озвучили с помощью text-2-speech. Это на словарном запасе 50 слов.
Но.
Потренировали еще полтора часа и вот уже словарный запас 125 000 слов (больше чем у любого школьника) и точность 90.2 процента.
Как тут не вспомнить про пластичность мозга, который может использовать новые сигналы взамен потерянных (кохлеарные имплантанты, писал тут 1 2 3), чтобы расшифровывать их в нужный канал восприятия (слух речь).
ИИ и есть эта пластичность в данном примере.
Для гиков.
Пациенту была проведена хирургическая имплантация четырех микроэлектродных массивов в левую прецентральную извилину, которые регистрировали нейронную активность с 256 внутрикорковых электродов. Такой нейропротез, декодировал его нейронную активность, когда он пытался говорить в условиях как заданной, так и неструктурированной беседы. Декодированные слова отображались на экране, а затем озвучивались с помощью text2speech. В первый день использования системы, после 30 минут попыток обучения речи, нейропротез достиг точности 99.6% при словарном запасе в 50 слов. На второй день объем возможного словарного запаса увеличился до 125 000 слов, и после 1.4 дополнительных часов обучения нейропротез достиг точности 90.2%. При дальнейшем обучении нейропротез сохранял точность 97.5% в течение восьми месяцев после хирургической имплантации. Участник использовал нейропротез для самостоятельного общения в течение более 248 часов. У человека с ALS и тяжелой дизартрией внутрикорковый речевой нейропротез достиг уровня производительности, пригодного для восстановления естественного общения, после короткого периода обучения.
Когда Маск сделает свою иголочку доступной на уровне амбулаторного укола в голову для всех, можно будет набирать текстовые сообщения молча. Нет, общаться с chatGPT молча. А еще круче - тихие Zoom-коллы. Все сидят в наушниках и молчат.
Если вы думаете, что все это шуточки, поглядите видео:
https://www.youtube.com/watch?v=thPhBDVSxz0
Немного не по себе после просмотра.
https://pubmed.ncbi.nlm.nih.gov/38645254/
А, самое значимое, код есть на Гитхабе.
@cgevent
Говорить - это доводить до озвучки свои попытки в голове что-то сказать.
Если эксперимент удастся воспроизвести на более разнообразных текстовых данных, а не только для тех, что использовались в статье, то это (мне кажется) невыносимо круто, учитывая заявленную точность в 90% и выход на 97% после дотренировки.
Если на TLDR-пальцах:
Человеку имплантировали 4 электрода, которые регистрировали его нейроактивность. За 30-минут обучили ИИ превращать эти сигналы в текст. Текст озвучили с помощью text-2-speech. Это на словарном запасе 50 слов.
Но.
Потренировали еще полтора часа и вот уже словарный запас 125 000 слов (больше чем у любого школьника) и точность 90.2 процента.
Как тут не вспомнить про пластичность мозга, который может использовать новые сигналы взамен потерянных (кохлеарные имплантанты, писал тут 1 2 3), чтобы расшифровывать их в нужный канал восприятия (слух речь).
ИИ и есть эта пластичность в данном примере.
Для гиков.
Пациенту была проведена хирургическая имплантация четырех микроэлектродных массивов в левую прецентральную извилину, которые регистрировали нейронную активность с 256 внутрикорковых электродов. Такой нейропротез, декодировал его нейронную активность, когда он пытался говорить в условиях как заданной, так и неструктурированной беседы. Декодированные слова отображались на экране, а затем озвучивались с помощью text2speech. В первый день использования системы, после 30 минут попыток обучения речи, нейропротез достиг точности 99.6% при словарном запасе в 50 слов. На второй день объем возможного словарного запаса увеличился до 125 000 слов, и после 1.4 дополнительных часов обучения нейропротез достиг точности 90.2%. При дальнейшем обучении нейропротез сохранял точность 97.5% в течение восьми месяцев после хирургической имплантации. Участник использовал нейропротез для самостоятельного общения в течение более 248 часов. У человека с ALS и тяжелой дизартрией внутрикорковый речевой нейропротез достиг уровня производительности, пригодного для восстановления естественного общения, после короткого периода обучения.
Если вы думаете, что все это шуточки, поглядите видео:
https://www.youtube.com/watch?v=thPhBDVSxz0
Немного не по себе после просмотра.
https://pubmed.ncbi.nlm.nih.gov/38645254/
А, самое значимое, код есть на Гитхабе.
@cgevent
👍8🔥8😐3❤🔥1👎1🎉1
#prog #rust хайлайты
We are currently unconditionally verifying the LLVM IR in the backend (twice), ignoring the value of the verify-llvm-ir option. This has substantial compile-time impact for debug builds.
На скриншоте — результаты бенчмарков после мерджа.
github.com/rust-lang/rust/pull/133499
We are currently unconditionally verifying the LLVM IR in the backend (twice), ignoring the value of the verify-llvm-ir option. This has substantial compile-time impact for debug builds.
На скриншоте — результаты бенчмарков после мерджа.
github.com/rust-lang/rust/pull/133499
👏12💩4👍1
Forwarded from partially unsupervised
a16z выкатили примечательный блогпост про big ideas in tech 2025.
Примечателен он в первую очередь тем, как единственная страница может заставить включиться кулер нового макбука.
Примечателен он в первую очередь тем, как единственная страница может заставить включиться кулер нового макбука.
😁8🤯6