Rust Programming Vocabulary: Essential Terms for IT Professionals (англійською)
Власність, перевірка позик, тривалість життя, риси — специфічний для Rust словник, який вам потрібен для читання документації, участі у перегляді коду і обговорення мови з впевненістю англійською мовою.
Rust має більш стриману криву навчання, ніж більшість мов — не тільки технічно, але й лінгвістично. Екосистема Rust використовує дуже специфічну термінологію, яка не відображає чисто концепції в Python, Go або Java. Якщо ви читаєте книгу про Rust, берете участь у обговореннях або пояснюєте Rust колегам, то знання цього словника допоможе вам у вирішенні багатьох проблем.
Власність і пам’ять
Власність — основна модель керування пам’ яттю Rust: кожне значення має єдиного власника (змінну), і значення скидається (звільняється), коли власник виходить за межі обсягу. Сміттєзбирального комбайна немає. Фраза: “Модель власності Rust виключає помилки використання після випуску на час компіляції.”
** Пересунути семантику ** — коли ви присвоюєте значення новій змінній або передаєте його функції, власник * пересувається * — початкова змінна більше не є чинною. Це називається ход. Фраза: “Після переміщення, початкова змінна анульована — ви не можете використовувати її знову.”
** Borrow checker ** — Компонент компілятора, який забезпечує дотримання правил власності та позики Rust під час компіляції. Якщо перевірка позики відкидає ваш код, це означає, що існує проблема з безпекою пам’ яті. Фраза: “Перевірка позики виявила перегони даних, які були б невидимі в C++.”
** Lifetime ** (вимова: * “life- time” *) — анотація, яка повідомляє компілятору, як довго посилання є чинним. Більшість життєвих циклів виводяться; явні анотації життєвого циклу використовують синтаксис 'a. Фраза: “Сигнатура функції має явні анотації про тривалість життя — повернене посилання не може пережити вхід.”
** Небезпечний блок ** — Розділ коду, позначений unsafe { }, де програміст бере на себе відповідальність за безпеку пам’ яті, обходячи деякі гарантії перевірки позики. Використовується рідко для FFI (Foreign Function Interface) або коду, що має критичне значення для швидкодії. Фраза: “Ми мінімізували небезпечний блок до точної арифметики вказівника, яка його вимагає.”
Типи і абстракції
Trait (вимова: “trayt”) — еквівалент Rust інтерфейсів або класів типів — набір методів, які може реалізувати тип. Характеристики дозволяють поліморфізм без успадкування. Фраза: “Ми визначили Serialisable рису і реалізували її для всіх типів доменів.”
** impl ** (вимова: * “im- pl” * або розмовне * “imp-ull” *) — Ключове слово, яке використовується для реалізації методів на типі або властивості для типу. Ви побачите impl MyStruct { } (вбудовані методи) і impl Trait for MyStruct { } (реалізація ознак). Фраза: “Блок impl Display контролює, як тип форматується з println!.”
** Абстракція нульової вартості ** — Принцип розробки Rust: використання абстракції високого рівня (ітератори, закриття, загальні) коштує не більше під час виконання, ніж еквівалентний написаний вручну код низького рівня. Фраза: “Ітератори Rust є абстракціями з нульовою вартістю — компілятор оптимізує їх до того ж асемблера, що і ручно написаний цикл.”
** Enum ** — Enum Rust може містити дані у кожному варіанті, що робить його набагато потужнішим, ніж enums у більшості мов. Два найважливіші вбудовані енуми — Option і Result. Фраза: “Модель можливих станів як енум, щоб компілятор намагався використовувати вичерпну обробку.”
** Результат і варіант ** — Result<T, E> означає успіх ( Ok(T) ) або невдачу ( Err(E) ). Option<T> означає присутність ( Some(T) ) або відсутність ( None ). Обидва замінюють винятки і нуль. Фраза: “Функція повертає Result — використовуйте ? для поширення помилок до викликаючого.”
Економіка та екосистема
Arc/Mutex (вимовляється: “ark” / “myoo-tex”) — Arc<T> (Atomically Reference Counted) дозволяє спільне володіння потоками. Mutex<T> забезпечує взаємне виключення для безпечного змінного доступу. Об’ єднано як Arc<Mutex<T>> для спільного змінного стану між потоками. Фраза: “Ми обгорнули кеш у Arc<Mutex<HashMap>>, щоб його можна було безпечно поділити між робочими потоками.”
** Безстрашна одночасність ** — маркетинговий термін Rust (і справжня можливість) для написання одночасного коду без перегонів даних, тому що перевірка позики забезпечує безпеку потоків під час компіляції. Фраза: “Безстрашна одночасність є одним з головних пунктів продажу Rust — компілятор відмовляється компілювати шкідливий код.”
Crate (вимова: “krayt”) — фундаментальний блок компіляції в Rust — еквівалент пакунку або бібліотеки в інших мовах. Книжковий ящик може бути бінарним (виконуваним) файлом або бібліотекою. Фраза: “Ми опублікували функції утиліти як окремий crate на crates.io.”
Cargo (вимова: “kar-go”) — офіційний менеджер пакунків і інструмент збирання Rust. Cargo керує залежностями, створює проекти, запускає тести і публікує скриньки. Фраза: “Запустити cargo clippy перед відкриттям PR — це ловить спільні проблеми стилю, які компілятор пропускає.”
Реальні фрази з Rust Code Reviews
-
- « Цей клон не потрібний — чи можете ви перебудувати його, щоб передати посилання замість нього? » *
- “Анотація про тривалість життя на рядку 42 неправильна — повернений шматок не може пережити
data.” -
- “Небезпечний блок більший, ніж він повинен бути — пересунути безпечну логіку за його межі.” *
-
- “Ця модель є ідіомою Rust — гарне використання ланцюга адаптера ітератора.” *
** Вправа: ** Прочитайте розділ про власника у * The Rust Book * (doc. rust- lang. org/ book) і напишіть п’ ятиречене пояснення семантики руху вашими власними англійськими словами. Потім порівняйте своє пояснення з офіційним текстом і зауважте, де відрізняється ваш словник.
На практиці: перетинаючи прогалини — словник для міжнародних розробників
Зрозуміти технічну термінологію - це одне; ефективно спілкуватися в професійному середовищі, особливо коли ваша перша мова не є англійською, може бути значно складніше. Багато розробників з неангломовного середовища відчувають себе втомленими, щоб зрозуміти нюанси в коментарях до перегляду коду або впевнено вносить свій внесок під час обговорення команди про унікальні можливості Rust. Це не просто про те, щоб знати визначення; це про розуміння як ці терміни використовуються і чому. Розглянемо деякі типові ситуації, де точне формулювання є критичним, особливо для розробників, які не володіють англійською мовою повністю.
Одна з найчастіших ситуацій виникає під час перегляду коду. Уявіть, що ви отримали такий коментар на запит збирання: « Ця функція має бути move -aware ». Тепер, просто перекладаючи « move- aware », ви не зможете його виконати. Нерідний мовець може зрозуміти слово «пересунути», але не наслідок - що функція повинна уникати передачі власності даних без потреби. Рецензент стверджує, що існує потенційна проблема з обробкою пам’ яті і власника, що є ключовою концепцією Rust. Краще було б сказати: «Чи можете ви, будь ласка, переглянути цю функцію, щоб переконатися, що вона не переміщує ніяких даних без явного призначення? Ми хочемо уникнути непотрібних розподілів і потенційних проблем з використанням. ” Формування запитів з точки зору дій – «перегляд», «забезпечення» – часто є яснішим, ніж просто вказування технічного терміну. Аналогічно, при написанні опису PR, використання активного голосу (“Ця функція тепер реалізує…”) зазвичай є більш прямим і легшим для інших, ніж пасивні конструкції (“Це було реалізовано…”).
Іншою областю, де важлива точність, є розмови Slack про вибір дизайну. Припустимо, що ви обговорюєте використання рис з колегою: « Давайте спробуємо використати об’ єкти рис у цьому випадку ». Сам термін « об’ єкт рис » може здатися абстрактним і залякуваним. Доступнішим поясненням може бути таке: « Використання об’ єктів рис дозволяє нам обробляти різні типи взаємозамінно, якщо вони реалізують ті ж риси — це надає нам більшу гнучкість у нашому дизайні без необхідності написання окремих функцій для кожного типу. » Сфокусування на * перевагах * — « більшій гнучкості » — часто допомагає прояснити складні поняття. Важливо уникати жаргону, якщо це не абсолютно необхідно, і, коли ви використовуєте технічні терміни, завжди будьте готові коротко їх пояснити.
Нарешті, пам’ятайте, що перевірка позик Rust - це не просто розчарований охоронець; це механізм безпеки. Пояснення його призначення вимагає обережного вимови. Замість того, щоб сказати « Перевірка позик запобігає перегонам даних », спробуйте сказати: « Перевірка позик накладає правила на доступ до пам’ яті, щоб запобігти потенційним проблемам, таким як перегони даних і вивисання вказівників — забезпечуючи, що наш код залишається безпечним і надійним. » Зрозуміння того, * чому * існують правила, допомагає збудувати довіру, навіть якщо технічні деталі є складними.
Ось приклад того, як cargo check можна використовувати для перевірки коду на наявність потенційних проблем з перевіркою позики:
cargo check --all
Ця команда зібере ваш проект Rust і повідомить про всі помилки, пов’ язані з власником або позиченням. Вивід часто містить корисні повідомлення, які, якщо трохи попрацювати, ви зможете почати інтерпретувати як рекомендації щодо покращення безпеки вашого коду.