Здравствуйте, koenig, Вы писали:
K>не флейма ради, но самообразования для K>что вместо каналов?
На мой взгляд равноценной замены ни каналам ни Карго в C++ нет и не будет. Более-менее похожие вещи на каналы (давай не будем разводить дискуссию про то, что CSP и Actor-ы это не одно и то же?) — библиотеки типа SObjectizer. А карго даже сложнее.
Здравствуйте, kaa.python, Вы писали:
KP>В общем случае они не проблема.
Это о**енно большая и сложная проблема, люди над её решениями и дизайном бъются годами, пишут пейперы. Escape analysis и всё такое. В Rust понятия ownership, borrowing, lifetime management — довольно нетривиальная тема. А тут на тебе, C++-инженерА могут раз-два и в продакшн. Лолище.
KP>Косяки уровня возврата по ссылке локального объекта легко ловятся статическими анализаторами.
Как статический анализатор заглянет в код скомпилированных сторонних библиотек? Или он вообще запретит принимать ссылки на вход? Или он вообще запретит возвращать ссылки из функций?
Foo& forward_ref(Foo& ref)
{
// Код этой функции компилятору недоступен, если он в third-party-библиотеке.return ref;
}
Foo& bar()
{
Foo local;
return forward_ref(local);
}
— это его скорость развития и акцент на сильно не первостепенные фичи в прикладной разработке.
Его проблема в том, что это очень слабый, невыразительный язык. В других, более продвинутых языках вроде Rust некоторые заведомо некорректные вещи непредставимы, большой класс таких вещей. А в C++ и в версии C++20, C++23, C++35 это не изменится, даже если туда добавят модули, рефлексию, ranges, networking, корутины, you name it.
std::vector<int> v { 1729 };
int const& ref = v[0];
std::cout << "ref: " << ref << std::endl; // ref: 1729int count = 0;
for (; ref == 1729; ++count)
v.emplace_back(1);
std::cout << "count: " << count << std::endl; // count: 1
std::cout << "ref: " << ref << std::endl; // ref: -572662307
// Такое не должно быть представимо в языке: ---------^
Здравствуйте, reversecode, Вы писали:
R>преимущество одно, можно наговнокодить и если оно скомпилилось то не упадет R>другими словами в русте сложно отстрелить себе ногу R>а поскольку стреляют себе в ногу чаще новички, то руст получается язык на который можно нанимать новичков за меньшие деньги R>соответственно для бизнеса, попытка решения проблем меньшими затратами
От unsafe упадёт, от пропущенной паники упадёт (а еще есть настройка, при которой паника сразу роняет программу).
C>>>Впрочем, в итоге получилось неплохо — кода там не так много, так что поле для раздолья было не сильно большое. KP>>Я скорее о том, что как ни силюсь не могу найти серьёзных преимуществ Rust перед C++17. Каналы и Карго не тянут на таковые. Думал, может тут пример такого, ан опять нет, очередной пример "поиграть захотелось". C>Если в коде на Rust не использовать unsafe и не прилагать очень существенных усилий с Arc'ами, то код будет безопасным. Т.е. в нём не будет утечек, use-after-free, переполнений и т.д.
Статические анализаторы и C++ дадут тот же эффект, но без необходимости бороться с borrow checker.
C>Сам язык тоже существенно приятнее С++, просто за счёт того, что в Rust'е нет legacy от С.
Как я и думал, Rust используют те, кому поднадоел C/C++ и захотелось чего-то другого, новенького (ну, а придумывание каких-то преимуществ, это то, что психологи называют "рационализация" или по простому самоубеждение, оправдание).
Здравствуйте, vsb, Вы писали:
R>>а поскольку стреляют себе в ногу чаще новички, то руст получается язык на который можно нанимать новичков за меньшие деньги R>>соответственно для бизнеса, попытка решения проблем меньшими затратами
vsb>От unsafe упадёт, от пропущенной паники упадёт (а еще есть настройка, при которой паника сразу роняет программу).
Скорее всего новичок споткнется на кривой обучения и до всего этого просто не дойдет
Здравствуйте, kaa.python, Вы писали:
KP>Я скорее о том, что как ни силюсь не могу найти серьёзных преимуществ Rust перед C++17. Каналы и Карго не тянут на таковые. Думал, может тут пример такого, ан опять нет, очередной пример "поиграть захотелось".
Я как раз в последнее время с rust играюсь. Раньше только чисто теоретически за ним следил,
сейчас попробовал чуть пописать на уровне hello world, очень понравилось
Вообще сильно торчат везде кусочки OCaml'а. Во многом гибрид С++ и OCaml.
Для меня эти кусочки (да даже только один нормальный pattern matching, который
вряд ли в обозримом будущем на C++ появится) вполне за серьезные преимущества идут.
Хотя язык совсем не функциональный при этом.
Здравствуйте, kaa.python, Вы писали:
C>>Если в коде на Rust не использовать unsafe и не прилагать очень существенных усилий с Arc'ами, то код будет безопасным. Т.е. в нём не будет утечек, use-after-free, переполнений и т.д. KP>Так и C++ будет безопасным без голых указателей в обвесе с GSL и санитайзерами. Ну да, немного надо сделать не из коробки, но это же один раз делается
Нет, это надо постоянно писать на специальном диалекте С++ и тщательно за этим следить. В Rust при использовании стандартной библиотеки даётся даже гарантия отсутствия data races.
Здравствуйте, Masterspline, Вы писали:
C>>Если в коде на Rust не использовать unsafe и не прилагать очень существенных усилий с Arc'ами, то код будет безопасным. Т.е. в нём не будет утечек, use-after-free, переполнений и т.д. M>Статические анализаторы и C++ дадут тот же эффект, но без необходимости бороться с borrow checker.
Не дадут, только в самых простых случаях и при доступности для анализатора всего кода.
Здравствуйте, Masterspline, Вы писали:
M>Статические анализаторы и C++ дадут тот же эффект, но без необходимости бороться с borrow checker.
Зачем бороться? Тема-то хорошая, только надо привыкнуть к этом и начать писать немного по другому. BC меня тоже жутко напрягает, ага.
Здравствуйте, kaa.python, Вы писали:
KP>Довольно интересная новость из мира виртуализации: Amazon открыл исходные коды платформы виртуализации Firecracker, которая оказалась написана на Rust. С одной стороны, у Amazon было не так уж и много опций для реализации чего-то похожего: Си да Rust, ну может быть C++, хотя это сомнительно по причине относительно громоздкого рантайма. С другой стороны, это еще одна серьезная компания, которая заинтересовалась языком.
KP>Может кто-то рассказать о своем опыте использования Rust в коммерческих проектах? Я пока что разве несколько стартапов с Rust видел, где он скорее по маркетинговым соображениям использовался, так как есть теория, что найти квалифицированного разработчика на Rust проще чем на C++. На первый взгляд разумная теория...
Здравствуйте, Kernan, Вы писали:
K>Здравствуйте, Masterspline, Вы писали:
M>>Статические анализаторы и C++ дадут тот же эффект, но без необходимости бороться с borrow checker. K>Зачем бороться? Тема-то хорошая, только надо привыкнуть к этом и начать писать немного по другому. BC меня тоже жутко напрягает, ага.
Borrow checker — одна из немногих причин, по которой я раст никогда не восприму как язык для работы. Я хочу дело делать, а не доказывать компилятору что-то.
Здравствуйте, MT-Wizard, Вы писали:
MW>Borrow checker — одна из немногих причин, по которой я раст никогда не восприму как язык для работы. Я хочу дело делать, а не доказывать компилятору что-то.
А как ты узнаешь, что сделал дело, а не протекающий падучий багодром?
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, MT-Wizard, Вы писали:
MW>Borrow checker — одна из немногих причин, по которой я раст никогда не восприму как язык для работы. Я хочу дело делать, а не доказывать компилятору что-то.
А если ты объявил переменную ix, а используешь необъявленную xi — это тоже называется "я ещё должен компилятору доказывать, что я не опечатался"?
Здравствуйте, reversecode, Вы писали:
R>а поскольку стреляют себе в ногу чаще новички, то руст получается язык на который можно нанимать новичков за меньшие деньги R>соответственно для бизнеса, попытка решения проблем меньшими затратами
Ну во-первых, не-новичкам тоже удается себе что-нибудь отстрелить. Причем в отличии от новичков, они делают это так старательно, что ногой не отделаешься, приходится целую задницу полностью ампутировать.
А во-вторых, переусложненность языка создает больше проблем, чем небезопасность, потому что требует неразумного количества интеллектуальных усилий, чтобы себя обслуживать. Не уверен, впрочем, что руст в этом плане так уж фундаментально сильно лучше, чем Ц++.
Здравствуйте, Pzz, Вы писали:
Pzz>А во-вторых, переусложненность языка создает больше проблем, чем небезопасность, потому что требует неразумного количества интеллектуальных усилий, чтобы себя обслуживать. Не уверен, впрочем, что руст в этом плане так уж фундаментально сильно лучше, чем Ц++.
Намного лучше. В случае с Rust тебе нужно один раз напрячься и доказать компилятору что ты не верблюд.
В случае с С++ тебе нужно постоянно думать, а не верблюд ли ты.
Более того тебе нужно думать, а не верблюд ли твой коллега и те программисты код которых ты скачал с интернета.
В случае с Rust те люди которые написали код докажут что они не верблюды.
То есть разработка на Rust и других языках которые точно знают что код написал не верблюд масштабируется намного лучше чем на С++.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, kaa.python, Вы писали:
WH>>А как ты узнаешь, что сделал дело, а не протекающий падучий багодром? KP>Возьмёт ubsan и asan да убедится. Или это сложнее чем с borrow checker-ом бороться?
Проще. Только это не даёт гарантий, что ты всё поймал. А это значит, что падение в продакшене только вопрос времени.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Проще. Только это не даёт гарантий, что ты всё поймал. А это значит, что падение в продакшене только вопрос времени.
Куда более распространенная проблема проблем в продакшн это не утечки/расстрел памяти, кои очень редки в современном мире, а банальные ошибки программирования от которых ни один язык не защищает. Меня не покидает ощущение того, что большинство активно агитирующих за Rust либо наслушалось страшилок про C++ при этом не имея с ним реального опыта, лабо были тяжело травмированы C++98/03. И да, C++98/03 был действительно сильно травмирующим неустойчивую психику языком
P.S. мне нравится Rust и его идея, просто никакой серебрянной пули и серьезного выигрыша по сравнению с C++ в безопасности кода нет. А вот Cargo, интерфейсы вместо классов, тесты вместе с исходниками и CSP из коробки и куча других моментов — это да, это несомненные жирные плюсы.
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, WolfHound, Вы писали:
WH>>Проще. Только это не даёт гарантий, что ты всё поймал. А это значит, что падение в продакшене только вопрос времени.
KP>Куда более распространенная проблема проблем в продакшн это не утечки/расстрел памяти, кои очень редки в современном мире,
Точно редки? Недавний пример с Java/Android, код с утекающей памятью чуть ли у каждого второго новичка:
anonymous class реализуем Observer для некого события, и неявно в соответствии со спецификацией Java захватывает ссылку на
Activity, экран переворачивается, Activity пересоздается, ссылка на нее все еще есть (циклическая удаленная Activity на Observer,
Observer на Activity), вот и утечка памяти, а Activity может довольно много весить.
В общем-то и в C++ с активным использованием std::shared_ptr такое будет.
KP>P.S. мне нравится Rust и его идея, просто никакой серебрянной пули и серьезного выигрыша по сравнению с C++ в безопасности кода нет.
Опять же возьмем новичка, в C++ передаст куда-нибудь указатель в стороннее API и не прочитает документацию,
а не новичку каждый раз гемор, нужно разбираться кто владеет ресурсом при передаче указателя,
а Rust использовать API неправильно и тут же ошибка компиляции.