Автор Тема: Подсчет ссылок и принцип достижимости  (Прочитано 8735 раз)

Freeman

  • Newbie
  • *
  • Сообщений: 15
  • Завлаб
    • Просмотр профиля
    • Лаборатория Единой среды
Есть гипотеза, что для автоматического управления памятью можно обойтись без сборщика мусора -- подсчетом ссылок, если в системе наряду с объектами существуют обычные переменные с тремя видами доступа -- in, out и var.

Мысль заключается в том, что в системе со сборщиком мусора именно он выступает фактическим владельцем всех объектов, являясь чем-то вроде бога для ходящих под себя грешных программ (процедур). А в системе с тремя типами доступа -- своего рода "вольтеровская демократия" -- "свобода вашего кулака кончается у моего носа", -- не требующая вмешательства бога.

Разграничение out и var дает возможность передавать владение, и все ссылки в конце концов упираются в переменные, -- локальные либо глобальные. Циклических ссылок при этом не возникает, поскольку эпилог процедуры отличает владеющие ссылки от невладеющих и финализирует только владеющие, -- в рамках своей ответственности.

Покритикуйте, пожалуйста.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #1 : Январь 24, 2013, 12:29:20 pm »
Есть гипотеза, что для автоматического управления памятью можно обойтись без сборщика мусора -- подсчетом ссылок, если в системе наряду с объектами существуют обычные переменные с тремя видами доступа -- in, out и var.

Мысль заключается в том, что в системе со сборщиком мусора именно он выступает фактическим владельцем всех объектов, являясь чем-то вроде бога для ходящих под себя грешных программ (процедур). А в системе с тремя типами доступа -- своего рода "вольтеровская демократия" -- "свобода вашего кулака кончается у моего носа", -- не требующая вмешательства бога.

Разграничение out и var дает возможность передавать владение, и все ссылки в конце концов упираются в переменные, -- локальные либо глобальные. Циклических ссылок при этом не возникает, поскольку эпилог процедуры отличает владеющие ссылки от невладеющих и финализирует только владеющие, -- в рамках своей ответственности.

Покритикуйте, пожалуйста.

Критикую: как в такой системе сделать двусвязный список?
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #2 : Январь 24, 2013, 12:32:02 pm »
У подсчёта ссылок проблема в циклических ссылках -- поэтому GC лучше, чем подсчёт ссылок.

С другой стороны, есть способы управления памяти методом регионов памяти
http://en.wikipedia.org/wiki/Region-based_memory_management
В нём смысл такой -- создаётся некий регион памяти, содержащийся в нём мусор будет уничтожен одним махом когда область действия выходит за область видимости региона...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #3 : Январь 24, 2013, 12:33:06 pm »
Критикую: как в такой системе сделать двусвязный список?
И де же тут критика? о_О
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #4 : Январь 24, 2013, 12:39:14 pm »
Критикую: как в такой системе сделать двусвязный список?
И де же тут критика? о_О
Критика в том, что двусвязный список создает циклические ссылки, а язык без возможности создания двусвязного списка, не нужен.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #5 : Январь 24, 2013, 12:44:33 pm »
Критикую: как в такой системе сделать двусвязный список?
И де же тут критика? о_О
Критика в том, что двусвязный список создает циклические ссылки, а язык без возможности создания двусвязного списка, не нужен.
А вдруг он щас как выкатит рабочую реализацию двусвязного списка, сделанного с учётом перечисленных им ограничений? ))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #6 : Январь 24, 2013, 12:56:25 pm »
А вдруг он щас как выкатит рабочую реализацию двусвязного списка, сделанного с учётом перечисленных им ограничений? ))
Это было бы очень хорошо.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #7 : Январь 24, 2013, 03:54:10 pm »
Описание какое-то сумбурное. Имеется три абзаца, но ни одного я не понял: слишком много явных или косвенных отсылок вовне. Можно ли какими-нибудь другими словами объяснить? Без подробностей - для меня достаточно понять хотя бы идею.

DddIzer

  • Гость
Re: Подсчет ссылок и принцип достижимости
« Ответ #8 : Январь 24, 2013, 05:17:10 pm »
Есть гипотеза, что для автоматического управления памятью можно обойтись без сборщика мусора -- подсчетом ссылок, если в системе наряду с объектами существуют обычные переменные с тремя видами доступа -- in, out и var.

Что понимается под " объектами"?

DddIzer

  • Гость
Re: Подсчет ссылок и принцип достижимости
« Ответ #9 : Январь 24, 2013, 05:36:16 pm »
Критикую: как в такой системе сделать двусвязный список?
И де же тут критика? о_О
Geniepro  - попали в воздух... это не критика, если рассматривать последний, как контейнер со скрытой реализацией но определенным интерфейсом доступа, насрав к  тому же на производительность кода то хватит и односвязанного..

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #10 : Январь 24, 2013, 05:45:41 pm »
Покритикуйте, пожалуйста.

Это все есть в С++ (передача владения и подсчет ссылок) и это никак не помогает от циклических ссылок.

Лично мне было бы интересно решить проблему хотя бы с передачей владения. А именно - избавиться от ошибок обращения к переменной, которая уже передала владение.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #11 : Январь 24, 2013, 06:53:35 pm »
Покритикуйте, пожалуйста.

Это все есть в С++ (передача владения и подсчет ссылок) и это никак не помогает от циклических ссылок.

Лично мне было бы интересно решить проблему хотя бы с передачей владения. А именно - избавиться от ошибок обращения к переменной, которая уже передала владение.

Ответ на это прост: Rust.
http://sysdev.me/rust-memory-model/
http://rsdn.ru/forum/philosophy/5016733.flat#5016733

Rust в случае owned box указателя (уникального указателя) проверяет владение на этапе компиляции. После y = x, x становится не доступен (x,y - указатели)
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #12 : Январь 24, 2013, 07:07:28 pm »
Ответ на это прост: Rust.

Гхм. А как он такое разруливает:
if (x) // значение x неизвестно на этапе компиляции
   move(y);
move(y); // ?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #13 : Январь 24, 2013, 07:15:47 pm »
Ответ на это прост: Rust.

Гхм. А как он такое разруливает:
if (x) // значение x неизвестно на этапе компиляции
   move(y);
move(y); // ?


Посмотри простыню на rsdn - там обсуждалось. Вроде бы будет ошибка компиляции.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подсчет ссылок и принцип достижимости
« Ответ #14 : Январь 24, 2013, 08:30:00 pm »
Гхм. А как он такое разруливает:
if (x) // значение x неизвестно на этапе компиляции
   move(y);
move(y); // ?


Посмотри простыню на rsdn - там обсуждалось. Вроде бы будет ошибка компиляции.

И таки да. Проверил.
За такое:
fn main() {
    let x = ~10;
    if (rand::random()>0) {
        let y = x;
        io::println(y.to_str());
    }
    let z = x;
    io::println(z.to_str());
}

Вот так меня компилятор обругал:
hello.rs:9:12: 9:13 error: use of moved variable: `x`
hello.rs:9     let z = x;
                       ^
hello.rs:6:16: 6:17 note: move of variable occurred here
hello.rs:6         let y = x;
                           ^
error: aborting due to previous error
Y = λf.(λx.f (x x)) (λx.f (x x))