C/C++ используются в течение последних нескольких десятилетий, поэтому разработчику очень сложно поддерживать память для своего приложения. Тем более, что в сложной системе это очень трудно контролировать.

Затем возникла Java с новой идеей JVM. Java сказал всем разработчикам, что:

«Не волнуйтесь, у меня есть волшебная палочка — JVM, мы можем вычистить ваше дерьмо за небольшую плату»

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

Но работа с JVM — это не 100% бесплатный обед, в этом нужно разбираться, и не стоит создавать много мусора. Вам нужно быть более осторожными, особенно в торговых приложениях с низкой задержкой. Вы так или иначе оплатите свою стоимость, даже если она сейчас невелика.

Проблемы с C/C++

  • Утечка памяти
  • Ссылка на неправильный адрес памяти
  • Два или более указателя изменяют одно и то же выделение памяти

Java решает эти проблемы с помощью нескольких алгоритмов сборки мусора: Z1, ConcurrentMarkSweep и т. д. Но сейчас!

Rust вводит только два простых правила, которые решают проблемы C/C++ без JVM.

  • Правило 1. Любая память (данные) может одновременно принадлежать только одному владельцу.
  • Правило 2. Всякий раз, когда владелец памяти выходит за пределы своей области, его память автоматически освобождается.

1. Переменная

Первое чувство, когда вы начинаете использовать Rust, это ощущение перевернутого (как в кино).

Java по умолчанию изменяем, но Rust по умолчанию неизменяем.

И в Rust нет переменной, допускающей значение null. Однако вы не увидите NullPointerException в приложении Rust!

В Rust по умолчанию вы не изменяете переменную «a». Тогда, естественно, вы спросите себя: «Какого черта? Я хочу изменить «а», тогда как мне это сделать?» Ответ положительный, вы можете заменить «а» на ключевое слово «mut». Я оставляю это вам, чтобы узнать.

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

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

В приведенном выше примере, поскольку переменная "a" перешла во владение переменной "b", "a" не имеет права собственности на строка «привет мир» больше. Таким образом, "a" не может передать строку "hello world" функции println!(). Компилятор Rust автоматически обнаружит нарушение сразу же в строке 4.

В Rust переменная владеет данными, затем она может изменять и передавать их другой переменной.

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

В приведенном выше примере вы можете видеть, что Alaskadog может изменить свое имя в Java, но не может изменить свое имя в Rust. Компилятор Rust заблокирует это, потому что в Rust собака Alaska больше не владеет своими данными после перехода к собаке Nakita.

2. Объем

И Java, и Rust используют {…} для определения области действия переменной. Мы не можем использовать переменную вне ее области видимости.

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

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

На сегодня все, спасибо за прочтение.