LINUX.ORG.RU

Управление памятью в Rust

 ,


0

4

После поверхностного знакомства с Rust и в частности с концепцией ownership у меня сложилось впечатление, что управление памятью в Rust реализовано как имитация такового в функциональном программировании - имитация стека в куче. На сколько мои впечатления соответствуют действительности?

Перемещено mono из talks

★★★★★

Ответ на: комментарий от RazrFalcon

Передача владения и освобождение памяти при выходе из контекста создают имитацию стека в функциональных языках. По крайней мере у меня сложилось такое впечатление.

bbk123 ★★★★★ ()

На сколько мои впечатления соответствуют действительности?

Ни насколько.

Передача владения и освобождение памяти при выходе из контекста

Автоматическое освбождение по выходу из контекста есть и в Си++.

создают имитацию стека в функциональных языках.

Передача владения вовне - это уже не стек.

tailgunner ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Почему ты пропустил передачу владения? Вмести они работают так же, как использование стека в функциональном программировании. Объект создаётся на стеке, передаётся функции как параметр, после возврата из функции доступа к этому объекту уже нет. В Rust логика работы с памятью очень похожая. Разве нет?

bbk123 ★★★★★ ()
Ответ на: комментарий от tailgunner

Автоматическое освбождение по выходу из контекста есть и в Си++.

Не всего. Передача владения через std::move там тоже есть, но без защиты от повторного использования. В Rust же всё это очень жёстко реализовано.

Передача владения вовне - это уже не стек.

Имитация. Ведь после возврата из функции память освободится.

bbk123 ★★★★★ ()
Ответ на: комментарий от bbk123

Автоматическое освбождение по выходу из контекста есть и в Си++.

Не всего. Передача владения через std::move там тоже есть, но без защиты от повторного использования.

В Си++ есть почти всё, что есть в Rust. Разница только в том, что компилятор Rust всё жестко проверяет.

Передача владения вовне - это уже не стек.

Имитация.

Даже не имитация. Стек - это четкая дисциплина LIFO, которой при передаче владения просто нет.

Ну или скажи, что ты называешь «имитацией». Или даже приведи пример из ФП (на Ocaml, если можно).

tailgunner ★★★★★ ()

Вообще, в одной статье управление памятью в Rust было названо «статической сборкой мусора». Что довольно близко к истине (если не учитывать Rc и прочее).

tailgunner ★★★★★ ()
Ответ на: комментарий от bbk123

после возврата из функции доступа к этому объекту уже нет

Только если объект не имеет трейта Copy и мы передали его по значению.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от tailgunner

В Си++ есть почти всё, что есть в Rust. Разница только в том, что компилятор Rust всё жестко проверяет.

Именно об этом я и говорил.

Даже не имитация. Стек - это четкая дисциплина LIFO, которой при передаче владения просто нет.

Почему же нет? fu1() создаёт объект obj1 и вызывает fu2(obj1); при этом права владения на obj1 передаются fu2(). Затем fu2() создаёт obj2 и вызывает fu3(obj2) с аналогичной передачей владения на obj2. Вопрос, память какого объекта освободится раньше?

Ну или скажи, что ты называешь «имитацией». Или даже приведи пример из ФП (на Ocaml, если можно).

Я не знаком с функциональными языками, но я знаю, что параметры функций обычно передаются через стек. Поэтому в функциональных языках нет сборщика мусора. Или есть? Кстати, первые версии компилятора Rust были реализованы как раз таки на Ocaml.

bbk123 ★★★★★ ()
Ответ на: комментарий от bbk123

Даже не имитация. Стек - это четкая дисциплина LIFO, которой при передаче владения просто нет.

Почему же нет?

Потому что возможен такой сценарий: вызывается f1, которая возвращает o1, потом f2, которая возвращает o2, а потом o1 и o2 могут быть уничтожены в любом порядке. Уничтожение сначала o1, потом o2 нарушает LIFO.

Поэтому в функциональных языках нет сборщика мусора. Или есть?

А... Там есть сборщик мусора.

tailgunner ★★★★★ ()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Только если объект не имеет трейта Copy и мы передали его по значению.

В Rust можно вызвать фунцию без передачи владения на параметер через заимствование (borrow - объявляется как &type) или создав клон. Если верить вводным лекциям другого способа нет.

bbk123 ★★★★★ ()
Ответ на: комментарий от bbk123

Я не знаком с функциональными языками

Ну, и чего тогда фигню всякую несешь? Не надо сюда приплетать ФП. В плане управления памятью языки ФП мало чем отличаются от Java или .NET

dave ★★★★★ ()
Ответ на: комментарий от RazrFalcon

В примерах, которые я видел, почему-то говорили лишь о клонировании. Хорошо, значит наличие Copy тоже позволяет не передавать владение. В отличии от клонирования копирование вызывается неявно? Тоесть при наличии a.Copy второй вызов fu(a); скомпилируется?

bbk123 ★★★★★ ()
Последнее исправление: bbk123 (всего исправлений: 1)
Ответ на: комментарий от bbk123

Речь шла об использовании стека при вызове функций.

Использование стека при вызове не имеет отношения к тому, о чем ты спрашивал.

tailgunner ★★★★★ ()

Раздел форума не тот, тега rust не поставил. Ну ок, чо.

Virtuos86 ★★★★★ ()
Ответ на: комментарий от tailgunner

А вот расскажи, ты Rust в проде используешь? Интересно мнение на тему, можно и стоит ли это делать, и какие грабли

stevejobs ★★★★☆ ()
Ответ на: комментарий от bbk123

Ну вот это пушка. Сначала много повторяешь, что какой-то там механизм в раст это имитация чего-то из ФП. А потом такой: «ну я вообще в ФП ничего не знаю».

Поэтому в функциональных языках нет сборщика мусора

Блин, назови хоть один ФП язык без сборки мусора?

Aswed ★★★★★ ()
Ответ на: комментарий от RazrFalcon

А можно разницу? Я, например, ее не понял, ну кроме того, что для клонирования нужно явно вызывать .clone().

Aswed ★★★★★ ()
Ответ на: комментарий от Aswed

Copy - признак того, что транслятор может копировать значение обычным memcpy без явного вызова метода копирования в программе, с Clone для копирования используется явный вызов .clone().

tailgunner ★★★★★ ()
Ответ на: комментарий от Aswed

Тебе тоже объяснить, что я сюда не на экзамен пришёл? Я всего лишь ошибочно полагал, что скриптовые языки ограничиваются лишь использованием стека, потому что для лямбда исчисления этого достаточно. Вот например в скриптовом языке Cat есть лишь стек.

bbk123 ★★★★★ ()
Ответ на: комментарий от bbk123

имитация стека в куче

скорее имитация кучи на стеке

MyTrooName ★★★★★ ()

Есть указатели считающие количество ссылок(редко используются). Это по твоему тоже имитация(искренний интерес)?

NextGenenration ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.