Базовый CS с нуля
Память: построй крошечный симулятор памяти
Ты понимаешь address, value, pointer и разделение stack/heap, когда можешь построить модель, подчиняющуюся этим правилам, и увидеть, что она ведёт себя ровно так, как предсказывали уроки. Построй небольшой симулятор памяти от модели ряда ячеек, затем прогони через него цепочку pointer’ов и сценарий stack vs heap.
Преврати ментальную модель юнита в работающий код: фиксированный ряд пронумерованных byte-ячеек, из которых можно читать и в которые можно писать по address, операцию dereference, идущую за сохранённым address, и демонстрацию, отличающую value от address и время жизни stack от времени жизни heap.
Построй крошечный симулятор памяти — фиксированный массив пронумерованных ячеек с read, write и dereference — на любом языке, затем используй его, чтобы смоделировать цепочку pointer'ов и сценарий времени жизни stack vs heap, доказывая каждое поведение распечатанным состоянием до/после.
- read, write и dereference ведут себя ровно по спецификации, а address вне диапазона отклоняются, а не молча оборачиваются или роняют программу.
- Демонстрация перезаписи показывает изменение целевой ячейки и неизменность всех остальных, распечатанные до и после.
- Демонстрация цепочки pointer'ов доходит до данных за два чтения, а перенаправление ячейки A меняет результат dereference, не трогая ячейку B.
- Демонстрация stack vs heap показывает, что данные на heap переживают освобождение stack-фрейма, а освобождённые stack-ячейки помечены свободными.
- Короткое описание называет идею юнита, которую доказывает каждый сценарий.
- Добавь многобайтовые значения: храни 32-битное целое в четырёх последовательных ячейках и добавь read32/write32, собирающие и разбивающие четыре byte, чтобы увидеть, почему одно value растягивается на четыре address.
- Добавь простой аллокатор для региона heap: allocate(size), находящий свободные ячейки и возвращающий их стартовый address, и free(address), освобождающий их. Покажи фрагментацию, появляющуюся после нескольких циклов allocate/free.
- Добавь защиту от stack overflow: если смоделированные фреймы вырастают за зарезервированный размер региона stack, поднимай ошибку stack overflow вместо порчи региона heap.
- Визуализируй память как печатную сетку, цветом кодирующую свободные, stack- и heap-ячейки, и анимируй её по сценарию вызова шаг за шагом.
Построение симулятора делает модель конкретной: address — это просто индекс массива, value — просто целое, лежащее там, а dereference — два чтения, ровно как описывали уроки. Резервирование нижнего диапазона под heap и верхнего под stack и наблюдение, как данные на heap переживают освобождённый фрейм, превращает различие stack vs heap из прочитанного факта в поведение, которое ты сам произвёл. Как только правила работают в коде, весь юнит перестаёт быть абстрактным.