Мова програмування rust: виключення і загальні висновки

винятки
Мова програмування Rust: виключення і загальні висновки

У Rust застосовується незвичайна система роботи з винятками. Виклик макроса fail! (~ Рядок) або конструкції assert! породжує виключення і призводить до відкоту стека викликів, примусового виклику деструкторів об`єктів, звільнення пам`яті і завершення поточного потоку. Перехопити виняток всередині потоку неможливо: виникнувши, воно завжди приводить до його зупинки, але можна обробити виняток в батьківському потоці. Для цього існує досить заплутана комбінація з функції try і варіантів виклику spawn, spawn_supervised і spawn_unlinked. Ідея в тому, що за замовчуванням (spawn) виключення дочірніх потоків пере-даються в батьківський і вбивають його. При виклику spawn_supervised батьківський потік може обробити виняток і продовжити виконання. При виклику spawn_unlinked виключення взагалі не передається батькові чи матері (потік повністю ізольований). Функція try застосовується досить хитромудро - її треба вказати при породженні потоку:
let result: Result = do task :: try {
if some_condition () {
calculate_result ()
} Else {
// Викидаємо виняток
fail! (~ "oops!");
}
};
// Ловимо виняток і друкуємо інформацію про нього
assert! (result.is_err ()) -

Механізм роботи з винятками в Rust здався мені занадто заплутаним і не інтуїтивним. Можливо, це справа звички, але в більшості інших мов виключення працюють інакше, що серйозно збільшує «бар`єр входження».

макроси

У Rust є можливість генерації коду під час компіляції за допомогою синтаксичних макросів. У коді програми макроси легко впізнати по суффиксу «!» Після їх імені. При побіжному ознайомленні мову макросів за складністю і заплутаності може скласти гідну конкуренцію «шаблонної магії» в С ++. За допомогою макросів, зокрема, реалізовані інструкції fmt! і assert !.

Модулі та кліті

Поняття модулів знайоме кожному, хто працював з мовами Python або Pascal. Воно інтуїтивно зрозуміло і означає якусь окрему зону видимості для символів, яку можна імпортувати в поточний контекст і використовувати. Кожен окремий файл в Rust стає однойменною модулем. Крім того, модулі можна створювати ключовим словом mod:
mod farm {
pub fn chicken () -gt; str { "Чірік-чірік!" }
priv fn cow () -gt; str { "Мууу!" }
}

Ключові слова priv і pub визначають область видимості символів при імпорті модуля. За замовчуванням всі символи публічно доступні. Імпорт здійснюється за допомогою ключового слова use:
use farm :: chicken-

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

У Rust є також незвичайне поняття «кліть» (crate). Кліть - це незалежна одиниця компіляції і компоновки, тобто фінальний виконуваний бінарний файл або бібліотека. Кліть може отримуватися шляхом компіляції безлічі вихідних файлів і компонування з зовнішніми бібліотеками. У Rust компіляція та збирання клітей описуються засобами самої мови без зовнішніх систем збірки (таких як autotools, CMake або Scons). Для цього використовуються спеціальні файли клітей з розширенням rc. По суті, ці файли - аналоги знайомих усім make-файлів. У них описуються опції компіляції і залежності:



// Метадані для компоновщика
# [Link (name = "farm", vers = "2.5", author = "mjh")];
// Вказуємо, що нам потрібна бібліотека, а не виконуваний файл
# [Crate_type = "lib"];
// Можна передати компілятору різні опції - наприклад, вимагати висновок
// попереджень
# [Warn (non_camel_case_types)]
// Компонувати зі стандартною бібліотекою
extern mod std;
// Знайти вихідні зазначених модулів і скомпілювати їх mod cow- mod chicken- mod horse;
fn main () {
...
}




При пошуку модулів використовується цікава схема, в якій вкладеність модулів в rc-файлі відповідає їх ієрархії в файлової системі. Наприклад, таке оголошення:
mod shape {
mod square- mod triangle;
}

призведе до пошуку файлів shape / square.rs і shape / triangle.rs.

У будь-кліті за замовчуванням першим завжди імпортується вбудований модуль core, який містить базові типи, рядки, вектори, примітиви багатозадачності, від платформи специфічні абстракції і повний набір прив`язок до libc.

стандартна бібліотека

Стандартна бібліотека мови Rust не дуже вражає на тлі величезних бібліотек С # або Java. Проте, в неї входять 49 модулів різного ступеня корисності і готовності. Документація до багатьох модулів обмежується автоматично згенерували анотаціями і часто навіть не дає можливості зрозуміти, що робить модуль - особливо це стосується утиліт низького рівня. Найбільш цікавими та корисними наступні модулі:
gt; bigint - підтримка цілих чисел довільного розміру;
gt; deque - кругової буфер;
gt; dlist - двусвязного списки;
gt; treemap, fun_treemap - асоціативні контейнери;
gt; getopts - спрощена альтернатива бібліотеки getopt;
gt; json - робота з даними в форматі json;
gt; net_ip, net_tcp, net_url - робота з відповідними мережевими протоколами;
gt; sha1 - криптографічний алгоритм shal;
gt; sort - методи сортування.

Строгості і системності в побудові стандартної бібліотеки не простежується, але, можливо, це пов`язано з тим, що вона ще дуже далека від готовності.

Кому потрібен Rust?

Спробуємо розібратися, кому потрібен такий мову, як Rust, і на що він може претендувати в майбутньому. Почнемо з об`єктивних «технічних характеристик» мови. Rust - це «нативної» компільований, строго типізований, мультіпарадігменний мову з вбудованою многопоточ-ністю і управлінням пам`яттю, бінарному сумісний з Сі, який покликаний бути простіше С ++ в написанні і налагодженні і позиціонується як заміна С ++ в масштабних проектах. До появи Rust в цій ніші вже успішно існували дві мови, які в тій чи іншій мірі дублюють функціональність Rust: Go і D. Замість того, щоб використовувати один з них, або просто обмежиться якимось фреймворком для С ++, в Mozilla пішли по шляху винаходу велосипеда.

Мова програмування Rust: виключення і загальні висновки

За ідеологією Rust набагато ближче до Go, але неважко здогадатися, чому Mozilla не стала використовувати цю мову: Go розробляється в Google, тобто у ідейних конкурентів на ринку браузерів і мобільних операційних систем. Мова не стандартизований, а сторонні реалізації ненадійні. Крім того, Go не надто пристосований для розробки браузерного движка - це все-таки мова, створена для серверної частини веб-сервісів ...
Набагато важче зрозуміти, що не влаштувало Mozilla в мові D. D - досить зрілий мову з готовими вільними компиляторами. У D є абсолютно все, що увійшло в Rust, і багато іншого. Щоб переконатися в цьому, досить виписати основні "фішки" обох мов:

Мені не вдалося знайти в Rust нічого, чого не було б в D, крім чисто синтаксичних відмінностей і різних варіантів реалізації одних і тих же ідей. Напрошується невтішний висновок, що в просто Mozilla спрацював сумно відомий принцип «винайдено чи не тут». Якщо копнути трохи глибше, то стає помітна цікава тенденція. Кожна компанія, яка претендує на свій сегмент росте як на дріжджах ринку мобільних пристроїв, прагне створити не тільки свою операційну систему, але і свої мови програмування. У Microsoft є .NET з C #, у Apple - Objective C, у Google - Go для серверів і Dart для клієнтів. Ubuntu і Samsung роблять ставку на Qt і QML, які хоч і не розроблені ними особисто, але не використовуються конкурентами. Тепер і Mozilla запускає Rust як мову, на якому буде написано наступне покоління браузерів для Firefox OS.

Мова програмування Rust: виключення і загальні висновки
Порівняння основних «фішок» мов

Таким чином, Rust - це скоріше стратегічний і маркетинговий хід, ніж необхідність. У доступному для огляду майбутньому мову, мабуть, не вийде за межі інфраструктури Firefox OS. З огляду на, що сама система Firefox OS ще толком не з`явилася на реальних пристроях і її комерційний успіх залишається сумнівним, то майбутнє Rust виглядає, м`яко кажучи, туманно.

Поява нових мов програмування, викликаних до життя виключно міркуваннями безпеки інвестицій, іміджу та маркетингу, на мій погляд, є негативним явищем. Крім розпилення зусиль нечисленних грамотних розробників компіляторів це створює неабиякі проблеми для прикладних програмістів. «Нутрощі» кожної з систем виявляються приховані за бар`єром незнайомої мови, а взаємне запозичення коду виявляється сильно утрудненим. Це йде врозріз із самою ідеєю вільного ПЗ.

Виходить, що формально система відкрита, а на практиці від цього досить мало пуття, оскільки код на Go можна запозичити для системи, написаної на Rust або Qt. Замість уніфікації і взаємодопомоги для блага користувача в черговий раз починається «дроблення потужностей», дублювання зусиль і наростання несумісності.

Mozilla вже має одну технологію, яка не використовується ніде крім її продуктів, - це XUL, на якому базується інтерфейс Firefox і Thunderbird. Тепер до неї додався Rust - мова, створений виключно для внутрішніх потреб Mozilla через те, що все інше «винайдено чи не тут». На мій погляд Rust просто не потрібен, але остаточну відповідь на це питання дасть час і ринкова кон`юнктура.

ІНШЕ

Мова програмування go фото

Мова програмування go

Відео: Топ-4 Кращих Мови програмування для Початківців | ТОП Мова програмування Go (https://qoianq.org/) з`явився в 2007…

» » Мова програмування rust: виключення і загальні висновки