Блог*
#prog #rust #article  Exploring the Rust compiler benchmark suite  Статья о том, как устроен бенчмарк для измерения производительности компиляции rustc и о том, как он интегрирован с общим процессом разработки
#prog #rust #article
Adding runtime benchmarks to the Rust compiler benchmark suite
Реализация заняла почти год (и семь лет с момента открытия issue на бенчмарки). Причина? Зашкаливающее количество yak shaving.
  
  Adding runtime benchmarks to the Rust compiler benchmark suite
Реализация заняла почти год (и семь лет с момента открытия issue на бенчмарки). Причина? Зашкаливающее количество yak shaving.
Kobzol’s blog
  
  Adding runtime benchmarks to the Rust compiler benchmark suite
  This post describes the design and implementation of a runtime benchmark suite for measuring the performance of Rust programs, which was recently added into the Rust compiler suite. I have recently blogged about how the whole benchmark suite works, so feel…
👍1
  #prog #rust
TIL что у типов Ipv4Addr/Ipv6Addr есть ассоциированные константы LOCALHOST и UNSPECIFIED, а у
  
  TIL что у типов Ipv4Addr/Ipv6Addr есть ассоциированные константы LOCALHOST и UNSPECIFIED, а у
Ipv4Addr есть ещё и BROADCAST.doc.rust-lang.org
  
  Ipv4Addr in std::net - Rust
  An IPv4 address.
❤3
  
  Блог*
#prog  Tini — init-процесс, который только завершает зомби-процессы и корректно пробрасывает сигналы — и больше ничего не делает. Используется главным образом внутри Docker.
#prog #article
Introducing dumb-init, an init system for Docker containers — рассказывает о том, для чего в принципе нужны dumb-init и tini.
TL;DR: если вы не спавните init-процесс как первый процесс внутри контейнера, то контейнер почти наверняка работает неправильно касательно реагирования на сигналы и завершения зомби-процессов.
  
  Introducing dumb-init, an init system for Docker containers — рассказывает о том, для чего в принципе нужны dumb-init и tini.
TL;DR: если вы не спавните init-процесс как первый процесс внутри контейнера, то контейнер почти наверняка работает неправильно касательно реагирования на сигналы и завершения зомби-процессов.
Yelp
  
  Introducing dumb-init, an init system for Docker containers
  Introducing dumb-init, an init system for Docker containers Chris K., Software Engineer Jan 6, 2016 At Yelp we use Docker containers everywhere: we run tests in them, build tools around...
  #prog #rust
Diagnostic namespace
TL;DR: в nightly теперь есть (за
  
  Diagnostic namespace
TL;DR: в nightly теперь есть (за
#[feature], разумеется) атрибут #[diagnostic::on_unimplemented], который позволяет прицепить свою дополнительную информацию к ошибке о том, что тип не реализует трейт. Этот атрибут уже используется в axum и diesel.Weiznich's Blog
  
  Diagnostic namespace
  Improving rust compiler error messages for trait heavy crates by changing the language
🔥7
  Если я выгляжу страшно красиво, это считается за хеллоуинский костюм?
If I look drop-dead gorgeous, does it count as a Halloween costume?
If I look drop-dead gorgeous, does it count as a Halloween costume?
😁10
  
  Блог*
#prog #моё  Теперь у меня есть законный повод затащить в зависимости по работе мою репу
Наконец-то смержили. А всего-то пришлось в дискорде tracing попинговать.
  
  GitHub
  
  Relax restrictions on writer for `tracing_appender::non_blocking::NonBlocking` by AnthonyMikh · Pull Request #2607 · tokio-rs/tracing
  Motivation
NonBlocking from tracing-appender wraps a writer and requires that writer to implement Sync (among other bounds). However it is not clear why this bound is necessary in first place: this...
NonBlocking from tracing-appender wraps a writer and requires that writer to implement Sync (among other bounds). However it is not clear why this bound is necessary in first place: this...
👍4
  #prog #cpp
От Chandler Carruth есть доклад "Garbage In, Garbage Out: Arguing about Undefined Behavior with nasal demons". В нём он рассказывает о конструктивных подходах к обсуждению UB и приводит примеры, как UB может сказаться на генерируемом коде.
В частности, на 39:19 он показывает пример со следующим кодом:
Переполнение же знаковых чисел является неопределённым поведением, и потому компилятор вправе полагаться на то, что переполнения не будет и не использовать модулярную арифметику. Чендлер прикладывает ассемблерный листинг для этих двух блоков кода, где индексы используются напрямую в адресном режиме
Из зала было справедливое замечание, что в данной ситуации правильнее было бы использовать
Звучит складно и вроде как вполне резонный аргумент в пользу UB для переполнения на интах. Так что я решил увидеть эффект своими глазами на godbolt.
И... Я его не увидел.
Более того, я решил написать вариант, где индексы
Код на godbolt
Эффект соблюдается и при увеличении числа блоков до шести.
В связи с этим у меня два вопроса:
1. Почему компилятор не эксплуатирует UB, связанное с переполнением знаковых чисел, и всё равно использует модулярную арифметику? (это вопрос скорее к GCC, потому что clang успешно проводит эту оптимизацию).
2. Почему и GCC, и clang не используют модулярную арифметику для
  
  От Chandler Carruth есть доклад "Garbage In, Garbage Out: Arguing about Undefined Behavior with nasal demons". В нём он рассказывает о конструктивных подходах к обсуждению UB и приводит примеры, как UB может сказаться на генерируемом коде.
В частности, на 39:19 он показывает пример со следующим кодом:
bool compare(uint32_t i1, uint32_t i2,
             uint8_t* block) {
    uint8_t c1, c2;
    /* 1 */
    c1 = block[i1]; c2 = block[i2];
    if (c1 != c2) return c1 > c2;
    i1++; i2++;
    /* 2 */
    c1 = block[i1]; c2 = block[i2];
    if (c1 != c2) return c1 > c2;
    i1++; i2++;
    ...
Код генерировался под 64-битную платформу. По словам Чендлера, проблема заключается в том, что индексы имеют беззнаковый тип. В C и C++ переполнение беззнаковых чисел определено и имеет модулярную семантику. Это сказывается на генерируемом коде: во втором блоке сначала происходит вычисление нужного смещения через lea — которое приведёт индекс к нулю при переполнении — и только потом индекс используется в mov для доступа к памяти. Переполнение же знаковых чисел является неопределённым поведением, и потому компилятор вправе полагаться на то, что переполнения не будет и не использовать модулярную арифметику. Чендлер прикладывает ассемблерный листинг для этих двух блоков кода, где индексы используются напрямую в адресном режиме
mov и не проходят через модулярную арифметику.Из зала было справедливое замечание, что в данной ситуации правильнее было бы использовать
size_t. Чендлер на это ответил довольно развёрнуто, но одним из пунктов в его ответе было то, что size_t — беззнаковый тип и потому страдает от той же пессимизации кода.Звучит складно и вроде как вполне резонный аргумент в пользу UB для переполнения на интах. Так что я решил увидеть эффект своими глазами на godbolt.
И... Я его не увидел.
Более того, я решил написать вариант, где индексы
i1 и i2 имели тип size_t. И в этом якобы неэффективном варианте модулярной арифметики не было.Код на godbolt
Эффект соблюдается и при увеличении числа блоков до шести.
В связи с этим у меня два вопроса:
1. Почему компилятор не эксплуатирует UB, связанное с переполнением знаковых чисел, и всё равно использует модулярную арифметику? (это вопрос скорее к GCC, потому что clang успешно проводит эту оптимизацию).
2. Почему и GCC, и clang не используют модулярную арифметику для
size_t, не смотря на то, что это, вообще говоря, смена наблюдаемого поведения? У меня есть предположение, что это связано с переполнением указателей, которое тоже является UB (переполнение любой инкрементации означало бы, что читается память по указателю block + SIZE_MAX, а чтение по такому указателю не является валидным, поскольку все объекты в памяти не больше SIZE_MAX по определению и указатель, сформированный таким образом, будет one past end даже самого большого объекта).YouTube
  
  CppCon 2016: Chandler Carruth “Garbage In, Garbage Out: Arguing about Undefined Behavior..."
  https://CppCon.org
—
Presentation Slides, PDFs, Source Code and other presenter materials are available at: https://github.com/cppcon/cppcon2016
—
There has been an overwhelming amount of tension in the programming world over the last year due to something…
—
Presentation Slides, PDFs, Source Code and other presenter materials are available at: https://github.com/cppcon/cppcon2016
—
There has been an overwhelming amount of tension in the programming world over the last year due to something…
🤔3👍1
  Forwarded from Денис Чужой про комедию
  
С раннего утра наблюдаю за тем, как пользователи твиттера советуют человеку книги лучше, чем «Атлант расправил плечи»
👌8😁4❤2👎1🤡1
  
  shitposting 3.0 [+ dragons]
Photo
Ответственно заявляю, что я к воспитанию поколения тиктока не имею отношения
❤6👍4🔥1😁1