Управление памятью на региональной основе - PullRequest
4 голосов
/ 28 марта 2009

Я проектирую язык высокого уровня и хочу, чтобы он имел скорость C ++ (он будет использовать LLVM), но был безопасным и высоким уровнем, как C #. Сборка мусора идет медленно, а new / delete небезопасен. Я решил попытаться использовать «управление памятью на основе регионов» (в Интернете есть несколько статей об этом, в основном для функциональных языков). Единственный «полезный» язык, использующий его, это Cyclone, но он также имеет GC. По сути, объекты размещаются в лексическом стеке и освобождаются при закрытии блока. Объекты могут ссылаться только на другие объекты в том же регионе или выше, чтобы предотвратить висячие ссылки. Чтобы сделать это более гибким, я добавил параллельные области, которые можно перемещать вверх и вниз по стеку и сохранять через петли. Система типов могла бы проверять назначения в большинстве случаев, но в некоторых местах потребовались бы проверки с минимальными накладными расходами.

Ex:

region(A) {
    Foo@A x=new Foo(); //x is deleted when this region closes.
    region(B,C) while(x.Y) {
        Bar@B n=new Bar();
        n.D=x; //OK, n is in lower region than x.
        //x.D=n; would cause error: x is in higher region than n.
        n.DoSomething();
        Bar@C m=new Bar();
        //m.D=n; would cause error: m and n are parallel.
        if(m.Y)
            retain(C); //On the next iteration, m is retained.
    }
}

Это кажется практичным? Нужно ли добавлять нелексически ограниченные регионы с подсчетом ссылок? Нужно ли добавлять слабые переменные, которые могут ссылаться на любой объект, но с проверкой на удаление области? Можете ли вы вспомнить какие-либо алгоритмы, которые было бы трудно использовать с этой системой или которые могли бы просочиться?

Ответы [ 5 ]

13 голосов
/ 28 марта 2009

Я бы отговорил вас от пробных регионов. Проблема в том, что для обеспечения безопасности регионов вам нужна очень сложная система типов - я уверен, что вы просмотрели статьи Тофте и Талпина, и у вас есть представление о сложностях, с которыми это связано. Даже если регионы работают успешно, очень высока вероятность того, что вашей программе потребуется тот, чье время жизни - время жизни программы - и этот регион, по крайней мере, нужно собирать мусором. (Вот почему у Циклона есть регионы и GC.)

Поскольку вы только начинаете, я бы посоветовал вам заняться сборкой мусора. Современные сборщики мусора могут быть сделаны довольно быстро без особых усилий. Основная проблема заключается в выделении из смежного свободного пространства, чтобы выделение было быстрым. Это помогает ориентироваться на AMD64 или другую машину с резервными регистрами, поэтому вы можете использовать аппаратный регистр в качестве указателя распределения.

Есть много хороших идей для адаптации; Один из самых простых в реализации - это сборщик на основе страниц, такой как сборщик копий Джоэла Бартлетта, в котором идея заключается в том, что вы выделяете только из полностью пустых страниц.

Если вы хотите изучить существующие сборщики мусора, Lua имеет довольно сложный инкрементный сборщик мусора (поэтому нет видимых времен паузы), а реализация занимает всего 700 строк. Он достаточно быстр, чтобы его можно было использовать во многих играх, где важна производительность.

4 голосов
/ 28 марта 2009

Если бы я реализовывал язык с управлением памятью на основе региона, я бы, вероятно, прочитал Независимая от языка структура для вывода региона . Тем не менее, прошло много времени с тех пор, как я изучал эти вещи, и я уверен, что современное состояние изменилось, если бы я когда-либо даже знал, каково было состояние искусства.

0 голосов
/ 17 февраля 2012

Вы можете начать с работ Тофта и Талпина об управлении памятью на региональном уровне.

0 голосов
/ 28 марта 2009

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

Я не буду комментировать замечание "GC идет медленно",

0 голосов
/ 28 марта 2009

Как бы это вернуть динамически созданный объект? Кто будет «владеть» им и нести ответственность за освобождение памяти?

Пересчет или сборщик мусора очень распространены, потому что они почти всегда являются лучшим выбором. Сборщики мусора поколений могут быть очень эффективными.

...