Size: a a a

2020 September 01
Блог*
#prog #c #article

Реализация простых кооперативных потоков на C с использованием setjmp/longjmp и небольшого количества ассемблера.

Оригинал
Перевод на Хабре
источник
Блог*
#prog #rust
источник
Блог*
*Мысли вслух* функция is_sized, проверяющая является ли тип Sized, пишется тривиально:

fn is_sized<T: ?Sized>() -> bool {
   mem::size_of::<*const T>() == mem::size_of::<usize>()
}
источник
Блог*
#prog #rust

cargo-llvm-lines — инструмент для подсчёта количества строк LLVM IR, сгенерированных для каждой функции в программе, с учётом процентного вклада и дубликатов. Автор — ожидаемо Толян dtolnay
источник
Блог*
dereference_pointer_there
#prog #rust

cargo-llvm-lines — инструмент для подсчёта количества строк LLVM IR, сгенерированных для каждой функции в программе, с учётом процентного вклада и дубликатов. Автор — ожидаемо Толян dtolnay
Этот инструмент привёл в итоге к созданию этого PR, который вынес не зависящую от типа часть обобщённого кода в отдельную функцию и таким образом привёл к заметному улучшению производительности компиляции
источник
Блог*
#prog #csharp

Не, ну это смешно, конечно.

https://twitter.com/badamczewski01/status/1300698226136412160
источник
2020 September 02
Блог*
#prog #meme
источник
Блог*
источник
Блог*
#prog #rust #quotes #трудовыебудни

— Раст про fearless-concurrency, не про comfy-concurrency
источник
2020 September 03
Блог*
👨📅🔄  ➡️  3️⃣🍁
источник
Блог*
dereference_pointer_there
#моё #prog #rust

В крейте time есть структура Date с методом format, который возвращает String со датой, отформатированной согласно переданному формату. Выглядит это примерно так (пример из документации):

assert_eq!(date!(2019-01-02).format("%Y-%m-%d"), "2019-01-02");

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

Как примерно должен выглядеть код? Нам нужно абстрагироваться от конкретных типов по операции "отформатируй сюда дату", чтобы из элементарных форматировщиков можно было собрать составной. В самой операции нам, очевидно, требуются: сам форматировщик, дата и буфер, куда будут записываться данные. Мы не хотим возвращать строку непосредственно, потому что это при объединении привело бы ко множеству ненужных мелких аллокаций. Также мы не хотим, чтобы форматировщики могли удалять из буфера данные, поэтому мы сделаем обёртку над строкой с более узким интерфейсом:

use std::fmt;

#[derive(Default)]
pub struct Buf {
   inner: String,
}

impl Buf {
   pub fn new() -> Self {
       Self::default()
   }
   
   pub fn append(&mut self, s: &str) {
       self.inner += s;
   }
   
   // Этот метод позволит нам использовать макрос `write!` на `Buf`.
   // Он позволяет не безусловно выделять новую строку,
   // а использовать место в уже имеющейся
   pub fn write_fmt(&mut self, args: fmt::Arguments) -> fmt::Result {
       self.inner.write_fmt(args)
   }
}

Сам общий интерфейс форматировщиков:

use std::fmt;
use time::Date;

pub trait FormatDate {
   fn format_date(&self, b: &mut Buf, d: Date) -> fmt::Result;
}

(проблем с тем, чтобы принимать Date по значению, нет, потому что это Copy-тип).

Какие могут быть форматировщики? Очевидно, вы их число должна входить строка, чтобы можно было вставлять в формат разделители между компонентами даты. Напишем реализацию трейта:

impl FormatDate for &'_ str {
   fn format_date(&self, b: &mut Buf, _: Date) -> fmt::Result {
       b.append(self);
       Ok(())
   }
}

Теперь напишем реализацию для, скажем, дня даты:

pub struct DayOf;

impl FormatDate for DayOf {
   fn format_date(&self, b: &mut Buf, d: Date) -> fmt::Result {
       write!(b, "{:02}", d.day())
   }
}

Формат "{:02}" означает, что для печати дня отведено два места, и если в номере дня всего одна цифра, то вывод будет дополнен слева нулями. Форматировщики для номера месяца и года пишутся аналогично, поэтому не будем подробнее на этом останавливаться.
#prog #rust #article

Аналогичный подход для создания аналога println/printf с проверками во время компиляции.

willcrichton.net/notes/type-safe-printf/
источник
Блог*
#prog #rust #embedded #amazingopensource

Исторически одной из проблем на пути использования Rust в встраиваемых устройствах был тот факт, что стандартная машинерия для форматирования сильно раздувает размер результирующего бинарника. Это особенно неприятно в силу того, что стандартная паника использует эту машинерию. Библиотека defmt от Ferrous System нацелена на решение это проблемы: она позволяет использовать форматирование (в том числе отложенное) и паники, сохраняя при этом маленький размер бинарника.
источник
Блог*
dereference_pointer_there
#prog #моё

Сегодня я хотел бы рассказать о возможных способах реализации полиморфизма в языках программирования и о том, какие выгоды и издержки они имеют.  Disclaimer: я не особо шарю, так что могу наговорить глупостей.

Полиморфизм — это свойство кода обрабатывать данные разных типов единым образом. Замечательная вещь, не так ли? К сожалению, истинно полиморфного кода мало: если полиморфная функция делает что-то помимо тасовки аргументов, рано или поздно нужно будет выполнить операцию, специфичную для конкретного типа. Для того, чтобы исполнить полиморфный код, нужно каким-то образом передать в него эти функции для конкретного типа. О том, как это можно сделать и на какие компромиссы при этом приходится идти, я сегодня и расскажу.

1. ad hoc полиморфизм (aka полиморфизм для бедных). В этом варианте мы не прилагаем никаких специальных усилий к обеспечению полиморфизма: достаточно разрешить иметь в языке перегрузку функций. При подстановке конкретного типа в обобщённый код компилятор ищет перегрузки с соответствующими типами и вставляет нужные вызовы.

Достоинства:
* Легко реализовать.

Недостатки:
* Наличие перегрузки сразу ставит вопрос о том, какая перегрузка более специфичная, что усложняет рассуждения о коде.
* Требует наличия в языке механизма написания кода с отложенной проверкой типов (макросы в C и шаблоны в C++ под это определение в данном контексте подходят).
* Непосредственное следствие из предыдущего пункта: ошибки несоответствия типов ловятся по месту использования, а не по месту определения, что затрудняет отладку кода и написание высокообобщённого кода ("У меня не сошлись типы потому, что я неправильно вызвал функцию или потому. что сама функция определена ошибочно?").
* Сам факт обобщённости затруднительно переносить между границами отдельных единиц компиляции (читай, фиг вам, а не динамическая линковка).

Резюмируя: использовать имеет смысл тогда, когда нет других альтернатив.
#prog #article

Разбор различных способов реализации полиморфизма, более обстоятельный и глубокий, чем у меня. Заодно показываются модели, которые пока что не получили должной реализации.

thume.ca/2019/07/14/a-tour-of-metaprogramming-models-for-generics/
источник
Блог*
#prog

Мысли по поводу лучшего стабильного ABI, чем сишный. В виде треда в твиттере, сорян, в более удобоваримом формате нет.

twitter.com/bitshiftmask/status/1286411475658178561
источник
Блог*
#prog #article

"So, although I don’t have any data to back this up, I strongly suspect that experienced programmers rarely spend time posting about how they program because they just don’t think it’s anything special.
But they should! It may not be special, but it’s necessary, and if good programmers don’t start posting about how to do good programming, we’ll never get out of this nasty place where everyone has to go through six years of writing horrible object-oriented programs before they realize they’re wasting their time."

caseymuratori.com/blog_0015
источник
2020 September 04
Блог*
#prog #cpp #meme
источник
Блог*
источник
Блог*
источник
Блог*
#prog #article

Дежурное напоминание, что S в IoT означает Security.

habr.com/ru/company/ruvds/blog/517638/
источник
Блог*
#prog #rust #article

Буквально мои мысли читает. TL;DR: если у вас есть Foo и FooBuilder, добавьте метод Foo::builder.

matklad.github.io/2020/08/12/who-builds-the-builder.html
источник