Базовый CS с нуля
Данные в памяти: построй модель раскладки памяти
Ты можешь пересказать, что array contiguous, а объекты — именованные слоты, но картина становится твоей, только когда ты её построишь. Сделай небольшую программу, которая раскладывает данные в фейковой памяти, вычисляет адреса так, как это делает рантайм, и рисует разницу между value и reference.
Преврати ментальную модель юнита в работающий артефакт: крошечный симулятор памяти, который размещает array и объекты в адресуемых ячейках, достаёт любой элемент через base + index x element_size и показывает, как array объектов становится graph of cells, связанным reference.
Построить небольшую модель раскладки памяти (на любом языке), которая симулирует ряд адресуемых ячеек, раскладывает в него array и объекты и вычисляет адрес любого элемента той же арифметикой, что учил юнит — доказывая каждый доступ и вручную, и кодом.
- Проработанная таблица адресов для array чисел: index, offset (index x element_size), вычисленный адрес и прочитанное value — с index 0 на base address.
- elementAt возвращает верное значение для нескольких индексов, и путь кода для большого индекса доказуемо та же фиксированная работа, что и для малого (без цикла по элементам).
- Чтение по key возвращает верное значение поля, и два объекта с одинаковыми полями в разном порядке дают идентичные чтения.
- Чтение users[i].field в два прыжка прослежено по шагам: адрес ячейки array, хранящийся там reference, адрес объекта и значение поля.
- Короткое описание (один-два абзаца), объясняющее, какие ячейки хранят value, а какие reference в итоговой раскладке, и почему array объектов обязан использовать reference, чтобы сохранить сетку из равных ячеек.
- Добавь маленький визуализатор (текст или рисунок), который рисует ряд ячеек с адресами снизу и стрелками от reference-ячеек к объектам, на которые они указывают — делая graph of cells видимым.
- Поддержи вложенные объекты (объект, чьё поле ссылается на другой объект) и проследи много-прыжковое чтение вроде company.address.city, считая прыжки.
- Добавь намеренно сломанную раскладку, где один элемент неверного размера, и покажи, как base + index x element_size тогда попадает на неверный адрес — демонстрируя, зачем нужны равные ячейки.
- Сравни две раскладки одних данных — array чисел (value внутри) против array объектов из одного числа (reference наружу) — и посчитай, сколько ячеек и прыжков стоит прочитать одно значение в каждой.
Построение модели делает юнит постоянным: память — это ряд адресуемых ячеек; array — contiguous-блок из равных ячеек, чьи элементы достаёшь через base + index x element_size за константное время, с index 0 на base; объект — именованные слоты, достаются по key, поэтому порядок полей не важен; а array объектов сохраняет сетку, храня reference одного размера и читая в два прыжка. Когда сам нарисуешь value и стрелки, любая вложенная структура читается как тот же graph of cells.