Язык программирования Rust был разработан компанией Mozilla и впервые представлен в 2010 году. Он считается одним из самых безопасных и производительных языков программирования на сегодняшний день. В данной статье мы рассмотрим основные преимущества Rust, и почему он становится все более популярным в системном программировании.

Где изучать Rust?

Безопасность в Rust

Одной из ключевых особенностей Rust является обеспечение строгих гарантий безопасности памяти. Rust предотвращает множество типичных ошибок, таких как гонки данных и неправильное использование памяти, с помощью двух мощных механизмов: системы владения (ownership) и системы заимствования (borrowing). Эти механизмы управления памятью позволяют программистам предотвратить гонки данных, так как Rust гарантирует, что данные будут доступны только одному владельцу за раз, и заимствования не позволяют одновременно иметь и изменять данные.

Кроме того, Rust предоставляет проверку времени жизни (lifetime), что гарантирует, что память будет автоматически освобождена, когда ее время жизни истечет. Это предотвращает утечки памяти и другие проблемы, связанные с неправильным использованием памяти. Rust также предлагает тип Option, который явно представляет значение, которое может отсутствовать, избавляя программиста от необходимости обрабатывать null-указатели и связанные с ними ошибки.

Производительность в Rust

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

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

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

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

Совместимость с C и C++

Одной из главных причин, по которой разработчики выбирают Rust для работы с C и C++, является его совместимость с ABI (Application Binary Interface) языков C и C++. Благодаря этому Rust может вызывать функции, написанные на C и C++, а также предоставлять свои собственные функции для вызова из C и C++ программ. Это достигается с помощью специального атрибута #[no_mangle] и ключевого слова extern, которые указывают компилятору на то, что функция должна использовать C-подобное соглашение об именах и вызовах. Кроме того, структуры данных Rust могут быть представлены в формате, совместимом с C, с использованием атрибута #[repr(C)].

Однако стоит отметить, что совместимость Rust с C++ ABI менее прямолинейна, поскольку C++ имеет более сложную систему именования и вызова функций, а также поддерживает такие возможности, как перегрузка функций и шаблоны. В этом случае разработчики могут использовать сторонние инструменты, такие как cxx или rust-cpp, для облегчения взаимодействия между Rust и C++ кодом. Эти инструменты позволяют генерировать оболочки или мосты для работы с классами и объектами C++, что облегчает интеграцию.

Помимо этого, Rust предлагает удобный механизм взаимодействия с библиотеками C и C++ через FFI (Foreign Function Interface). FFI обеспечивает безопасный и эффективный способ вызова функций, написанных на других языках, и обмена данными между ними. В случае с C библиотеками, Rust может использовать функции напрямую, объявляя их с помощью ключевого слова extern. При работе с библиотеками C++, создание межъязыкового интерфейса может потребовать больше усилий, включая написание оберток на языке C, которые затем могут быть вызваны из Rust.

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

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

Rust в системном программировании

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

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

Rust успешно применяется во многих областях системного программирования, например, при создании операционных систем, сетевых протоколов, встроенных систем и криптографических библиотек. Рассмотрим некоторые примеры.

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

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

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

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

Кроме уже упомянутых проектов, таких как Redox, QUIC, HTTP/3, Tock и ring, существует ряд других реальных проектов в системном программировании, которые используют Rust. Ниже приведены некоторые из них:

  1. Firecracker: Это проект с открытым исходным кодом от Amazon Web Services (AWS), который представляет собой легковесный виртуализатор с микросервисной архитектурой. Firecracker написан на Rust и предназначен для безопасного и быстрого запуска тысяч микро-VM на одном сервере. Rust обеспечивает надежность и производительность, которые являются важными для этого типа виртуализаторов.

  2. Linkerd: Это сервис-меш с открытым исходным кодом, используемый для обеспечения надежной и безопасной связи между микросервисами. Linkerd написан на Rust и Go, и его производительность и безопасность обеспечиваются благодаря использованию Rust для критически важных компонентов, таких как прокси-сервер.

  3. TiKV: Это распределенная система хранения данных с открытым исходным кодом, разработанная на Rust. TiKV предоставляет гибкость и масштабируемость для обработки больших объемов данных и использует Rust для достижения высокой производительности и безопасности.

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

  5. Crosvm: Проект с открытым исходным кодом от Google, представляющий собой гипервизор для запуска виртуальных машин на Chrome OS. Crosvm написан на Rust и обеспечивает надежную и быструю виртуализацию с минимальным воздействием на производительность и безопасность системы.

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

Rust и Веб-разработка

Rust также прекрасно интегрируется с технологиями веб-разработки, например, с JavaScript. Благодаря WebAssembly (Wasm) - бинарному формату, который позволяет запускать код, написанный на других языках, таких как Rust, прямо в браузере - разработчики могут использовать Rust для улучшения производительности и безопасности своих приложений. С инструментами, такими как wasm-bindgen, можно легко создавать прозрачные интерфейсы между кодом Rust и JavaScript, что облегчает внедрение Rust в существующие проекты.

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

Еще один замечательный пример использования Rust в веб-разработке - проект Yew. Это современный фреймворк для создания многофункциональных и быстрых веб-приложений с использованием WebAssembly. Yew предоставляет компонентный подход к разработке, аналогичный тому, что используется в React и Vue.js, но с преимуществами Rust, такими как высокая производительность и безопасность. Yew позволяет разработчикам создавать интерактивные пользовательские интерфейсы с быстрым откликом, оптимизированные для современных браузеров.

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

Реальные проекты, использующие Rust в веб-разработке, продолжают появляться, и это отражает растущий интерес к этому языку. Например, компания npm (Node Package Manager) перешла на использование Rust в своей инфраструктуре для оптимизации производительности и устранения проблем с памятью, возникающих при использовании JavaScript. Это демонстрирует, что Rust может быть полезным дополнением к традиционным языкам веб-разработки, таким как JavaScript, Python или Ruby.

Игровая индустрия

Разработка игр на Rust становится возможной благодаря экосистеме инструментов и библиотек, предоставляемых сообществом. Например, Amethyst и Bevy – это два мощных и гибких игровых движка, созданных на Rust. Они предлагают разработчикам широкие возможности для создания игр различных жанров и стилей, от инди-проектов до ААА-игр.

Касательно реальных проектов на Rust, стоит отметить игру "Veloren" – многопользовательскую ролевую игру с открытым миром, вдохновленную такими играми, как "Minecraft" и "Cube World". Разработка Veloren ведется силами сообщества, исходный код доступен на GitHub, и это отличный пример того, как можно использовать Rust для создания качественных и надежных игр.

Поддержка сообщества

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

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

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

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

Дружелюбная экосистема

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

Cargo – это система управления пакетами и сборки для Rust. Она предоставляет интуитивно понятный и удобный интерфейс для управления зависимостями, сборки проектов и публикации библиотек. Cargo позволяет легко добавлять или обновлять библиотеки, контролировать версии и настраивать процесс сборки, что существенно упрощает работу разработчиков и повышает их продуктивность. Благодаря Cargo, разработчики могут сосредоточиться на написании кода, а не на рутинных задачах управления проектами.

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

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

Заключение

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

При правильном использовании Rust способен занять высокую позицию среди языков программирования, и его будущее выглядит ярким и обещающим. Не упустите возможность ознакомиться с этим языком и попробовать его в своих проектах!

Здесь можно проголосовать за Rust как за один из лучших языков для изучения в 2023 по версии пользователей habr.com.

Комментарии (23)


  1. Daddy_Cool
    00.00.0000 00:00
    +19

    Краткое содержание статьи:
    1. Язык Rust это очень хорошо.
    2. На нём много чего написано - см. список.
    3. Будущее Rust выглядит ярким и многообещающим. (Примечание. Язык создан э... от 8 до16 лет назад (смотря как считать)).
    -----------
    А если серьезно - интересно было бы сравнение какого-нибудь перемножения матриц на Си и на Rust.
    Ой! Всё уже есть.
    https://users.rust-lang.org/t/looking-for-help-understanding-rusts-performance-vs-c/30469/6
    "Наивный алгоритм в Rust был почти в 2,5 раза медленнее, чем в C++."  (А дальше обсждение, что делать и как быть).

    -----------
    А не GPT-3 ли написал эту статью?


    1. Kelbon
      00.00.0000 00:00
      -2

      Согласен, в последнее время статьи про раст всё больше напоминают нечто написанное нейросетью. Какое то вечное повторение двух тезисов с кривым переводом


    1. Free_ze
      00.00.0000 00:00

      Наивный алгоритм в Rust был почти в 2,5 раза медленнее, чем в C++

      Звучит так, будто там какой-то фатальный недостаток языка обнаружился)


      1. Daddy_Cool
        00.00.0000 00:00

        В смысле? Это скорее тогда у Си есть "фатальный недостаток". )
        https://neolurk.org/wiki/Фатальный_недостаток


        1. domix32
          00.00.0000 00:00
          +4

          Ну, в среднем есть, потому раст и изобрели. Начиная от всяких segfault конструкций никак не валидируемых без тонн анализаторов или ChatGPT и кончания миллионом небезопасных функций а ля sprintf, породивших десятки тысяч CVE.


    1. Huntermlg4
      00.00.0000 00:00

      В примере, в котором Rust медленнее в 2.5 раза использовалось индексирование массива с проверкой. Если бы вы удосужились прочитать сообщения ниже, то увидели бы, что об этом написали, показав, что код с get_unchecked (без проверки) такой же быстрый, как и C/C++.
      Я не знаю сколько поколений пройдёт, прежде чем люди будут говорить, что Rust по скорости ничем не хуже, чем C/C++, даже лучше, если проект не заканчивается на тупом перемножения матриц.

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


      1. yrub
        00.00.0000 00:00

        с другой стороны компилятор должен уметь такие проверки удалять в тривиальных случаях типа цикла, этого ещё не завезли?


        1. medvedevia
          00.00.0000 00:00

          Там дальше был пример для слайсов и там удаляются, возможно проблема в том что вектор изменяемый


  1. lolikandr
    00.00.0000 00:00

    Ждём reproducible builds


    1. domix32
      00.00.0000 00:00
      +2

      Хм, а разве не уже? cargo build --locked вроде как раз про это.


      1. AnthonyMikh
        00.00.0000 00:00

        Процедурные макросы (и в особенности shadow-rs) передают привет.


  1. Domein
    00.00.0000 00:00

    Возможно Rust и хорош, но легаси на Си/C++ оооочень много и как бы rust не был хорош от сишки мы не избавимся ещё очень долго.

    Для новых проектов подойдёт возможно, но в embedded разработке он вроде не так развит


    1. odobryabov
      00.00.0000 00:00

      Для embedded пойдёт, главное не забывать везде вставлять "unsafe".


    1. vabka
      00.00.0000 00:00

      > легаси на Си/C++ оооочень много

      Знаю кое-кого, кто часть легаси с плюсов на раст переписал.
      Цитата из общения:
      > Написали один новый сервис на Rust, и он нам так понравился, что решили всё новое писать на нём, а некоторые старые даже переписать.


  1. domix32
    00.00.0000 00:00
    +2

    Amethyst

    Аметист умер и фактически отдал свои наработки в Bevy, какие смог. Прочие околоигровые проекты.


  1. alexdora
    00.00.0000 00:00
    +2

    Год назад выбирали язык на который переписывать высоконагруженный сервиcs. Было 3 варианта:

    Golang, C++, Rust. После небольшого исследования в неделю, остались C++ и Golang. По итогу выбрали последний.

    Хотели выбрать C++ он все же немного в наших задачах быстрее golang особенно в вопросе бинарных деревьев. Но победила быстрая разворачиваемость Golang. Притом базовых функций unsafe для доступа к DLL/SO библиотекам хватает. Собственно модуль который работает с бинарными деревьями написан на C++ и подключается в Golang

    Почему не Rust ответ дали те люди которые и на C++ и на Rust. Когда в задаче всплывали сторонние библиотеки DLL и часть чужого кода С/С++ они сами же и отговаривали от Rust. Дополнительно поясняя что "какбэ" в данной задаче еще и жуткая "многопоточность" и опыта на C++ в этом у них значительно больше. И это мнение 10-ка человек. Притом когда я спрашивал ребят, а зачем Rust-то учили. Все без исключения ответили что-то из разряда:
    "Появилась задача на хайпе, решили попробовать что-то новое"

    Моё личное мнение после исследования такое, отвечу с точки зрения бизнеса:
    1. Найти другого программиста на С++ проще, чем искать на Rust. Я говорю не о разработчиках средней руки, а именно о тех кто решает сложные задачи.
    2. Прибавки в скорости по бенчам по сравнению с С++ не увидел. Либо она настолько ничтожна что в современном мире можно списать на погрешность
    3. Под С/С++ написано больше чем много. Если стоит вопрос подключения библиотек сторонних и не дай бог еще они "закрытые". Несмотря на совместимость какую-то и возможность подключения (хотя лично мне кажется она такая же как на golang, просто чуть лучше) я с трудом могу представить ситуацию:

    "Нам нужно сделать приложение. Будем использовать 10 библиотек готовых, проверенных на C++ [список]. Поэтому очевидно что наше приложение будет на Rust"

    4. Не мог не обратить внимание на то что те статьи и комментарии которые я читал еще тогда, собственно как и эта статья напоминает: "Rust это круто и узнав его ты станешь элитой. C++/golang/python....[плохое слово]". Очень мало статей банально на реализации действительно сложных задач. 95% статей собственно как это.

    А теперь по статье:

    "Проекты, такие как QUIC и HTTP/3"

    насколько мне не изменяет память, это Cloudflare открыла исходники на языке Rust. И на сколько я помню там Google делал на C++ изначально. А то что Cloudflare решил на Rust не говорит ни о чем. Захотели и сделали. Могут себе позволить.

    "Rust и Веб-разработка"

    С трудом представляю реализацию всего этого, код ради кода. Мы хоть не пользуемся контейнерами типа кубов, но пользуемся микросервисной архитектурой. Последнее что приходит на ум вставлять в JS бинарный код чтобы сцеплять их с языком программирования. Хотя реализация REST/GRPC вполне самодостаточная и не требует специфичных знаний для 99.99999% веб приложений. Могу ошибаться конечно, но выглядит как какая-то херня.


    1. KanuTaH
      00.00.0000 00:00

      И на сколько я помню там Google делал на C++ изначально.

      Microsoft сделал свою реализацию протокола QUIC на C (даже не на C++).


  1. kovserg
    00.00.0000 00:00
    -1

    Rust: безопасность, производительность и преимущества

    А недостатки есть или только преимущества?


    ps: Языки типа nim или zig выглядят на порядок лучше rust


    1. 0xd34df00d
      00.00.0000 00:00
      +1

      А недостатки есть или только преимущества?

      Слабая система типов.


      Языки типа nim или zig

      Слабая и неинтересная система типов.


      1. kovserg
        00.00.0000 00:00

        Haskell ?


        1. 0xd34df00d
          00.00.0000 00:00

          Тоже слабая.


          1. kovserg
            00.00.0000 00:00

            А для чего вам такая неслабая и интересная система типов?


  1. klimkinMD
    00.00.0000 00:00
    -2

    Есть Компонентный Паскаль, Оберон-2...

    Верное средство сделать Rust "незаменимым" перепишите на нём код Cobol'а