3056

Почему язык программирования Rust так популярен?

Rust был создан для обеспечения высокой производительности, аналогичной той, что предлагают C и C++, но с упором на безопасность кода, что является ахиллесовой пятой этих двух языков. Однако безопасность – это не единственная причина популярности этого языка. Высокая производительность при обработке больших объемов данных, поддержка параллельного программирования, а также наличие эффективного компилятора — другие причины, по которым известные «тяжеловесы» IT-отрасли предпочитают использовать Rust в своих разработках. К их числу относятся Firefox, Dropbox, Cloudflare и многие другие известные компании.

В этой статье мы расскажем об основных характеристиках Rust, о том, для чего он используется и почему стоит подумать о его внедрении в свои программные проекты.

Растущая популярность Rust

По данным опроса, проведенного в 2021 году профильным ресурсом Stack Overflow среди более, чем 80 000 разработчиков, Rust уверенно занял первое место, как самый любимый язык программирования. И эту позицию язык удерживает шестой год подряд.

В 2020 году разработчики ядра Linux предложили писать новый код ядра Linux на Rust. Что интересно, они предложили не переписывать все ядро, которое изначально было написано на C, а добавить новый код на Rust, который будет работать с существующей инфраструктурой. Данную инициативу поддержал сам Линус Торвальдс, отец операционной системы Linux. Эта идея находится в постоянной разработке — на данный момент она все еще описывается как экспериментальная, но «достаточно хорошая, чтобы разработчики ядра могли начать работать над абстракциями Rust для подсистем и писать драйверы и другие модули».

Google также планирует использовать Rust в ядре Linux после поддержки языка системного программирования Rust в Android. Данный переход направлен на устранение недостатков безопасности. Компания Microsoft также не осталась в стороне и обратилась к технологии Rust, чтобы уменьшить количество ошибок в компонентах Windows, связанных с памятью.

Facebook также наладил более тесные связи с Rust, присоединившись к Rust Foundation , организации, созданной в 2021 году для развития Rust для превращения его в основной предпочтительный язык для системного программирования. До Facebook это уже сделали Amazon Web Services, Google, Huawei, Microsoft и Mozilla. Все это явные признаки того, что Rust имеет очень хорошие перспективы.

Что такого особенного в языке Rust?

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++ вы никогда не узнаете, что написали небезопасный код, пока где-то в будущем ваше программное обеспечение не выйдет из строя или не возникнет брешь в системе безопасности.

Параллельное программирование с Rust стало проще

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

Если данный доступ к объекту не поддерживает много потоков (т. е. не помечен соответствующей чертой), его необходимо синхронизировать с помощью мьютекса, который заблокирует доступ к этому конкретному объекту для других потоков. Это гарантирует, что операции, выполняемые над объектом, не сломают его, так как к нему имеет доступ только один поток.

С точки зрения других потоков операции над этим объектом являются атомарными, что означает, что наблюдаемое состояние объекта всегда корректно, и вы не можете наблюдать какое-либо промежуточное состояние, возникающее в результате операции, выполняемой над этим объектом другим потоком. Язык Rust может проверять, выполняем ли мы какие-либо неправильные операции с такими объектами, и информировать нас об этом во время компиляции.

Другие языки используют методы синхронизации, но они не связаны с объектами, на которые ссылаются. Именно разработчик должен позаботиться о том, чтобы заблокировать объект перед его использованием. Например, в C/C++ компилятор позволяет разработчику писать код с ошибками. В результате ошибки обнаруживаются, когда программа уже находится в продакшене, или, что еще хуже, когда кто-то пытается ее взломать. В языке Rust многие проблемы, связанные с параллельным программированием (хотя и не все), решены, так как они обнаруживаются сразу во время компиляции.

Некоторые препятствия, которые необходимо преодолеть при программировании на Rust

Rust — относительно новая технология, поэтому некоторые нужные библиотеки могут быть еще недоступны. Тем не менее, библиотека пакетов Rust запущенная в 2016 году быстро растет, а активное сообщество разработчиков Rust является хорошим предзнаменованием для дальнейшего развития.

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

Однако разработчики Rust делают все возможное, чтобы сделать эти сообщения об ошибках как можно более информативными и ненавязчивыми.

И последнее, но не менее важное: написание кода на Rust требует больше усилий, так как порог входа довольно высок. Нужно потратить некоторое время на освоение языка. Также требуется хорошее знание C++ или любого другого объектно-ориентированного языка программирования. Но если вы преодолеете все эти препятствия, преимущества использования Rust станут лучшей наградой за ваши усилия.

Для чего используется Rust

Rust — это уже «зрелая» технология, которая используется в производстве. Как язык системного программирования, он позволяет контролировать детали низкого уровня. Вы можете выбрать, хранить ли данные в стеке (используется для статического выделения памяти) или в куче (используется для динамического выделения памяти). Здесь также важно упомянуть о RAII (Resource Acquisition Is Initialization), идиоме кода, которая в основном связана с C++, но также присутствует в Rust: каждый раз, когда объект выходит за пределы области видимости, вызывается его деструктор и освобождаются принадлежащие ему ресурсы. С Rust не нужно делать это вручную - вы полностью защищены от ошибок утечки ресурсов. В конечном итоге это позволяет более эффективно использовать память.

Поскольку в Rust нет постоянно работающего сборщика мусора, его проекты могут использоваться в качестве библиотек другими языками программирования через интерфейсы сторонних функций. Это идеальный сценарий для существующих проектов, где важно обеспечить высокую производительность при сохранении безопасности памяти. В таких проектах код Rust может заменить некоторые части программного обеспечения, где производительность играет решающую роль, без необходимости переписывать весь продукт.

Rust — это низкоуровневый язык программирования с прямым доступом к оборудованию и памяти, что делает его отличным решением для разработки встраиваемых систем и разработки на «голом железе».

Вы можете использовать Rust для написания операционных систем или приложений для микроконтроллеров. На самом деле, уже существует ряд операционных систем, написанных на Rust, например: Redox, intermezzOS, QuiltOS, Rux и Tock. Mozilla, где изначально был разработан этот язык, использует его в своих браузерных движках.

Высокая производительность и безопасность — функции, которые сделали Rust таким привлекательным для ученых, использующих его для анализа больших объемов данных. Rust невероятно быстр, что делает его идеальным выбором для вычислительной биологии и машинного обучения, где нужно очень быстро обрабатывать большие объемы данных.


Подводя итог, основные причины в пользу использования Rust включают в себя следующее:

  • Высокая производительность при обеспечении безопасности памяти
  • Поддержка параллельного программирования
  • Растущее количество пакетов Rust в репозитории crates.io
  • Активное сообщество, способствующее развитию языка
  • Обеспечена обратная совместимость и стабильность

Заключение

У Rust отличная производительность, инструменты и активное сообщество, которое постоянно работает над улучшением языка. Более того, если вам нужно решение с большим вниманием к безопасности, чем C/C++, и вы не хотите жертвовать скоростью, Rust — хороший выбор. Если вы беспокоитесь, что Rust может быть недостаточно «зрелым» для вашего проекта, отбросьте сомнения прочь. Десятки компаний, таких как Figma, 1Password или Amazon, уже использовали Rust в своих разработках.