Как управлять памятью структур данных и кучей виртуальной машины в простом C - PullRequest
0 голосов
/ 14 ноября 2010

В моем интерпретаторе мне нужно управлять его объектами времени выполнения, а также внутренними структурами данных.

Я хотел бы создать интерпретатор, в котором нет различий между структурами данных интерпретатора (стек, таблица символов).) и объекты, созданные пользователем.Впервые я видел это в Little Smalltalk.

Таким образом, интерпретатор выглядит как крошечная настоящая машина в отношении структур интерпретатора, живущих в управляемой куче и имеющих одинаковый тип (например, архитектура фон Неймана).).Я думаю, что это самый крутой и захватывающий способ написания интерпретатора.

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

Кто-нибудь придумал, как это сделать с помощью указателей?Я знаю, что это практически невозможно, но кто-то подошел к этому?

Ответы [ 2 ]

1 голос
/ 14 ноября 2010

Даг Ли написал основу для некоторых реализаций malloc еще в 1994 году.

0 голосов
/ 02 апреля 2013

У меня были похожие проблемы с моим интерпретатором Postscript.Некоторое обсуждение здесь .

Способ, которым я справился с аннулированием указателя, состоит в том, чтобы иметь два слоя адресации. Виртуальные адреса, если хотите.

Структура основных данных распределяется отдельно и имеет указатели на базовый адрес, максимальный выделенный размер и текущий используемый размер.По нулевому адресу в памяти находится первая адресная таблица , которая содержит размеры размещения и базовые смещения (целые числа или «курсоры», которые при добавлении к базовому указателю дают фактический указатель C на данные).

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

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

...