Hello, World!

Після встановлення Rust настав час написати першу програму цією мовою. Давно стало традицією при вивченні нової мови програмування писати маленьку програму, що виводить на екран текст Hello, world!, і ми не будемо відступати від цієї традиції.

Примітка: ця книжка передбачає базове знайомство із командним рядком. Rust як така не висуває особливих вимог до редакторів, інструментів і розміщення коду, тому якщо вам зручніше використовувати інтегроване середовище розробки (IDE) замість командного рядка, можете користуватися вашим улюбленим IDE. Багато сучасних IDE певною мірою підтримують Rust; зверніться до документації IDE, щоб дізнатися більше. Останнім часом команда Rust зосередилася на підтримці IDE за допомогою rust-analyzer. Перегляньте Додаток D, для більш докладної інформації.

Створення теки проєкту

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

Запустіть термінал і введіть такі команди, щоб створити теку projects та теку для проєкту “Hello, world!” усередині теки projects.

У 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:

Файл: main.rs

fn main() {
    println!("Hello, world!");
}

Блок коду 1-1: програма, що виводить Hello, world!

Збережіть цей файл і поверніться до вікна термінала у теці ~/projects/hello_world. На Linux або macOs наберіть такі команди, щоб скомпілювати та запустити файл:

$ rustc main.rs
$ ./main
Hello, world!

У Windows запустіть команду .\main.exe замість ./main:

> rustc main.rs
> .\main.exe
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!");
}

Цей рядок виконує всю роботу в цій маленькій програмі: виводить текст на екран. Тут треба зазначити чотири важливі деталі.

По-перше, у Rust заведено робити відступи в чотири пробіли, а не табуляцію.

По-друге, println! викликає макрос Rust. Якби він викликав функцію, то це виглядало б як println (без !). Ми поговоримо про макроси в Rust детальніше в Розділі 19. Поки що вам достатньо знати, що коли ви бачите !, це означає, що ви викликаєте макрос, а не звичайну функцію, і що макроси не завжди дотримуються тих самих правил, що функції.

По-третє, ви бачите стрічку 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 ви побачите два файли. У PowerShell на Windows ви побачите ті ж три файли, що й за допомогою CMD. У CMD на Windows ви побачите таке:

> dir r /B %= опція /B означає показувати лише імена файлів =%
main.exe
main.pdb
main.rs

Тут показано вихідний файл з розширенням .rs, виконуваний файл (main.exe на Windows, але просто main на інших платформах) і, на Windows, файл з інформацією для зневадження з розширенням .pdb. Тепер можна запустити main чи main.exe, ось так:

$ ./main  # чи .\main.exe у Windows

Якщо main.rs - це ваша програма "Hello, world!", вона виведе Hello, world! у ваш термінал.

Якщо ви більше знайомі з динамічними мовами на кшталт Ruby, Python чи JavaScript, вам може бути незвичним, що компіляція і виконання програми - окремі кроки. Rust є завчасно компільованою мовою, тобто ви можете скомпілювати програму, передати виконуваний файл комусь іншому, і він зможе запустити її навіть якщо у нього не встановлено Rust. Якщо ви передаєте комусь файл .rb, .py чи .js, йому, натомість буде потрібна встановлена реалізація мови Ruby, Python чи Javascript (відповідно), але в тих мовах потрібна лише одна команда, щоб скомпілювати та запустити вашу програму. Всі переваги мови програмування мають свою ціну.

Проста компіляція за допомогою rustc годиться для простеньких програм, але зі зростанням вашого проєкту вам захочеться мати можливість керувати всіма параметрами і легко ділитися кодом. Наступний крок - інструмент Cargo, що допоможе вам писати програми Rust для реального світу.