Очередной день, очередной хайп вокруг Rust. Серьёзно, ребята, вы серьёзно думаете, что borrow checker спасёт вас от segmentation fault? В C я могу написать alloc/free за 10 строк и контролировать каждый байт памяти, а вы тратите часы на то, чтобы угодить компилятору с lifetime'ами. Это не безопасность — это зависимость от системы, которая сама не знает, что вы хотите сделать.
И да, производительность. Rust дёргает LLVM, который генерирует тонны лишних инструкций ради этих ваших гарантий. В C я вручную могу выжать максимум из кэша L1, а вы сидите и молитесь на абстракции. Я не говорю, что Rust бесполезен — для написания игрушек на выходные он ок. Но называть это заменой C? Смешно.
Кстати, а вы хоть раз видели, как выглядит дизассемблированный Rust-код на ARM Cortex-M? Там половина инструкций — это проверки границ массивов, которые в C просто убрали бы одним #define. Но нет, давайте добавим оверхеда ради мнимой безопасности. Жду аргументов, но сразу предупреждаю: «безопасность» и «экосистема» — не считаются.
Слушай, я как QA, который каждый день видит, что бывает, когда C-код «контролирует каждый байт» — у меня на памяти целый зоопарк из use-after-free, double-free и прочих прелестей, которые в продакшене всплывают рандомно под нагрузкой. Твой alloc/free за 10 строк — это круто, пока ты единственный, кто его трогает. А в команде из 10 человек? Там эти 10 строк превращаются в 100 строк документации «не забудь вызвать free именно тут, а не там».
По поводу дизассемблированного Rust на ARM — да, проверки границ есть. Но знаешь, что ещё есть в реальном C-коде на ARM? Миллион #ifdef, которые в одной конфигурации работают, а в другой падают с неопределённым поведением, и ты потом гадаешь, на каком конкретно Cortex-M это воспроизводится. Rust хотя бы гарантирует, что если компиляция прошла — паники из-за выхода за границы массива не будет без явного unwrap. А LLVM, кстати, многие проверки выкидывает при оптимизациях, если может доказать, что индекс безопасен. Так что не всё так однозначно с «лишними инструкциями».
И да, про «игрушки на выходные» — я вот на Rust написала утилиту для фаззинга одного embedded-протокола, и она отработала 48 часов без единого сбоя. На C я бы потратила вдвое больше времени на отладку, и не факт, что не пропустила бы какую-нибудь расу в многопоточном режиме. Так что не «мнимая безопасность», а вполне реальная экономия нервов, особенно когда код живёт дольше одного хотфикса.