Size: a a a

2021 December 11
Блог*
#prog #rust #amazingopensource

diffstatic — инструмент для определения разницы между исходниками, который понимает синтаксис и потому отображает более адекватный дифф (см. пример).

(thanks @rustawesome)
источник
2021 December 12
Блог*
С учётом современных реалий фразу "она краше" стоит понимать, как "у неё выше потенциал стать чьим-то крашем".
источник
Блог*
Две недели до Нового года. Думаю, уже можно менять аву
источник
Блог*
Тем временем я умудрился пропустить вторую годовщину собственного блога ._.
источник
Блог*
Хоть const дженерики в расте уже некоторое время можно использовать на стейбле, они достаточно сильно ограниченны в возможностях. По сути стабилизировали пока только MVP — feature(min_const_generics).

lcnr написал wrap-up на тему того, что произошло с const дженериками за год. TL;DR:
— ✨ стабилизация feature(const_generics_defaults)
— всё сложно, feature(generic_const_exprs) забагованная
— возможно в следующем году будет feature(min_generic_const_exprs)
источник
Блог*
#prog

Данила опять рассказывает интересное. В этот раз — про баг в индексе Яндекса
Telegram
Experimental chill
Одна из самых главных методик для меня, когда я готовлюсь к дизайн интервью, я читаю Post-mortems. Нет ничего приятнее, захватывающее и полезнее, чем смотреть как падают системы, с грохотом, по разным причинам. Они читаются как страшилки, а то и хорошие сказки на ночь. Хорошая коллекция есть у Dan Luu (https://github.com/danluu/post-mortems). Один из моих любимых это

Pentium division bug

Процессор неправильно делил очень редкие числа. Баг был в том, что часть таблицы для деления неправильно подгружалась в Programmable Lookup Array. Тестирование из-за симметричности таблицы было сделано только на первой её половине, а неправильные значения подгружались только во второй.



Но, наверное, хочется поделиться своей, одной из самых запоминающихся историй, когда я работал в Яндекс.Поиске (публикую с разрешения своего бывшего тех лида)

Я помню возвращался из универа, чтобы вечером поработать, позакрывать баги и пописать немного кода. Я одним глазком решил посмотреть на состояние поиска, в целом всё было стабильно…
источник
2021 December 13
Блог*
#prog #rust #article

A Lightweight Formalism for Reference Lifetimes and Borrowing in Rust

Rust is a relatively new programming language which has gained significant traction since its v1.0 release in 2015. Rust aims to be a systems language that competes with C/C++. A claimed advantage of Rust is a strong focus on memory safety without garbage collection. This is primarily achieved through two concepts, namely reference lifetimes and borrowing. Both of these are well known ideas stemming from the literature on region-based memory management and linearity / uniqueness. Rust brings both of these ideas together to form a coherent programming model. Furthermore, Rust has a strong focus on stack-allocated data and, like C/C++ but unlike Java, permits references to local variables.

Type checking in Rust can be viewed as a two-phase process: firstly, a traditional type checker operates in a flow-insensitive fashion; secondly, a borrow checker enforces an ownership invariant using a flow-sensitive analysis. In this paper, we present a lightweight formalism which captures these two phases using a flow-sensitive type system that enforces “type and borrow safety”. In particular, programs which are type and borrow safe will not attempt to dereference dangling pointers. Our calculus core captures many aspects of Rust, including copy- and move-semantics, mutable borrowing, reborrowing, partial moves, and lifetimes. In particular, it remains sufficiently lightweight to be easily digested and understood and, we argue, still captures the salient aspects of reference lifetimes and borrowing. Furthermore, extensions to the core can easily add more complex features (e.g. control-flow, tuples, method invocation, etc). We provide a soundness proof to verify our key claims of the calculus. We also provide a reference implementation in Java with which we have model checked our calculus using over 500 billion input programs. We have also fuzz tested the Rust compiler using our calculus against 2 billion programs and, to date, found one confirmed compiler bug and several other possible issues.

Рекомендую обратить внимание на секцию "Related work", там много интересного
источник
Блог*
#prog #rust #article

Fuzzing the Rust Typechecker Using CLP

И сразу существенная ложка дёгтя: статья из 2015 года, а потому разбирается с Rust 1.0-alpha. Тем не менее, читать интересно из-за общего похода.

Language fuzzing is a bug-finding technique for testing compilers and interpreters; its effectiveness depends upon the ability to automatically generate valid programs in the language under test. Despite the proven success of language fuzzing, there is a severe lack of tool support for fuzzing statically-typed languages with advanced type systems because existing fuzzing techniques cannot effectively and automatically generate well-typed programs that use sophisticated types. In this work we describe how to automatically generate well-typed programs that use sophisticated type systems by phrasing the problem of well-typed program generation in terms of Constraint Logic Programming (CLP). In addition, we describe how to specifically target the typechecker implementation for testing, unlike all existing work which ignores the typechecker. We focus on typechecker precision bugs, soundness bugs, and consistency bugs. We apply our techniques to Rust, a complex, industrial-strength language with a sophisticated type system.
источник
Блог*
#prog #rust

Если вам было интересно, почему Rust запрещает иметь неиспользуемые тИповые параметры, то вот вам RFC, который это ввёл, с мотивацией
источник
Блог*
Самая большая ложь, которую нам внушает мир — это то, что взрослые существуют.

Их нет, есть только выросшие дети.
источник
2021 December 14
Блог*
#prog #java #kotlin #scala

Well-Typed Programs Can Go Wrong: A Study of Typing-Related Bugs in JVM Compilers

В этой статье авторы отмечают, что усилия в тестировании компиляторов в основном направлены на отлов некорректных оптимизаций, при этом мало кто целенаправленно занимается отловом багов в фронтендах. Авторы выбрали 320 багов, связанных с типами, среди багов компиляторов Java, Scala, Kotlin и Groovy, и разобрались с тем, как они себя проявляют, какие фичи языка используют и как они фиксятся. Вооружившись этим знанием, они написали генератор тестовых программ, который смог найти 28 багов, из них 12 были новыми (то есть для них исправлений не было).

А ещё авторы отличились тем, что нормально выложили материалы по исследованию.
источник
Блог*
#prog #rust #article

Небольшая заметка о различиях между ящиками крейтами и пакетами в Cargo/crates.io
источник
2021 December 15
Блог*
#prog #rust #article

Stack-safety for free?

TL;DR:

//рекурсивная функция, использующая системный стек
fn triangular(n: u64) -> u64 {
   if n == 0 {
       0
   } else {
       n + triangular(n - 1)
   }
}

⬇️

//использует стек на куче
fn triangular_safe(n: u64) -> u64 {
   trampoline(|n| move |_| {
       if n == 0 {
           0
       } else {
           n + yield (n - 1)
       }
   })(n)
}

Автор этой статьи столкнулся со случаем, когда ему потребовалось переделывать рекурсивное решение на итеративное из-за переполнения стека, и ему не понравилось, что он руками делает то, что вполне мог бы сделать компьютер автоматически. Немного подумав, он смог разработать решение, которое бы использовало генераторы (пока что всё ещё только на nightly) и которое требовало бы для работы достаточно прямолинейную трансформацию, чтобы её можно было сделать процедурными макросами.

Пока что решение ограничено в том плане, что оно не работает с мутабельными ссылками и взаимно-рекурсивными вызовами, но автор обещает рассказать в будущем о том, как можно обойти эти ограничения.

Также автор отдельно отмечает, что у него было чувство, что он изобрёл велосипед, но он не смог найти prior art для этого.
источник
Блог*
источник
Блог*
В копилку к break rust.
источник
2021 December 16
Блог*
источник
Блог*
Эм... #successstory?

Источник
источник
2021 December 17
Блог*
Если вы когда-нибудь почувствуете себя глупым, то вспомните, что я разок опоздал на встречу с человеком из-за того, что перепутал станции Октябрьская и Октябрьское поле.
источник
Блог*
источник
2021 December 18
Блог*
#rust

9 companies using Rust in production.

О некоторых из них я уже рассказывал, но в любом случае иметь сборник лишним не будет.
источник