Я что-то не понимаю, о чем с таким жаром спорят в этой ветке.
Во-первых, кто сказал, что для системного программирования на Обероне не должен применяться псевдомодуль SYSTEM со всеми его возможностями?
Оберон помогает максимально ограничить потребность в низкоуровневом программировании и ограничить его низкоуровневыми (системными) модулями.
Никто и не ставит невозможную задачу вообще обойтись на системном уровне без низкоуровневого программирования.
Низкоуровневое программирование на Обероне вполне возможно. (Или с этим кто-то спорит?)
Просто Оберон проводит "политику апартеида" по отношению к "туземному" низкоуровневому программированию.
Распределение памяти из отдельных статических или динамических массивов памяти порой используется на Си именно для организации примитивной сборки мусора (по окончании какого-то этапа работы массив просто очищается полностью, вот и "собрали мусор"
), используя специально написанные для этого альтернативы malloc.
Что касается нежелательности в отдельных случаях GC, то его можно предотвратить, создав простенький модуль вроде:
Код:
MODULE SimpleMemAllocator;
TYPE
Object* = POINTER TO RECORD
data*: INTEGER; (* здесь должны быть реальные данные *)
END;
MemBlock* = POINTER TO RECORD
count: INTEGER;
stack: POINTER TO ARRAY OF Object;
END;
PROCEDURE (me: MemBlock) Alloc* (): Object, NEW;
VAR p: Object;
BEGIN
IF me.count > 0 THEN
DEC(me.count);
p := me.stack[me.count];
END;
(* если p = NIL, то здесь можно увеличить размер me.stack *)
RETURN p
END Alloc;
PROCEDURE (me: MemBlock) Free* (p: Object), NEW;
BEGIN
IF me.count < LEN(me.stack) THEN
me.stack[me.count] := p;
INC(me.count)
END
END Free;
PROCEDURE NewMemBlock* (size: INTEGER): MemBlock;
VAR mem: MemBlock; i: INTEGER;
BEGIN
ASSERT(size > 0);
NEW(mem); NEW(mem.stack, size);
mem.count := 0;
FOR i := 0 TO size-1 DO NEW(mem.stack[i]) END;
RETURN mem;
END NewMemBlock;
END SimpleMemAllocator.
Идея в том, что Free сохраняет указатель на блок памяти в специальном пуле таких указателей (реализация его в виде стека, думается, наиболее эффективна), избегая сборки мусора и позволяя использовать этот блок повторно через Alloc.