2009-03-28 3 views
4

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

Ex:

region(A) { 
    [email protected] x=new Foo(); //x is deleted when this region closes. 
    region(B,C) while(x.Y) { 
     [email protected] 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(); 
     [email protected] 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. 
    } 
} 

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

+0

MLton также делает вывод в области, чтобы не выделять память, управляемую GC. –

ответ

11

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

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

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

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

+0

Произошла ли ситуация после публикации этого сообщения? [Я могу якобы иметь торт и съесть его тоже] (http://stackoverflow.com/a/7102860/309483). –

+0

Насколько сложно было бы добавить регионы в семантику языка? То есть, каждый термин уровня ценности будет иметь не только тип, но и регион. Затем перенос значения в другой регион потребует явной операции копирования или перемещения, которая сохраняет тип, но не область. Функции могут быть как полиморфными, так и полиморфными по регионам, используя один и тот же базовый механизм параметрического полиморфизма. Идея ML-подобного языка, которая точно (не почти) так же быстро, как C, и не содержит пауз для сбора мусора, звучит очень заманчиво для меня ... – pyon

-1

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

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

+0

Чтобы вернуть выделенный объект, вызывающий объект должен будет передать область, в которую он будет выделен в качестве аргумента. Затем вызывающий абонент «владел» им, и он будет освобожден, когда этот регион закроется. – Zifre

3

Если бы я использовал язык с управлением памятью на основе области, я бы, вероятно, прочитал A language-independent framework for region inference. Тем не менее, прошло некоторое время с тех пор, как я изучил этот материал, и я уверен, что состояние дел продвинулось, если я даже знал, что такое современное состояние.

0

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

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

0

Вы можете начать работу с документами Tofte и Talpin о управлении памятью на основе области.

+0

Ссылка Tofte и Talpin уже цитируется в ответе Нормана Рэмси ... Хорошо пытаться ;-) –