Main rust что это

Обновлено: 07.07.2024

Первый шаг в написании своей ОСи — создание бинарника, не зависящего от стандартных библиотек, это делает возможным запуск кода без ОС — мы же пишем свою.

Оригинал блога разрабатывается на GitHub. Замечания к оригиналу оставляйте на странице Issues репозитория выше, а к переводу — в личке, комментариях или тут. Код, написанный в этой статье, содержится в ветке post-01 .

Типы данных

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

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

Указав между именем переменной и ее значением : &[type] , мы явно определим тип для этой переменной.

В этом случае наш пример с объявлением my_name будет переписан следующим образом:

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

Допустим, имеется переменная answer , которая записывает ответ пользователя в форму.

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

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

Основные типы на Rust:

  • Integer: целочисленный (целые числа).
  • Float: числа с плавающей запятой (с десятичными знаками).
  • Boolean: логический (булев) с выбором между двумя вариантами ( true или false ).
  • String: строковый (набор символов, заключенных в кавычки).
  • Char: скалярное значение Юникод, представляющее конкретный символ.
  • Never: тип без значения (обозначается как ! ).

Атрибут no_std

Сейчас код собирается с использованием стандартной библиотеки. Это поведение можно выключить с помощью атрибута no_std :

Если попробовать собрать проект, получим ошибку:

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

Так что удалим вывод и снова попробуем запустить сборку:

Вступление

Для того, чтобы написать свою ОС, нам нужен код, не зависящий от библиотек или функций другой операционной системы. Это значит, что мы не можем использовать потоки исполнения (threads), файлы, память в куче (heap), сеть, вывод в терминал и так далее. Но это можно преодолеть, написав свою ОС и драйвера.

Мы не можем использовать большую часть стандартной библиотеки Rust, но также есть много функций, которые мы можем использовать. Например итераторы, замыкания, сопоставление с образцом, Option и Result, форматирование строк, и конечно же, концепцию владения. Это позволит написать своё ядро в высокоуровневом стиле, не заботясь о неопределённом поведении или безопасности памяти.

Эта статья рассказывает, как создать автономный исполняемый файл и почему это необходимо. Если нужен только пример, можно прокрутить до части "Заключение".

Зачем изучать Rust?

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

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

Владение

Владение — это центральная особенность Rust и одна из причин такой его популярности.

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

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

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

Вот эти правила владения.

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

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

Главный вывод касается разного использования s и x . Сначала x владеет значением 5 , но после выхода ее из области видимости функции main() переменная x должна передать владение параметру number . Ее использование в качестве параметра позволяет продолжить область видимости выделения памяти под значение 5 за пределы исходной функции.

С другой стороны, переменная s не используется в качестве параметра и поэтому память для нее остается выделенной только тогда, когда программа находится внутри function() . По завершении function() значение s никогда больше не потребуется и для высвобождения памяти от него избавляются.

Отключение стандартной библиотеки

По умолчанию скомпилированный код собирается с участием стандартной библиотеки, которой нужна ОС для реализации таких функций, как файлы, сеть и т.д. Также она зависит от стандартной библиотеки С: libc , которая еще больше использует фичи ОС. А так как мы пишем программу, которая заместит собой обычную ОС, это нам не подходит. Нужно отключить библиотеки с помощью no_std .

Сначала создадим проект с помощью Cargo. Это делается с помощью коммандной строки:

Я назвал проект os-in-rust (для избегания путаницы с оригинальным блогом), но можно выбрать любое имя. Флаг --bin говорит, что нужен проект, который будет собираться в исполняемый файл, а не в библиотеку. --edition 2018 значит, что нужно использовать именно редакцию Rust 2018. Cargo сгенерирует такую структуру папок:

Файл Cargo.toml содержит конфигурацию: название проекта, автор, версию и зависимости. В src/main.rs содержится код, который выполнится, когда мы запустим скомпилированный бинарник. Компилируется он коммандой cargo build , а исполняемый файл будет в папке target/debug .

Сборка для "железа"

По умолчанию Rust пробует создать исполняемый файл для вашей платформы. Если вы используете Windows на x86-64 , Rust создаст .exe с инструкциями для архитектуры x86-64 . Это называется целевая платформа.

Для различания платформ Rust (да и многие другие инструменты) использует target triples. Чтобы увидеть эту строку для вашего ПК, надо выполнить rustc --version --verbose :

Это вывела данная команда на моей системе (Linux x86-64). Параметр, который нас интересует — host . Он говорит, что:

  • система на базе x86-64 ,
  • ОС: Linux, : GNU

Компилируя для такой платформы, Rust думает, что бинарник будет исполняться на какой-нить операционной системе (в моем случае, Linux) и использует системные библиотеки ( libc , libunwind и другие). Чтобы не было ошибок сборщика, надо компилировать под другую целевую платформу.

Примером такой платформы является thumbv7em-none-eabihf , что означает встраиваемая система на базе ARM. Детали нас не интересуют, главное то, что там нет ОС ( none ). Чтобы иметь возможность компиляции под данную платформу, надо добавить её с помощью Rustup:

Теперь можно скомпилировать код:

Используя флаг --target , мы кросс-компилируем код для другой платформы. Так как написано, что нету операционной системы, сборщик даже не пробует найти библиотеки.

Это тот способ, который мы будем использовать. Но вместо thumbv7em-none-eabihf мы создадим кастомное описание платформы для x86-64 . Детали будут в следующей статье (которую я пока не перевел), а пока можно почитать оригинал. Если не ошибаюсь, эти статьи также переводил m1rko, но не могу найти эту (да и любую).

Условные инструкции

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

Все условные инструкции содержат проверяемую переменную и целевое значение, а оператор условия ( == , < или > ) определяет их соотношение. В зависимости от состояния переменной применительно к целевому значению возвращается одно из двух логических выражений: true («истинно»), если переменная удовлетворяет целевому значению, и false («ложно»), если нет.

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

Это пример условного оператора if . Фактически происходит вот что: если hasAccount соответствует false , учетная запись будет создана. И пользователь будет в ней авторизован независимо от того, уже имелась у него учетная запись или нет.

Вот как выглядит формат оператора if :

Есть три основных условных оператора: if , if else и while .

  • if : если условие истинно, происходит выполнение. В противном случае пропускаем и идем дальше.
  • if else : если условие истинно, выполняется тело кода A. В противном случае выполняется тело кода B.
  • while : тело кода многократно выполняется, пока условие true («истинно»). Как только условие становится false («ложным»), мы идем дальше.

Совет💡 необходимо, чтобы в циклах while проверяемая переменная была изменяемой. Если переменная никогда не меняется, такой цикл будет продолжаться бесконечно.

Ошибки сборщика

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

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

Структуры

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

Аналогом этих структур в таких языках, как Java и Python, являются классы.

Вот синтаксис объявления структуры:

  • struct сообщает Rust, что следующее объявление определит тип данных struct.
  • [identifier] — это имя типа данных, используемого при передаче параметров, таких как string или i32 , в строковые и целочисленные типы соответственно.
  • <> эти фигурные скобки обозначают начало и конец переменных, необходимых для структуры.
  • [fieldName] — это место, где вы называете первую переменную, которую должны иметь все экземпляры этой структуры. Переменные внутри структуры называются полями.
  • [fieldType] — это место, где во избежание путаницы явно определяется тип данных переменной.

Например, создадим структуру struct Car , которая включает в себя переменную строкового типа brand и переменную целочисленного типа year .

Каждый создаваемый экземпляр типа Car должен иметь значения для этих полей. Поэтому создадим экземпляр Car для конкретного автомобиля со значениями для brand (модели) и year (года выпуска).

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

Оттуда будем использовать значения этих полей с синтаксисом [variableIdentifier].[field] . Rust интерпретирует эту инструкцию как «каково значение [поля] для идентификатора [переменной]?».

Вот как выглядит вся структура целиком:

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

Переменные и их изменяемость

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

Имя переменной должно быть информативным, т. е. описывать, чем является ее значение. Например:

Здесь создана переменная my_name со значением "Ryan" .

Совет💡 Всегда давайте переменным названия, начинающиеся со строчной буквы, а новое слово начинайте с заглавной.

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

Например, вот этот код выдаст ошибку во время компиляции:

Ошибка в строке 4, где мы попытались установить значение x = 6 . Но значение x уже задано в строке 2 и изменить его нельзя.

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

Представьте, что у вас есть две функции: functionA , которая использует переменную, имеющую значение 10 , и функция functionB , которая изменяет эту же переменную. Выполнение функции functionA будет прервано!

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

Чтобы переопределить это значение по умолчанию и создать изменяемую переменную, объявим ее вот так:

Изменяемые переменные чаще всего используются как переменные-итераторы или как переменные в структурах цикла while .

Заключение

Код для минимального бинарника, что запустится на голом железе выглядит так:

Для сборки — эта команда:

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

Игорь Королевский

Кирилл Владимирович

Набор в команду

Добавить в беседу

Беседа

Дискорд

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

Призы за ивент получили игроки _HHru_, Zush, Monwes, xXMorty69Xxx

Так же вновь было доработано правило 4.10:
Отныне наказание будут получать не только владельцы варпов, но и люди, которые гриферят варпами, нарушающими правила.

Даня Пащинский


Даня Пащинский

Амир Амиров


Амир Амиров

Михаил Фоменко

Владислав Зорин


Владислав Зорин

Дмитрий Карпов


Дмитрий Карпов

Артем Якушков

Администрация сервера забыл уже давно но серовно. У меня бан был я купил разбан но у меня было 2 бана типо за Тим с читером и за 1.7 я снова купил разбан и мне не выдался Рабан могу кинуть скрины ник fondick2009

Артем Якушков

В этом вайпе произошли хоть и незначительные, но важные обновления:
Показать полностью.

- Из грузов на анархии убраны рамки портала
- Исправлена карта для дуэлей "River 3" на грифе
- Оптимизирована работа сервера

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

Анархия
1 место - Яйцо призыва визер-скелета
2 место - Яйцо призыва магмокуба
3 место - Яйцо крипера

Гриф
1 место - Маяк
2 место - Кит мега
3 место - Кит ультра

Полина Смирнова


Полина Смирнова

Матвей Сокольцов

Александр Невский

Вова Зеников


Вова Зеников

Vlad Moroz

Артем Афанасьев


Артем Афанасьев

Адилет Адилгалиев


Адилет Адилгалиев

Амир Амиров


Амир Амиров хахахахаха, я залетел меня чуть не трахнули и ливнул от них на эльках так все и было

Полина Смирнова


Полина Смирнова

Список основных изменений:
Ликвидирован внутриигровой магазин с вещами для ПВП - /shop;
Обновлены киты на анархии (стали намного более сбалансированные + убраны рамки портала);
Показать полностью.
Восстановлен бот;
Значительно улучшена работа АнтиЧита;
Исправлены все дюпы;
Пофикшены все известные баги/недочеты.

Никита Карастелин


Никита Карастелин

Амир Амиров


Амир Амиров

Артем Гайдук


Артем Гайдук

Амир Амиров


Амир Амиров

Артем Мовшук

неужели майнтраст встанет с колен на новую дорогу. удачи вам парни

Данил Сарапулов


Данил Сарапулов

*С уважением, куратор команды проекта Игорь Королевский, Venlesss. Всем хорошего дня и вечера.

RUST ROOM

Rust Room — это улучшенный классический сервер в Rust с продуманной блокировкой доната.

Вайп каждую пятницу в 14:00 по МСК

Rust Room [Main] connect 213.5.228.59:10000
Rust Room [Mondays]: connect 213.5.228.46:10000

Информация

Блокировка доната

Правила

RUST ROOM

RUST ROOM запись закреплена

Результаты розыгрыша 30.10

Александр Лебедев


Александр Лебедев

Реализация panic!()

Атрибут panic_handler говорит языку, что эту функцию нужно вызвать, если произошла паника (вызов panic!() ). В стандартных библиотеках она есть, но в среде no_std надо её создать самим:

Введение в программирование на Rust


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

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

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

Вот что мы рассмотрим в статье.

  • Что такое Rust?
  • «Hello World!» на Rust.
  • Основы синтаксиса Rust.
  • Промежуточный Rust: владение и структуры.
  • Система сборки Rust: Cargo.
  • Продвинутые концепции для дальнейшего изучения.

eh_personality

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

Элемент языка eh_personality помечает функцию, которая используется для реализации "разматывания" стека вызовов. По умолчанию Rust использует это для вызова деструкторов всех переменных на стеке в случае паники, чтобы освободить всю использованную память. Но это сложный процесс, которому требуются библиотеки, специфические для каждой ОС ( libunwind на Linux и структурированная обработка исключений на Windows), то мы не будем это использовать.

Выключение разматывания

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

Это устанавливает стратегию обработки паники в значение abort и для профиля dev (используется при вызове cargo build ), и для профиля release ( cargo build --release ). Теперь нам не нужен eh_personality .

Мы пофиксили обе ошибки. Но теперь есть новая:

Функции

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

Пока что мы использовали только базовую функцию main() . Rust также позволяет создавать дополнительные, собственные функции, и это очень важная для большинства программ возможность. Функции часто представляют собой одну повторяющуюся задачу, например addUser (добавление пользователя) или changeUsername (изменение имени пользователя). Эти функции затем повторно используются всякий раз, когда требуется выполнить то же самое поведение.

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

Вот формат для объявления функции:

fn

Это уже знакомое нам сокращение от function («Функция»). За ним в коде Rust следует объявление функции.

[functionName]

Здесь находится идентификатор функции, который будет использоваться при ее вызове.

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

[parameterIdentifier]

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

[parameterType]

После параметра необходимо явно указать тип. Во избежание путаницы неявная типизация параметров в Rust запрещена.

Фигурные скобки обозначают начало и конец блока кода. Код внутри скобок выполняется при каждом вызове идентификатора функции.

[functionBody]

А это заполнитель для кода функции. Лучше не включать сюда никакого кода, не связанного прямо с выполнением задачи функции.

Добавим немного кода. Переделаем hello-world в функцию say_hello() :

Совет💡 Увидели () — значит, вы имеете дело с вызовом функции. Если параметров нет, получаем внутри скобок пустое поле параметров. Сами скобки все равно остаются, указывая на то, что это функция.

Функция создана, теперь вызовем ее из других частей программы. Программа начинается в main() , поэтому вызовем say_hello() оттуда.

Вот как будет выглядеть полная программа:

Что такое Rust?

Rust — это мультипарадигмальный статически типизированный язык программирования с открытым исходным кодом, используемый для создания операционных систем, компиляторов и других программно-аппаратных средств. Он был разработан Грейдоном Хором в Mozilla Research в 2010 году.

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

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

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

«Hello World!» на Rust

Лучший способ освоить Rust — реальная практика. Для начала напишем первую программу hello-world .

Разберем все части этого кода.

fn

fn — это сокращение от function («Функция»). В Rust (как и в большинстве других языков программирования) функция как бы говорит: «Сообщите мне информацию, а я сделаю то-то и то-то и затем дам ответ».

main

Функция main — это то место, где начинается программа.

Скобки содержат список параметров для этой функции. Сейчас он пуст, то есть параметров нет. Но скоро мы увидим много функций с параметрами.

Фигурные скобки. Ими обозначается начало и конец тела кода. Тело сообщает, что делает функция main .

println!

Это макрос, который очень похож на функцию. Он печатает и добавляет новую строку. Пока что считайте println функцией. Разница лишь в восклицательном знаке ( ! ) на конце этого макроса.

("Hello, world!")

А это список параметров для вызова макроса. Мы как бы говорим: «Вызовите макрос println с этими параметрами». Макрос println такой же, как функция main , только у него параметр вместо списка параметров. Позже мы еще увидим функции и параметры.

"Hello, world!"

Дальше идет строка. Строки состоят из нескольких собранных вместе букв или символов. Для обозначения строки эти символы помещаются в кавычки ( " ). Затем строки передаются для макросов типа println! и других функций, с которыми мы еще поиграем.

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

Атрибут start

В типичном исполняемом файле Rust исполнение начинается в библиотеке, которая называется crt0 , что настраивает среду для исполнения кода на С. Это, помимо прочего, включает в себя создание стека и укладывание параметров в правильные регистры. Потом среда С вызывает среду Rust в месте, помеченным start , Rust инициализируется, и только потом вызывает main() .

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

Переопределение точки входа

Мы удалили функцию main() , так как она все равно не вызывается. Вместо нее надо определить функцию _start :

Также надо пометить функцию extern "C" , это говорит компилятору, что функцию надо вызывать с помощью конвенции С, а не Rust (которая еще и изменяться, видно, может, так как по ней нету документации). Название такое в функции потому, что это название точки входа по умолчанию на большинстве систем.

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

Теперь, если сделать cargo build , мы получим ошибку сборщика.

Основы синтаксиса Rust

Теперь рассмотрим основные части программы на Rust и способы их реализации.

Промежуточный Rust: владение и структуры

Система сборки Rust: Cargo

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

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

Если скачать Rust с официального сайта, Cargo автоматически устанавливается вместе с компилятором ( rustc ) и генератором документации ( rustdoc ) как часть набора инструментальных средств Rust. Убедиться, что Cargo установлен, помогает ввод в командной строке следующей команды:

Для создания проекта с Cargo запустите в интерфейсе командной строки операционной системы следующее:

Первой командой создается новый каталог hello_cargo . А второй командой этот новый каталог выбирается.

Генерируется манифест под названием Cargo.toml , который содержит все метаданные, необходимые Cargo для компиляции пакета, а также файл main.rs , отвечающий за компиляцию проекта.

Чтобы все это увидеть, наберите:

Перейдите к местоположению вашего каталога и откройте файл Cargo.toml . Внутри вы найдете информацию о проекте. Выглядит это следующим образом:

Все зависимости приведены в категории dependencies .

После завершения проекта введите команду $ cargo run : проект будет скомпилирован и запущен.

Комментарии

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

Второй способ — предварять комментарий косой чертой со звездочкой /* и завершать его звездочкой с косой чертой */ . Преимущества такого способа оформления комментариев: 1) есть возможность помещать комментарии в середину строки кода и 2) так легче писать многострочные комментарии. Недостаток в том, что во многих случаях приходится задействовать больше символов, чем просто // .

Совет💡 используйте комментарии для «закомментирования» разделов кода, выполнение которых не требуется, но которые позже понадобится добавить.

Продвинутые концепции для дальнейшего изучения

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

Читайте также: