Я разрабатываю язык высокого уровня, и я хочу, чтобы он имел скорость 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.
}
}
ли это, кажется практичным? Нужно ли мне добавлять не связанные с лексикой регионы с подсчетом ссылок? Должен ли я добавлять слабые переменные, которые могут ссылаться на любой объект, но с проверкой на удаление области? Можете ли вы придумать какие-либо алгоритмы, которые трудно использовать с этой системой или что это будет утечка?
MLton также делает вывод в области, чтобы не выделять память, управляемую GC. –