
Хранимая программа изменила компьютер тем, что команды стали кодироваться и находиться в памяти рядом с данными. Чтобы решить новую задачу, больше не требовалось днями переставлять кабели и переключатели: достаточно было загрузить другую последовательность инструкций. Процессор мог сам извлекать команду за командой, а условные переходы и циклы превращали одну и ту же машину в универсальный исполнитель разных алгоритмов.
Что было до общей памяти
Раннюю вычислительную машину можно программировать несколькими способами. Устройство читает внешнюю ленту с командами, оператор устанавливает переключатели либо соединяет функциональные блоки кабелями. Эти подходы действительно задают последовательность действий, но программа остаётся отдельной от оперативной памяти машины.
В первоначальной конфигурации ENIAC специалисты строили путь импульсов на коммутационных панелях. Само вычисление занимало секунды или минуты, а подготовка сложной задачи – значительно дольше. О том, почему такой компьютер всё равно был огромным шагом вперёд, рассказывает материал про первые электронные компьютеры.
В чём состоит идея хранимой программы
Команду можно представить числом: часть разрядов обозначает операцию, другая – адрес нужного значения или регистра. Если такие коды записаны в доступной процессору памяти, специальный счётчик указывает на очередную ячейку. Устройство извлекает инструкцию, распознаёт её, выполняет и увеличивает адрес.
Это называют циклом «выборка – декодирование – выполнение». Он не означает, что все компьютеры физически устроены одинаково. Конкретная машина может иметь конвейер, кэш и множество параллельных блоков, но логическая модель помогает понять, как поток команд управляет аппаратурой.
Почему название фон Неймана не рассказывает всю историю
Проект архитектуры часто связывают с «Первым проектом отчёта об EDVAC» 1945 года, имя Джона фон Неймана стояло на распространённом документе. Однако идеи формировались коллективно в среде разработчиков ENIAC и EDVAC. Джон Мокли, Джон Преспер Эккерт и другие участники обсуждали внутреннее хранение команд, а похожие задачи решались в нескольких центрах.
Поэтому выражение «архитектура фон Неймана» удобно как техническое обозначение, но не должно превращать историю в рассказ об одном авторе. Реализация потребовала теории, подходящей памяти, электронных схем и практического опыта эксплуатации ранних машин.
Что доказал Manchester Baby
21 июня 1948 года экспериментальная машина Manchester Baby выполнила программу, находившуюся в электронной памяти на трубке Уильямса. Её создавали прежде всего как стенд для проверки нового запоминающего устройства, а не как удобный вычислительный сервис.
Программа искала наибольший делитель числа, последовательно проверяя варианты. Она была небольшой, но подтверждала полный цикл: инструкции считываются из памяти, арифметика меняет данные, условие возвращает выполнение к нужному месту, а остановка происходит после получения результата. Из работающего эксперимента вырос Manchester Mark 1.
Как команда оказывается рядом с данными
На физическом уровне память хранит кодированные состояния. Ячейка сама по себе не знает, содержит она число, букву, изображение или инструкцию. Значение определяет то, как процессор и программа интерпретируют последовательность битов.
Это сходство даёт гибкость. Загрузчик может прочитать программу с носителя и поместить её в память, операционная система – выделить ей область, а компилятор – создать машинные инструкции из текста другого языка. Но оно же требует защиты: ошибочная или вредоносная запись в область кода способна изменить поведение системы.
Что дали переходы и циклы
Без перехода процессор проходит команды строго по порядку. Условная инструкция сравнивает результат и меняет адрес следующей команды. Благодаря этому алгоритм реагирует на данные: продолжает поиск, выбирает один вариант или завершает работу.
Цикл использует переход для повторения. Вместо тысячи одинаковых команд программа хранит небольшое правило и счётчик. Подпрограмма позволяет многократно вызывать общий фрагмент. Такое управление экономит память и делает алгоритм понятнее, хотя раннему программисту всё равно приходилось тщательно рассчитывать адреса.
Почему программы сначала писали числами
Процессор понимает только машинный набор команд. На первых системах программист записывал числовые коды и абсолютные адреса, вручную следил за расположением данных и переводил значения в нужное представление. Изменение одного участка могло сдвинуть остальные адреса.
Ассемблер заменил коды короткими символическими обозначениями и поручил перевод специальной программе. Затем языки более высокого уровня позволили описывать формулы, условия и структуры данных ближе к способу постановки задачи. Ранний проект такого языка рассматривается в статье о Планкалкюле.
Одинаковы ли программа и данные
Они могут храниться в одном типе памяти, но используются по-разному. Программа задаёт операции, данные служат их объектами. Современные процессоры и операционные системы помечают области правами: страницу разрешено читать и выполнять либо читать и изменять, но не обязательно всё одновременно.
Существуют и гарвардские архитектуры, где память или шины команд и данных разделены. В микроконтроллере код может находиться во флеш-памяти, а рабочие значения – в оперативной. Даже тогда программа хранится как код, а не закрепляется навсегда схемой проводов. Поэтому исторический принцип шире одной конкретной разводки памяти.
Как возникло программное обеспечение
Когда смена задачи стала сменой содержимого памяти, программы превратились в самостоятельный продукт. Их можно было сохранять, копировать, исправлять и повторно использовать. Появились библиотеки подпрограмм, трансляторы, отладчики и операционные системы, управляющие запуском нескольких задач.
Аппаратный компьютер при этом не стал неважным. Набор команд, объём памяти и устройства ввода ограничивали возможный код. Но граница работы изменилась: инженеру не нужно было строить новый электронный автомат для каждого расчёта, а программист мог расширять применение уже существующей машины.
Что принцип дал современным системам
Телефон, сервер и микроконтроллер отличаются масштабом, но получают поведение из загружаемого кода. Обновление исправляет ошибку или добавляет функцию без замены всех транзисторов. Один процессор последовательно обслуживает множество приложений, а сохранённое состояние позволяет прервать и продолжить задачу.
Современный процессор выполняет команды намного сложнее и параллельнее ранней схемы, однако программируемость остаётся центральной. Даже система искусственного интеллекта является сочетанием обычных программ, обученных параметров и данных. Хранимая программа не создала ИИ напрямую, но дала универсальную платформу, на которой новые методы можно реализовывать и менять без постройки отдельной машины для каждой идеи.



