Rust — это язык программирования со статической типизацией, разработанный для повышения производительности и безопасности, особенно для безопасного параллелизма и управления памятью. Его синтаксис похож на синтаксис C++. Этот проект с открытым исходным кодом разработан специалистами Mozilla Research. В 2021 году был создан Rust Foundation, который перенял эстафету и стал движущей силой развития языка.
Rust решает проблемы, с которыми долгое время боролись разработчики C/C++: ошибки памяти и параллельное программирование. Это считается его основным преимуществом. Однако это не единственные примеры того, чем Rust выгодно отличается от C/C++. Конечно, можно возразить, что современный C++ уделяет больше внимания безопасности памяти (например, путем реализации интеллектуальных указателей), но многие проблемы остаются нерешенными. Один из них — «использовать после освобождения ошибок», которые случаются, когда программа продолжает использовать указатель после того, как он был освобожден, например, вызов лямбда-функции после освобождения захваченных объектов ссылки.
С другой стороны, в Rust есть средство проверки заимствования — часть компилятора, которая следит за тем, чтобы ссылки не пережили данные, на которые они ссылаются. Эта функция помогает устранить ошибки нарушения памяти. Такие проблемы обнаруживаются во время компиляции, и сборка мусора не требуется.
Кроме того, в Rust у каждой ссылки есть время жизни, где можно установить область действия, для которой эта ссылка действительна.
Эта функция решает проблему с более недействительными ссылками, а также выгодно отличает Rust от C/C++.
Важность правильного управления памятью становится очевидной на следующем примере: за последние 12 лет около 70% всех ошибок безопасности в продуктах Microsoft были связаны с безопасностью памяти. Примерно такие же проблемы характерны и для Google Chrome.
В Rust есть два режима написания кода: безопасный Rust и небезопасный Rust. Безопасный Rust накладывает на программиста дополнительные ограничения (например, управление владением объектами), тем самым обеспечивая правильную работу кода. Небезопасный Rust дает программисту больше автономии (например, он может работать с необработанными C-подобными указателями), но код может сломаться.
Небезопасный режим Rust открывает больше возможностей, но программистам нужно проявлять особую осторожность, чтобы убедиться, что написанный код действительно безопасен. Для этого можно обернуть его абстракциями более высокого уровня, которые гарантируют безопасность всех применений абстракции. Как и в случае с другими языками программирования, к использованию небезопасного кода следует подходить с осторожностью, чтобы избежать неопределенного поведения и свести к минимуму риск segfault (ошибка сегментации) и уязвимостей, возникающих из-за небезопасности памяти.
Двухрежимная модель Rust — одно из его самых больших преимуществ. С другой стороны, в C++ вы никогда не узнаете, что написали небезопасный код, пока где-то в будущем ваше программное обеспечение не выйдет из строя или не возникнет брешь в системе безопасности.