[О блоге]
[наверх]
[пред]
[2026-01-14 14:35:14+03:00]
[e6e92d2c9be2788072caa9bf30ae79bdb7664882]
Темы: [c][rust][systemd]
Rust в Linux: разница идеологий
https://felipec.wordpress.com/2025/02/13/rust-not-for-linux/
https://rust-unofficial.github.io/too-many-lists/
Автор статьи рассуждает о Rust в Linux: что это, в первую очередь,
спор идеологий. Автор трогал Rust и заявляется что в нём нельзя сделать
связанные списки. А в Linux их 10k+. Если Rust нацеливается заменить Си,
то он должен мочь выполнять те же самые задачи. Rust люди постоянно
любят говорить другим что им надо делать, как что-либо надо делать. И
они говорят о том, что просто не надо использовать связанные списки. Вот
так вот просто.
Ещё приводит пример простой структуры на Си и Rust:
C:
struct person {
char name[50];
int age;
struct person *boss;
};
struct person john = { .name = "John Doe", .age = 25 };
Rust:
struct Person<'a> {
name: &'a str,
age: u32,
boss: Option<&'a Person<'a>>,
}
let john = Person { name: "John Doe", age: 25, boss: None };
причём в Си это же самое определение структуры может использоваться и
для переменных как в стэке, так и куче. В Rust же нужно другую структуру
написать для использования в куче.
Си-шники обычно предлагают какое-то рабочее решение, которое после
оценок, если годится и хорошее, начинает внедряться в Linux. Типа снизу
вверх внедрение идёт. Rust хотят услышать слово подтверждения от Линуса,
и только после этого начинать вносить правки в ядро. Типа сверху вниз
внедрение. Последователи Rust ведут себя точно также как и всякие борцы
за "they" вместо "she", "main" вместо "master" (думаю, что можно и не
сомневаться в том, что эти множества борцов сильно пересекаются между
собой) -- агрессивно и активно продавливают (включая угрозы, шантаж) эти
изменения в конечный софт/инструменты, вместо того, чтобы люди плавно
самостоятельно понимали, принимали и использовали что-то более корректно.
Касательно связанных списков в Rust: прочитал статью на которую автор
ссылается. Начало мне уже "понравилось": чтобы реализовать список, вам
понадобится изучить следующее:
* The following pointer types: &, &mut, Box, Rc, Arc, *const, *mut, NonNull(?)
* Ownership, borrowing, inherited mutability, interior mutability, Copy
* All The Keywords: struct, enum, fn, pub, impl, use, ...
* Pattern matching, generics, destructors
* Testing, installing new toolchains, using miri
* Unsafe Rust: raw pointers, aliasing, stacked borrows, UnsafeCell, variance
[оставить комментарий]
- комментарий 0:
From: kmeaw
Date: 2026-01-14 22:04:31Z
На мой взгляд, очень сомнительная статья.
Аргументы Линуса против C++ в Git, на которые она ссылается, мне гораздо более
понятны - он считает, что C хорош тем, что принуждает людей быть более
дисциплинированными, больше внимания уделять низкоуровневым аспектам, а идиоты
просто не смогут испортить его код.
Тут же автор утверждает что-то странное. В Rust предложенная структура может
быть легко использована как на стеке, так и на куче:
let mut person_heap = Box::new(Person { name: "John Doe", age: 25, boss: None });
dbg!(&person_heap);
Причём используя очень похожий синтаксис для записи:
*person_heap = Person { name: "Jane Doe", age: 19, boss: None };
dbg!(&person_heap);
Чего нельзя сказать про его же пример на C:
struct person *person_heap = malloc(sizeof(struct person));
static const struct person john_static = { .name = "John Doe", .age = 25 }; /* (1) */
*person_heap = john_static; /* (2) */
где я не знаю способа записать (1) и (2) в одну строку, как в исходном примере.
Потом он ссылается на учебное пособие "Learn Rust With Entirely Too Many Linked
Lists", цель которого - показать, как работают разные механизмы в языке, как
устроена стандартная библиотека, и объяснить, какие у разных подходов пределы
применимости.
> they say two things 1) “yes you can” (untrue)
Конечно же, сишный список можно практически дословно переписать на Rust с
помощью raw pointers, причём с полноценным контролем типов и без засорения
окружения негигиеничными макросами препроцессора.
#[derive(Debug, Default)]
struct ListHead<T> {
next: *mut ListHead<T>,
prev: *mut ListHead<T>,
}
#[derive(Debug, Default)]
struct Inode {
list: ListHead<Self>,
refcount: u32,
}
И потом ещё написать немного unsafe кода, чтобы описать итератор (без каких-либо
дополнительных накладных расходов, его sizeof будет равен ширине указателя),
после чего по такому списку можно будет шагать обычным for inode in i.list.iter()
Автору предлагают так не делать, и использовать более безопасные конструкции.
> The moment somebody tells me “you shouldn’t want that”, I stop using their
> software. Period.
Вместо того, чтобы осознать причины подхода и, возможно, последовать
рекомендации. Или нет, unsafe в языке всё ещё есть, компилятор даёт все
возможности пользователю сказать, что последний лучше знает, как надо.
Преимущество такого подхода в том, что можно постепенно делать инварианты всё
более сильными. Хорошая система типов может быть достаточно выразительна для
того, чтобы сделать все неверные значения типа невыразимыми при помощи
безопасных языковых конструкций.
А недостаток в потенциальной ситуации, что код придётся рефакторить в
самый неподходящий для этого момент, когда условия задачи поменяются.
- комментарий 1:
From: Sergey Matveev
Date: 2026-01-15 09:28:27Z
*** kmeaw@kmeaw.com [2026-01-14 22:06]:
>На мой взгляд, очень сомнительная статья.
Да её нормально так критикуют уже в первом комментарии (на странице
самой статьи) :-)
>Аргументы Линуса против C++ в Git, на которые она ссылается, мне гораздо более
>понятны - он считает, что C хорош тем, что принуждает людей быть более
>дисциплинированными, больше внимания уделять низкоуровневым аспектам, а идиоты
>просто не смогут испортить его код.
Это могу понять, да.
Про Rust особо ничего не смогу прокомментировать: я его не смог осилить
даже на простой задаче, и уже забыл всё что успел потрогать. C++ хотя бы
приходится читать/видеть и иногда чуточку править.