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

Rust зародился как идея после разочаровывающего опыта после долгого рабочего дня. Я могу понять, почему Грейдон Хоар (@graydon_pub) открыл свой ноутбук и начал разрабатывать новый язык программирования, который помогает людям писать код, который не испортит наши любимые лифты.

В этой статье будут рассмотрены:

  • Что такое ржавчина
  • Каковы его особенности
  • Каковы реальные варианты использования Rust
  • Как Rust вписывается в переполненное море языков программирования

Что такое ржавчина?

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

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

Каковы ключевые особенности Rust?

1. Надежная безопасность памяти

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

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

  1. Владение и заимствование. Один из способов избежать одновременного неправильного использования двух фрагментов кода — определить владельца и заемщиков. Одновременно может быть только один владелец значения. Заемщики могут либо вступить во владение, либо использовать ссылку, но только одна из них может быть изменена одновременно. Эта модель владения является основной опорой безопасности памяти Rust.
  2. Время жизни: Rust использует время жизни, чтобы гарантировать, что ссылки существуют до тех пор, пока они заимствованы.
  3. Null Safety: в Rust нет такого понятия, как Null (навсегда). Вместо этого Rust использует Тип параметра, чтобы программы не могли разыменовывать нулевые указатели.
  4. Безопасные оболочки: Rust позволяет программистам писать небезопасный код таким образом, чтобы он был изолирован от остального кода. Ключевое слово unsafe помогает найти подозрительный, но иногда необходимый код, который может вызвать проблемы.

2. Молниеносная производительность

Rust действительно быстр. И делает это, не позволяя вам выстрелить себе в ногу (смотря на вас, C и C++). Что это значит?

  1. Бесплатные абстракции: Rust предоставляет высокоуровневые абстракции, которые компилируются в эффективный машинный код. Нет необходимости в загадочном коде, который поймет только ваш компьютер.
  2. Контроль над выделением памяти. Разработчики могут точно настроить использование памяти в своем коде, что позволяет проводить оптимизацию, помогающую достичь желаемой производительности.
  3. Безопасный параллелизм. Модель владения помогает писать безопасные программы во время компиляции. Подробнее об этом позже.
  4. Небольшое время выполнения: Rust требует очень мало накладных расходов. Это важно в средах с ограниченными ресурсами, таких как встроенные устройства.

3. Бесстрашный параллелизм и параллелизм

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

  1. Потоки: Rust предоставляет библиотеку потоков с облегченными абстракциями.
  2. Владение и заимствование. Это позволяет нескольким потокам безопасно обращаться к одним и тем же данным, избавляя разработчиков от большинства проблем с синхронизацией.
  3. Каналы. Потоки взаимодействуют через асинхронный канал по шаблону отправитель/получатель.
  4. Атомарные типы. Это оболочки основных типов (логические, числовые и т. д.), которые можно безопасно использовать между потоками.
  5. Async/Await: Rust заимствует модель Async/Await из таких языков, как JavaScript или C#, помогая разработчикам понимать код, который выполняется асинхронно.

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

Существуют также крейты (библиотеки), предоставляющие дополнительную функциональность для написания одновременного и параллельного кода, например Tokyo, futures или Rayon.

4. Самородки функционального программирования

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

Хотя Rust не является чистым языком функционального программирования, в нем есть некоторые конструкции функционального программирования, такие как:

  • Итераторы: Rust предоставляет как синхронные, так и асинхронные итераторы.
  • Замыкания. Это анонимные функции, которые охватывают среду в определенной области.
  • Сопоставление с образцом: Rust предоставляет мощные возможности сопоставления с образцом, упрощая написание исчерпывающего кода, обрабатывающего все случаи, требуемые совпадающим типом.
  • Классы типов: достигается с помощью параметров универсального типа. Каждый другой параметр универсального типа изменяет фактический тип. Например, Vec<f32> и Vec<char> — это два разных типа, а не один тип (Vec) с двумя параметрами.
  • Опция и Либо: Rust включает типы Option и Либо в свою стандартную библиотеку. Эти типы заменяют потребность в Null и Exceptions в языке.

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

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

5. Отличная кроссплатформенная совместимость

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

  1. Cargo: менеджер пакетов Rust обрабатывает зависимости и цели сборки, загружая и компилируя зависимости для разных платформ.
  2. Атрибут cfg_attr: определяет конфигурации, к которым будет применяться код.
  3. Макрос cfg: помогает при условной компиляции, ориентируясь на определенные платформы.

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

6. Современная и надежная обработка ошибок

Rust предлагает типы ошибок и результатов вместо Null и исключений.

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

И Result, и Error можно использовать с сопоставлением с образцом, помогая нам гарантировать, что мы явно обрабатываем все ошибки и что наш код устойчив.

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

7. Современный менеджер пакетов

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

  1. Управление зависимостями: Cargo загружает зависимости в Cargo.toml, а затем компилирует пакеты.
  2. Сборка дистрибутивов: Cargo объединяет зависимости и код, написанный разработчиком, и создает исполняемые файлы. На этом этапе Cargo управляет специфичным для платформы кодом в зависимости от цели.
  3. Распространение исполняемых файлов: вы можете загружать свои ящики на crates.io, официальный реестр пакетов Rust, и управлять их версиями.
  4. Выполнение тестов. В современной разработке программного обеспечения очень важно иметь набор автоматизированных тестов. Cargo помогает настраивать и запускать автоматические тесты.

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

8. Активное и увлеченное сообщество

Хотя вы можете найти неприветливых людей в каждом сообществе, и Rust не является исключением, я считаю, что сообщество Rust в целом:

  1. Знания: многие разработчики Rust пришли из таких языков, как C++, и имеют большой опыт.
  2. Полезно: я нашел людей, готовых учить меня, объединяться со мной для развлечения или помогать в качестве волонтера на таких платформах, как exercism.org. Я могу только быть благодарным им за их время и самоотверженность.
  3. Увлеченность: вы можете почувствовать, что люди в сообществе Rust твердо верят в то, что Rust станет новаторской технологией будущего. Я согласен с ними.
  4. Инновационный: Rust появился совсем недавно. Разработчики Rust пытаются раздвинуть границы программирования и ищут пути для инноваций.

Какие реальные примеры проектов на Rust?

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

1. Механизм синхронизации Dropbox Nucleus

Команда Dropbox изо всех сил пыталась реорганизовать и улучшить свой существующий Sync Engine Classic до такой степени, что могла помочь только переписывание.

Они написали новый движок под названием Nucleus. Вот что они говорят об использовании Rust для написания нового движка:

«[Это] было одним из лучших решений, которые мы приняли. Больше чем производительность, его эргономика и ориентация на правильность помогли нам укротить сложность синхронизации. Мы можем закодировать сложные инварианты нашей системы в системе типов, и компилятор проверит их для нас».

2. Амазонский фейерверк

Firecraker — это технология виртуализации, улучшающая такие сервисы AWS, как AWS Lambda и AWS Fargate. Firecracker повышает эффективность и использование ресурсов. Функции безопасности Rust помогли Amazon достичь своих стандартов безопасности и производительности.

3. Механизм синхронизации Figma «Многопользовательский»

Механизм синхронизации Figma, написанный на TypeScript, страдал от скачков задержки. В основном это было связано с тем, что TypeScript работал в одном потоке.

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

4. Курсера

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

5. Сервопривод

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

Применение Rust в системном программировании, веб-разработке и не только

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

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

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

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

Другое применение Rust — Веб-разработка.

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

Заключение

Надеюсь, вам понравилось это введение в Rust без кода. Подводя итог этой статье, вот краткий итог.

Краткое изложение основных возможностей и преимуществ Rust

Подводя итог, вот ключевые моменты, в которых Rust превосходит:

  1. Безопасность памяти
  2. Производительность
  3. Параллелизм
  4. Кроссплатформенность
  5. Сообщество
  6. Совместимость
  7. Производительность
  8. Безопасность

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

Заключительные мысли о будущем и потенциале Rust

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

Разработка игр, без сомнения, является одной из областей, где Rust может проявить себя. Есть некоторое сопротивление со стороны разработчиков. На протяжении десятилетий C++ был отраслевым стандартом. Кроме того, Rust — очень лаконичный язык, который иногда плохо сочетается с итеративным характером разработки игр. Я могу с этим согласиться. В то же время Rust невероятно полезен для программирования игровых движков, оставляя постоянно развивающуюся логику игрового процесса для более гибких языков, таких как Lua.

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

Последними областями, где Rust может стать ключевым игроком, являются искусственный интеллект и машинное обучение. Большое количество кода написано на C и Python. Тем не менее, новые проекты могут извлечь выгоду из функций безопасности и параллелизма Rust для создания более отказоустойчивого и производительного кода. Совместимость Rust с Python не такая первоклассная, как с C, но это, возможно, стоит улучшить в ближайшее время. ИИ здесь, чтобы остаться, так что он может остаться с Rust ;)

С чего начать изучение Rust?

Вот несколько ресурсов для начала изучения Rust:

  1. Язык программирования Rust
  2. Программирование на Русте
  3. Ржавчина в действии
  4. Поваренная книга ржавчины
  5. Практическая ржавчина