vlad писал(а):
Так значит, все-таки, оберон - язык под задачу?
Оберон -- один на всех. Мы за ценой не постоим. А вот реализации Оберона -- своя под каждую задачу. Читай внимательней.
vlad писал(а):
Ох. Вот смотри, на пальцах. Для 32-битной реализации:
1. NEW 4 миллиарда объектов размером 1 байт. Адреса всех объектов различаются на 1.
2. Убрали ссылку на каждый 40-й объект. GC собрал 100 миллионов объектов. При этом в памяти у тебя 100 миллионов свободных дырок размером в 1 байт и отстоящих друг от другая ровно на 40 байт.
3. Теперь делаем NEW 1 массив на 100Mb. Недвигающий GC говорит "упс". Двигающий GC собрал все дырки в один непрерывный сегмент 100Mb и смог выделить такой массив.
1. Оберон не может в 32-битных задачах выделить 4 млрд 1 байтовых значений. В 32-битных задачах (например, в Windows) доступно всего 2 млрд. байт. К тому же, объект имеет адрес, тип, размер, номер и др. скрытые поля. В лучшем случае 500 млн. Если речь идёт о серверном варианте, то 100 МБ вообще не проблема))
2. Если речь идёт о массиве -- то так не выйдет. Если о цепочке -- то ты никогда не узнаешь в каком порядке они расположены. Система связей может оказаться такой, что чёрт ногу сломит и GC с поколениями или уплотняющий могут затормозить программу до невозможности. На практике, освобождённые блоки помечаются как свободные и дальше используются заново. Это нормальная практика.
3. В реальных задачах точно никто не создаёт и не освобождает массивы в таких объёмах. Либо крайне редко. В самом начал насоздавал, и повторно пользуешь.
Самый лучший оптимизатор памяти и опция компилятора -- мозг программиста.
В целом, я ничего не имею против изощрённых GC, но сть такое понятие как репорт(декларация) языка и реализация. Всё же -- это сильно разные вещи.