Hello, World!
Rust установлен — пора написать первую программу. По традиции, изучая новый
язык, первым делом пишут маленькую программу, которая выводит на экран текст
Hello, world!. Так поступим и мы!
Примечание: мы предполагаем, что вы хотя бы немного знакомы с командной
строкой. Rust не предъявляет особых требований к редактору, инструментам или
месту, где лежит код, так что если вам удобнее IDE, а не командная строка, —
пользуйтесь любимой IDE. Сейчас многие IDE в той или иной мере поддерживают
Rust; подробности ищите в документации вашей IDE. Команда Rust вкладывается в
хорошую поддержку IDE через rust-analyzer. Подробнее об этом — в
приложении D.
Папка для проекта
Начнём с папки, где будет лежать код на Rust. Самому Rust всё равно, где находится ваш код, но для упражнений и проектов из этой книги мы советуем создать в домашнем каталоге папку projects и держать все проекты в ней.
Откройте терминал и введите следующие команды: они создадут папку projects, а внутри неё — папку для проекта «Hello, world!».
В Linux, macOS и PowerShell в Windows:
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world
В Windows CMD:
> mkdir "%USERPROFILE%\projects"
> cd /d "%USERPROFILE%\projects"
> mkdir hello_world
> cd hello_world
Основы программы на Rust
Теперь создайте файл с исходным кодом и назовите его main.rs. Файлы Rust всегда имеют расширение .rs. Если в имени файла несколько слов, их принято разделять подчёркиванием: например, hello_world.rs, а не helloworld.rs.
Откройте только что созданный файл main.rs и введите код из листинга 1-1.
fn main() {
println!("Hello, world!");
}
Hello, world!Сохраните файл и вернитесь в терминал, в папку ~/projects/hello_world. В Linux или macOS скомпилируйте и запустите программу так:
$ rustc main.rs
$ ./main
Hello, world!
В Windows вместо ./main введите .\main:
> rustc main.rs
> .\main
Hello, world!
В какой бы ОС вы ни работали, в терминале должна появиться строка
Hello, world!. Если её нет, загляните в часть «Решение
проблем» раздела об установке — там написано,
где искать помощь.
Если Hello, world! появилась — поздравляем! Вы официально написали программу
на Rust, а значит, стали программистом на Rust. Добро пожаловать!
Из чего состоит программа на Rust
Разберём программу «Hello, world!» по частям. Вот первый кусочек:
fn main() {
}
Эти строки определяют функцию с именем main. Функция main особенная: в
любой исполняемой программе на Rust она запускается первой. Здесь первая
строка объявляет функцию main, у которой нет параметров и которая ничего не
возвращает. Если бы параметры были, они бы стояли в круглых скобках (()).
Тело функции заключено в фигурные скобки {}. В Rust они обязательны вокруг
тела любой функции. Хорошим тоном считается ставить открывающую скобку на той
же строке, что и объявление функции, через один пробел.
Примечание: если хотите придерживаться единого стиля во всех проектах на
Rust, воспользуйтесь утилитой автоматического форматирования rustfmt —
она приведёт код к стандартному виду (подробнее о rustfmt — в
приложении D). Команда Rust включила её в
стандартную поставку Rust, как и rustc, так что она у вас, скорее всего,
уже установлена!
В теле функции main находится такой код:
#![allow(unused)]
fn main() {
println!("Hello, world!");
}
Эта строка и делает всю работу в нашей маленькой программе — выводит текст на экран. Здесь стоит обратить внимание на три важные детали.
Во-первых, println! — это вызов макроса Rust. Если бы вызывалась функция, мы
бы написали println (без !). Макросы в Rust — это способ писать код,
который генерирует другой код и тем самым расширяет синтаксис языка. Подробнее
мы поговорим о них в главе 20. А пока достаточно
знать: ! означает, что вызывается макрос, а не обычная функция, и что
макросы подчиняются не совсем тем же правилам, что функции.
Во-вторых, в коде есть строка "Hello, world!". Мы передаём её как аргумент в
println!, и макрос выводит её на экран.
В-третьих, строка кода заканчивается точкой с запятой (;). Она означает, что
это выражение закончилось и можно начинать следующее. Большинство строк кода
на Rust заканчиваются точкой с запятой.
Компиляция и запуск
Вы только что запустили новую программу — давайте разберём, что при этом происходило на каждом шаге.
Прежде чем запустить программу на Rust, её нужно скомпилировать компилятором
Rust: выполнить команду rustc и передать ей имя файла с исходным кодом:
$ rustc main.rs
Если вы писали на C или C++, то заметите, что это похоже на gcc или
clang. После успешной компиляции Rust создаёт исполняемый бинарный файл.
В Linux, macOS и PowerShell в Windows исполняемый файл можно увидеть командой
ls:
$ ls
main main.rs
В Linux и macOS вы увидите два файла. В Windows файлов будет три — и в
PowerShell, и в CMD. В CMD вместо ls нужно ввести:
> dir /B %= ключ /B говорит выводить только имена файлов =%
main.exe
main.pdb
main.rs
Здесь мы видим файл с исходным кодом (расширение .rs), исполняемый файл (main.exe в Windows и просто main на остальных платформах), а в Windows ещё и файл с отладочной информацией с расширением .pdb. Теперь запустите main или main.exe:
$ ./main # или .\main в Windows
Если в main.rs лежит программа «Hello, world!», эта команда выведет в
терминал Hello, world!.
Если вы больше привыкли к динамическим языкам вроде Ruby, Python или JavaScript, вам может быть непривычно, что компиляция и запуск — это отдельные шаги. Rust — язык с предварительной компиляцией (ahead-of-time compiled): вы один раз компилируете программу и получаете исполняемый файл. Его можно отдать кому угодно, и он запустится даже там, где Rust не установлен. А вот если отдать кому-то файл .rb, .py или .js, у него должен быть установлен Ruby, Python или JavaScript соответственно. Зато в этих языках достаточно одной команды, чтобы и скомпилировать, и запустить программу. В дизайне языков всё — компромисс.
Для простых программ вполне хватит одного rustc. Но когда проект
разрастётся, вам понадобится управлять множеством настроек и удобно делиться
кодом с другими.
Дальше мы познакомимся с Cargo — инструментом, который поможет писать
настоящие, «боевые» программы на Rust.