Начало работы с Rust в программировании для Windows

Может ли Microsoft отказаться от использования C, C ++ и C # на другие языки? В недавнем сообщении в блоге Microsoft Security Response Center (MSRC) было высказано предположение, что он, возможно, рассматривает альтернативы с целью снижения рисков для своего кода. Как отметил Гэвин Томас, главный инженер по безопасности в MSRC, одной из основных причин ошибок в коде Microsoft, о которых сообщается в MSRC, является повреждение памяти, ошибки, которые позволяют перезаписывать память или получать доступ к тому, что должно быть защищено.

Сохранение памяти в безопасности

Безопасность памяти долгое время была серьезной проблемой, но статистическая работа, проведенная MSRC, показывает, что проблема не исчезнет. У вас есть множество инструментов, помогающих писать безопасный код, от собственного жизненного цикла безопасной разработки Microsoft до использования новых языков, безопасных для памяти, таких как C #. Но у этих подходов есть свои компромиссы: код, который они создают, медленнее и работает на более высоком уровне, чем C ++.

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

Понятно, что подходы, обеспечивающие безопасность памяти, используемые языками более высокого уровня, не работают на системном уровне. Многие проблемы, которые преследовали неудачный проект Microsoft Longhorn, были вызваны попытками создать всю ОС на платформе .NET. Итак, как мы можем сделать безопасность памяти основой разработки системы?

Представляем Rust

Ответ приходит с новым поколением языков системного программирования, таких как Go и Rust, языков с безопасным для памяти дизайном .Net со скоростью C и C ++. Microsoft уже широко использует Go в Azure, потому что это язык, на котором написан Kubernetes. Но эти подходы еще не вошли в Windows, где C ++ по-прежнему является королем системного программирования.

В своем сообщении в блоге Томас приводит аргументы в пользу использования Mozilla Rust в качестве безопасного системного языка для Windows. Это интересное предложение, и оно уже получило одно серьезное доказательство в свою пользу: разработчик языка Mozilla уже использует его в своих последних выпусках веб-браузера, где он поддерживает движки рендеринга Mozilla текущего и следующего поколения. Другие крупные пользователи Rust включают репозиторий модулей JavaScript NPM, Dropbox и Oracle. Даже Microsoft уже использует его с кодом Rust в некоторых инструментах Azure IoT Edge.

Настройка среды разработки Windows Rust

Очевидное место для начала разработки на Rust - это Visual Studio Code. На его торговой площадке Extensions вы можете найти несколько расширений, которые устанавливают Rust Language Server и которые имеют полную языковую поддержку, а также инструменты для создания ваших приложений Rust из Visual Studio Code. Я использовал официальное расширение Rust от языковой команды Rust. Другие инструменты предоставляют поддержку фрагментов кода для запуска разработки, а также дополнительные инструменты отладки и тестирования. Есть даже инструменты для создания документации для вашего кода. Стоит установить пакет расширений Rust как часть среды Visual Studio Code Ruse, так как он добавляет дополнительные инструменты для работы с собственными инструментами разработки Rust.

Сначала вам нужно установить компилятор Rust и менеджер пакетов Cargo. Официальный сайт установки Rust определит используемую вами версию Windows и предоставит соответствующую загрузку. Есть даже инструкции по установке Rust в подсистеме Windows для Linux (WSL), если вы используете WSL как часть цепочки инструментов разработки Unix. При запуске установщика Rustup загружаются языковые компоненты и устанавливается ПУТЬ Windows . У вас есть возможность настроить установку, но на практике лучше принять значения по умолчанию.

Понимание Rust и безопасности памяти

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

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

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

Будущее Rust в Windows

Важно помнить, что Rust все еще молодой язык, и многого из того, что вы считаете само собой разумеющимся при разработке Windows, не существует. Нет прямой интеграции с Win32 или другими основными пакетами Windows SDK, и вы не найдете никакой поддержки инструментов Windows GUI без установки дополнительных библиотек. Однако это не такая большая проблема, как вы могли подумать: Rust, как и Go, является языком системного программирования. Это инструмент низкого уровня, быстрый и безопасный. Это делает его идеальным для создания кода, который манипулирует вашими данными, обрабатывает числа и обрабатывает массивы. Вместо использования подпрограмм C ++, где вы работаете с большими объемами памяти, используйте Rust, уменьшая риск, связанный с повреждением памяти.

Если вы действительно хотите разрабатывать приложения с графическим интерфейсом пользователя на Rust, у вас есть возможность использовать одну из нескольких библиотек пользовательского интерфейса. Возможно, самым простым в использовании является Kiss-ui, который поддерживает разработку графического интерфейса как для Windows, так и для Linux, с доступом к Win32 API, а также с поддержкой кросс-платформенного GTK. Другие библиотеки добавляют более глубокую поддержку Win32 API.

Даже если Microsoft в конечном итоге не поддержит Rust напрямую, сообщество поддержит его. Хотя для сборки полной цепочки инструментов все еще может быть вопрос выбора различных элементов, которые вам нужны, и использования таких инструментов, как Rustup, для их установки, появление расширений кода Visual Studio и пакетов расширений, похоже, упростит процесс. Регулярные обновления показывают, что это очень живой проект, над которым работают команда Rust и множество сторонних разработчиков.

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

Помимо Windows, Rust является ключевым языком для разработки WebAssembly и должен помочь предоставить гораздо более мощные веб-приложения в предстоящем выпуске Edge на базе Chromium - еще одна причина, по которой следует внимательно изучить его.