#prog #article
print(“lol”) doubled the speed of my Go function
Или о неочевидном влиянии исходников на branch predictor.
print(“lol”) doubled the speed of my Go function
Или о неочевидном влиянии исходников на branch predictor.
Medium
print(“lol”) doubled the speed of my Go function
Here is a Go function, if_max(). It finds the max value of an array of integers. Simple enough:
😁15
#rust #article #abnormalprogramming
Читателям моего блога, вероятно, знакомо такое понятие, как квайн: программа, организованная таким образом, что при запуске печатает собственный текст (буквальное обращение к файлу с исходником считается читерством).
Парочка наблюдений.
Для написания квайна на самом деле не требуется много выразительной силы языка.
Многие форматы для архивов являются фактически программами для восстановления исходных, несжатых, файлов, из серии инструкций, выполняемых интерпретатором — разархиватором.
Что из этого следует? Можно создать архивный аналог квайна: архив, который распаковывается в сам себя. В статье Zip Files All The Way Down рассказывается о том, как этого можно достичь.
Читателям моего блога, вероятно, знакомо такое понятие, как квайн: программа, организованная таким образом, что при запуске печатает собственный текст (буквальное обращение к файлу с исходником считается читерством).
Парочка наблюдений.
Для написания квайна на самом деле не требуется много выразительной силы языка.
Многие форматы для архивов являются фактически программами для восстановления исходных, несжатых, файлов, из серии инструкций, выполняемых интерпретатором — разархиватором.
Что из этого следует? Можно создать архивный аналог квайна: архив, который распаковывается в сам себя. В статье Zip Files All The Way Down рассказывается о том, как этого можно достичь.
Wikipedia
Quine (computing)
self-replicating program
🔥6
#prog #article #suckassstory
Why Chrome Crashes the Rust Book’s Web Server
TL;DR: Chrome в целях оптимизации загрузки может открыть больше одного TCP-соединения к серверу для доступа к одной веб-странице и при этом закрыть их, так ничего и не послав.
Why Chrome Crashes the Rust Book’s Web Server
TL;DR: Chrome в целях оптимизации загрузки может открыть больше одного TCP-соединения к серверу для доступа к одной веб-странице и при этом закрыть их, так ничего и не послав.
Medium
Why Chrome Crashes the Rust Book’s Web Server
Chapter 20 of the Rust book gives a step-by-step guide to building a simple web server. As the final project, it exercises many Rust…
🤔3🤯3
#культурнаяпрограмма
Coding Machines
Небольшой научно-фантастический рассказ, вдохновлённый"Reflections on trusting trust" Кена Томпсона (да, источник вдохновения является спойлером)
Coding Machines
Небольшой научно-фантастический рассказ, вдохновлённый
Forwarded from The After Times
В недавнем инциденте кибербезопасности, группа хакеров SiegedSec, самоопределяющаяся как "Гей Фурри Хакеры", осуществила взлом Американской ядерной лаборатории INL. Эта группа, известная своими атаками на серверы НАТО, на этот раз получила доступ к персональным данным сотрудников INL, включая социальные номера и домашние адреса.
В ответ на взлом, хакеры предложили необычную сделку лаборатории:
Мы готовы заключить сделку с INL. Если они начнут исследования по созданию в реальной жизни кошкодевочек, то мы все удалим.
Помимо прочего, SiegedSec известна своими политическими мотивами, включая атаки на правительственные организации в знак протеста против нарушений прав человека и дискредитацию трансгендеров.
INL, филиал Министерства энергетики США, работает над различными проектами, в том числе в области ядерных реакторов и устойчивой энергетики, насчитывая более 5000 сотрудников.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰13😁2👎1
The After Times
Всё, меняю хештег itsec на catgirls
🤡5
Афиша Daily
«ТНТ Music» заблюрил радугу в клипе кей-поп-группы Seventeen «God Of Music» — вместо нее показали черно-белое изображение. В интернете предположили, что канал опасается новых штрафов за «ЛГБТ-пропаганду». Подписывайтесь на Афишу Daily 🙃
Что-то вот этот пост уже и не выглядит таким уж нереалистичным
Telegram
Блог*
⚡️«Может сойти за пропаганду». Российским окулистам запретили упоминать радужку
😁5
#prog #rust хайлайты:
▪️На реализациях метода
▪️Парсер теперь восстанавливается от ключевых слов перед fn с дубликатами или в неправильном порядке. (для справки, порядок
▪️Компилятор теперь предупреждает при использование нестабильной фичи через флаг
▪️Стабилизировали
▪️Как я рассказывал, в модуле
▪️В настоящий момент Rust поддерживает атрибуты на item-ах, но не на отдельных выражениях. В частности, в Rust нельзя непосредственно навесить пару атрибутов
▪️Компилятор теперь предупреждает о неиспользуемых
▪️Если выражение с оператором сравнения не компилируется из-за того, что типы разные за вычетом ссылки с одной стороны, то компилятор теперь предлагает разыменовать ссылку вместо взятия ссылки для другого аргумента. Пример:
До:
▪️На реализациях метода
Debug::fmt
, сгенерированных derive-макросом, теперь добавляется #[inline]. Суммарно это привело к меньшему времени компиляции (!) на громадном количестве компиляторных бенчмарков. Подробнее в разборе (ищите Emit #[inline] on derive(Debug)
).▪️Парсер теперь восстанавливается от ключевых слов перед fn с дубликатами или в неправильном порядке. (для справки, порядок
pub
, default
, const
, async
, unsafe
, extern
)▪️Компилятор теперь предупреждает при использование нестабильной фичи через флаг
-Ctarget-feature
. Да, раньше не предупреждал.▪️Стабилизировали
Option::inspect
и Result::{inspect, inspect_err}
:impl Option<T> {
pub fn inspect<F: FnOnce(&T)>(self, f: F) -> Self;
}
impl Result<T, E> {
pub fn inspect<F: FnOnce(&T)>(self, f: F) -> Self;
pub fn inspect_err<F: FnOnce(&E)>(self, f: F) -> Self;
}
▪️Как я рассказывал, в модуле
fmt
стандартной библиотеки есть хелперы DebugList
и прочие для облегчения кастомной реализации Debug
. Их недостатком можно назвать тот факт, что методы для форматирования очередной порции структуры (например, DebugList::entry) принимают на вход значение, реализующее Debug
, и вызывают на нём метод Debug::fmt
. Как рассказывается в мотивации, это на практике приводило к использованию одноразовых типов, необходимых лишь ради их реализации Debug
. Теперь к этим типам добавили методы, которые форматируют очередную порцию при помощи переданной аргументом функции, принимающей на вход ссылку на fmt::Formatter
.▪️В настоящий момент Rust поддерживает атрибуты на item-ах, но не на отдельных выражениях. В частности, в Rust нельзя непосредственно навесить пару атрибутов
#[cfg(..)]
на два выражения в конце функции (которые предназначены для возврата значения из функции). Попытка записать такой код приводила к не самой полезной ошибке Unexpected token: expected
;
, found #
. Esteban Kuber внёс изменение в парсер, которое распознаёт эту ситуацию и предлагает обходной путь: добавление точки с запятой или оборачивание выражений в фигурные скобки.▪️Компилятор теперь предупреждает о неиспользуемых
Pin<P>
, где на P
есть атрибут #[must_use]
. В частности, теперь компилятор предупреждает о коде вроде такого (пример из PR):fn foo() -> Pin<Box<dyn Future<Output = i32>>> {
Box::pin(async { 42 })
}
// call `foo`, but forget to await the result
foo();
▪️Если выражение с оператором сравнения не компилируется из-за того, что типы разные за вычетом ссылки с одной стороны, то компилятор теперь предлагает разыменовать ссылку вместо взятия ссылки для другого аргумента. Пример:
fn main() {
let i: &i64 = &1;
if i < 0 {}
}
До:
После:
error[E0308]: mismatched types
--> src/main.rs:3:12
|
3 | if i < 0 {}
| ^ expected `&i64`, found integer
|
help: consider borrowing here
|
3 | if i < &0 {}
| +
▪️Как я уже писал, компилятор предлагает вызвать конструктор при попытке сконструировать структуру с приватными полями. Реализовано это было довольно костыльно: компилятор просто искал метод на типе с именем
error[E0308]: mismatched types
--> src/main.rs:3:12
|
3 | if i < 0 {}
| ^ expected `&i64`, found integer
|
help: consider dereferencing the borrow
|
3 | if *i < 0 {}
| +
new
и предлагал его, вообще не смотря на типы. Теперь компилятор предлагает все методы, которые возвращают Self. Кусочек из тестов:👍2❤1
error: cannot construct `HashMap<_, _, _>` with struct literal syntax due to private fieldsИзменение важно также и тем, что помогает новичкам узнавать о доступных конструкторах без ручного чтения документации.
--> $DIR/suggest-box-new.rs:16:13
|
LL | let _ = std::collections::HashMap {};
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: ... and other private field `base` that was not provided
help: you might have meant to use an associated function to build this type
|
LL | let _ = std::collections::HashMap::new();
| ~~~~~~~
LL | let _ = std::collections::HashMap::with_capacity(_);
| ~~~~~~~~~~~~~~~~~~
LL | let _ = std::collections::HashMap::with_hasher(_);
| ~~~~~~~~~~~~~~~~
LL | let _ = std::collections::HashMap::with_capacity_and_hasher(_, _);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
help: consider using the `Default` trait
|
LL | let _ = <std::collections::HashMap as std::default::Default>::default();
| +
▪️В
fmt
исправлен баг с некорректным округлением при использовании экспоненциальной нотации.▪️В Clippy внесли несколько новых линтов. Отмечу только парочку:
🔸Вы знали, что один и тот же тип не может реализовывать одновременно
Borrow<str>
, Borrow<[u8]>
и Hash
? Теперь знаете. А новый линт impl_hash_borrow_with_str_and_bytes объяснит почему: str
и [u8]
хешируются по разному.🔸
Path::join
замещает путь целиком, если добавляемый путь является абсолютным. Это документированное, но неочевидное поведение. Линт join_absolute_paths предупреждает о случаях, когда это происходит безусловно — почти наверняка это не то, чего хочет программист.GitHub
Emit #[inline] on derive(Debug) by saethlin · Pull Request #117727 · rust-lang/rust
While working on #116583 I noticed that the cross_crate_inlinable query identifies a lot of derived Debug impls as a MIR body that's little more than a call, which suggests they may be a go...
❤5👍2
#prog
Отдельное изменение в стандартной библиотеке #rust заслуживает отдельного упоминания — не потому, что оно затрагивает многих пользователей, но потому, что изменение может привести к трудно диагностируемым ошибкам. Именно, после этого PR методы
На всякий случай: если вы просто хотите получить уникальную ссылку на содержимое
Отдельное изменение в стандартной библиотеке #rust заслуживает отдельного упоминания — не потому, что оно затрагивает многих пользователей, но потому, что изменение может привести к трудно диагностируемым ошибкам. Именно, после этого PR методы
strong_count
и weak_count
на Arc
и sync::Weak
загружают соответствующие счётчики с порядком Relaxed вместо Acquire. Если вы использовали эти методы в каком-то сложном lockless коде, то вам может понадобиться вставить Acquire memory fence.На всякий случай: если вы просто хотите получить уникальную ссылку на содержимое
Arc
, то вам лучше использовать методы Arc::get_mut и Arc::make_mut. Код видаif Arc::strong_count(&arc_ptr) == 1 {практически никогда не является верным из-за возможных гонок.
let ptr = unsafe { &mut *(Arc::as_ptr(&arc_ptr) as *mut _) };
// ...
}
GitHub
Weaken needlessly restrictive orderings on Arc::*_count by SUPERCILEX · Pull Request #115546 · rust-lang/rust
Follow up to #95183 from this zulip: https://rust-lang.zulipchat.com/#narrow/stream/219381-t-libs/topic/Why.20does.20Arc.3A.3Astrong_count.20use.20Acquire.20instead.20of.20Relaxed.3F/near/386213850...
👍3
Блог*
#prog #rust Кажется, что такой код должен работать: trait Super {} trait Sub: Super {} fn upcast(x: &dyn Sub) -> &dyn Super { x as &dyn Super } Но нет, он валится с ошибкой. Такой, казалось бы, очевидный функционал был описан в RFC от 2013 (!) года…
#prog #rust
Апкаст трейтов стабилизировали буквально вчера!
Из наиболее насущного вопроса: да, апкаст сырого указателя на
Апкаст трейтов стабилизировали буквально вчера!
Из наиболее насущного вопроса: да, апкаст сырого указателя на
dyn Trait
с невалидной vtable является UB.GitHub
Stabilize RFC3324 dyn upcasting coercion by Urgau · Pull Request #118133 · rust-lang/rust
This PR stabilize the trait_upcasting feature, aka rust-lang/rfcs#3324.
The FCP was completed here: #65991 (comment).
And also remove the deref_into_dyn_supertrait lint which is now handled by dyn ...
The FCP was completed here: #65991 (comment).
And also remove the deref_into_dyn_supertrait lint which is now handled by dyn ...
❤1👍1