Через неделю инженерная логика потребовала продолжения банкета.
Двадцать четвёртое сентября, без двадцати двенадцать ночи. Коридор, ведущий к машинному залу, был почти пуст: редкие шаги дежурного, тусклые лампы под потолком, запах побелки и холодного металла. Сквозь застеклённые двери виднелись те же шкафы ЕС, тот же фикус на подоконнике у пульта.
Алексей поймал себя на мысли, что начал скучать по этому гулу вентиляторов. Признак профессиональной деформации: нормальный человек в полночь скучает по кровати.
— Дежавю, — сказал Евгений, на ходу поправляя воротник пиджака. — Опять ночь, опять ЕС-ка, опять у кого-то странные идеи насчёт табличных формул.
— Отличие в том, — заметил Алексей, — что в прошлый раз мы мучили только внутренний блок, а сегодня — уже целиком.
В папке под мышкой шуршали листинги и схемы. Программа-модель, с которой они пришли, была простой до неприличия: массив из условных «ячеек памяти», регистр-аккумулятор, счётчик шагов и три команды.
Не «ADD A,B» и «JNZ», а строго по ГОСТу:
«Прочесть значение из ячейки»,
«Выполнить операцию сложения»,
«Перейти к другой записи в таблице по условию».
Но по сути — тот же набор, с которого начинал любой пригодный к жизни процессор. Только здесь он назывался не процессором, а «ядром последовательной обработки табличных формул».
Тихонова встретила их у дверей с тем же журналом, но без дневной очереди за спиной. В полночь очереди заканчивались.
— Опять вы, — сказала она вместо приветствия. — Вам что, дома не спится?
— Нам дома не моделируется, — ответил Евгений. — Там нет ЕС-1035.
— Дом там, где машина, — добавил Алексей.
Тихонова хотела было огрызнуться, но вспомнила, по-видимому, исправленный «Свод-76» и только вздохнула:
— Ладно, романтики. Вас записали с нуля до трёх.
Она ткнула карандашом в журнал.
— Два часа сорок пять — фактическая работа, пятнадцать минут — на всякий пожарный. Если зациклите свою «игрушку» так, что мне потом всё сбрасывать, пожарный будет настоящий, и начнётся он прямо с вас. Я ясно выразилась?
— Кристально, — кивнул Евгений. — Ни одного бесхозного цикла.
Алексей показал служебную записку — ту же, что они добыли через Кирилла Савельевича, только с новой датой.
— Сегодня мы эмули… моделируем уже набор команд, — пояснил он. — Чтение, сложение, переход. Всё в рамках пользовательской программы, никаких системных областей.
— Системные области у вас в голове, — буркнула Тихонова. — Проходите.
Ночной машинный зал выглядел как декорация к фильму про будущее: зелёные огоньки на панелях, ленточные накопители медленно вращают катушки, на АЦПУ белеет свежий рулон бумаги. ЕС-1035 дышала ровно, уверенно, как большой холодильник с характером.
Евгений сел за терминал, привычно пробежался по клавишам.
— Значит так, — сказал он. — Сначала ваш табличный цирк. Потом — один контрольный прогон «Свод-76», чтобы Кирилл Савельевич не нервничал.
Алексей разложил на соседнем столе бумаги: схему ЦУБ, условные обозначения команд, таблицу тестовой программы. Для ЕС-ки это всё было просто текстом на фортране с аккуратным массивом: `MEM(0:255)`, `ACC`, `PC`, шаги цикла. Для него — первый прототип того, как будет жить их будущее «железо».
— Значит, ещё раз, — произнёс Евгений, набирая команду чтения с перфоленты. — Что делает ваша высокоинтеллектуальная программа?
— В первом тесте — заполняет восемь ячеек суммой двух других, — ответил Алексей. — Каждая команда — запись в таблице: «взять из ячейки А, сложить с ячейкой Б, результат положить в ячейку С, перейти дальше».
Он показал пальцем на схему.
— Если всё работает, к концу цикла в памяти получается красивая лесенка: 1, 2, 3, 4, 5, 6, 7, 8. Никаких сюрпризов.
— А если не работает? — спросила Тихонова, заглянув им через плечо.
— Тогда, — сказал Алексей, — получится современное искусство.
— Мы это искусство печатать не будем, — отрезала она. — Бумага не резиновая.
Евгений загрузил перфоленту с программой, проверил параметры задачи и нажал «Пуск». На панели ЕС-ки вспыхнули лампочки, блоки загудели чуть сильнее, АЦПУ кашлянул и выдал первую строку: заголовок теста.
Алексей опёрся на стол и вслушался в шум. В его 2026-м такие моменты происходили беззвучно: где-то в облаке крутились виртуальные ядра, а на мониторе мелькали зелёные галочки. Здесь каждый байт сопровождался реальным шелестом бумаги и щелчком реле.
Первые строки распечатки были обнадёживающими:
«Тест 1. Начальное состояние памяти…»
«Адрес 00: 0001, Адрес 01: 0001…»
«Шаг 1: ACC = 0002, MEM(02) = 0002…»
Аккуратные нули и единицы выстраивались в столбики.
— Смотри, — кивнул Евгений. — Лесенка пошла.
Алексей отметил в блокноте: «Тест 1 — ОК (предварительно)».
«Тест 2» начинался с простого ветвления: если результат не ноль — перейти по адресу, если ноль — остановиться. Это был маленький прообраз будущего условного перехода в их ЭВМ, только замаскированный под «переключение на другую запись табличной формулы при достижении порогового значения».
ЕС-ка добросовестно отрабатывала шаг за шагом. Печатающее устройство жужжало, Тихонова с показным равнодушием листала журнал, но глаз от пульта не отрывала.
На сорок четвёртой секунде всё резко испортилось.
Вместо аккуратных строк вида «Адрес 05: 0005» АЦПУ начал выдавать:
«Адрес 37: 8191»
«Адрес 38: 16383»
«Адрес 39: 32767»
Числа росли скачками, как температура при воспалении.
— Это что ещё такое… — протянул Евгений.
На панели ЕС-ки загорелось слишком много лампочек. Время задачи бежало, а никакого «СТОП» в распечатке не появлялось. Программе явно нравилось бегать по памяти без конца.
— Громов! — Тихонова развернулась уже по-дневному грозно. — У вас задача зависла.
— Не зависла, — машинально возразил Евгений. — Она так задумана.
Он посмотрел на распечатку ещё раз.
— Хотя нет. Так не задумана.
— Немедленно снимайте, — потребовала Тихонова. — Пока вы мне всё поле задач не забили.
Евгений чертыхнулся, нажал клавишу сброса задания. ЕС-ка послушно оборвала поток бессмысленных цифр. АЦПУ обиженно заскрипел и замолчал.
— Полрулона бумаги в мусор, — констатировала Тихонова. — И это вы ещё «аккуратно».
Она осталась стоять у пульта со сложенными на груди руками.
— Ещё один такой «эксперимент» — и я вас не просто из зала выгоню, я вас начальству сдам. Пусть вам там отдельный ЕС выделяют.
— Всё, всё, — успокаивающе поднял руки Алексей. — Мы уже сняли то, что нам нужно.
Он поднял стопку листов с тем самым «современным искусством».
— Теперь мы отойдём в угол и тихо будем раскаиваться.
— Раскаиваться вы будете дома, — отрезала Тихонова. — Здесь у вас есть час двадцать. Или вы за это время находите свою ошибку и показываете мне приличную распечатку, или завтра в журнале в графе «особые отметки» появится «игрушка, нарушающая дисциплину».
Она посмотрела на часы.
— Время пошло.
Они отступили к дальнему столу. Евгений швырнул пачку распечаток на столешницу.
— Прекрасно, — сказал он. — Вот мы и дорвались до настоящего программирования. Без отладчика, без пошагового режима, с одной кнопкой «забить всё к чёрту».
Алексей молча выровнял листы, разложил по порядку, достал карандаш и линейку.
В его обычной жизни всё было проще: компилятор, симулятор, breakpoint на нужной строке, просмотр всех регистров, дамп памяти картинкой. Здесь у него был рулон тонкой бумаги с цифрами, часы ночного времени и привычка школьника, разбирающего дамп памяти БК-шной игры ручкой по клеточкам.
Он вдруг отчётливо вспомнил: четвёртый класс, кабинет информатики, БК-0010 на столе, чёрно-зелёный экран. Учительница ушла за чаем, а они с приятелем загрузили какую-то игрушку с кассеты. Игра вылетала на одном и том же уровне. Достать исходники было негде, никакого отладчика не существовало, только монитор, который умел показывать содержимое памяти по адресам.
Тогда он вписал в тетрадь четыре страницы цифр из памяти, сел дома и карандашом пытался понять, где хранится число жизней, а где — текущий уровень. Нашёл через два дня, подменил байт, принёс на дискете обратно — и игра больше не вылетала.
«Вот и вернулись к истокам, — подумал он. — Только вместо пятого класса — ЕС-1035, вместо игры — табличный вычислитель».
— Ладно, — сказал он вслух. — Давайте смотреть.
Он быстро нашёл участок, где нормальные числа превращались в лавину.
— Вот здесь у нас был переход, — отметил он. — Условный. Если ACC не ноль — перейти на следующую запись.
Он отметил карандашом строки.
— До этого всё верно: 1, 2, 3, 4. А вот здесь ACC вдруг становится семьдесят шесть тысяч. Значит, либо у нас перенос уехал, либо счётчик команд прыгнул не туда и начал складывать то, что не надо.
— Счётчик команд, — мрачно сказал Евгений. — Печёнкой чувствую.
Он ткнул пальцем в листинг.
— Вы же его на этой вашей упрощённой арифметике повесили? Через тот же сумматор?
— Через тот же, — признал Алексей. — Иначе не укладывались по микросхемам.
Он перевернул листы, нашёл кусок фортрана, описывающий их модель: `PC = PC + 1`, `if (ACC.ne. 0) PC = TARGET`.
— В модели на ЕС-ке это выглядит нормально, но мы же имитируем поведение нашего железного сумматора.
Он черкнул пару формул.
— Смотри: мы сначала считаем ACC = ACC + MEM(X), и только потом, на том же переносе, докидываем PC + 1. Если перенос не сбросить, он начинает попадать и в адрес. Одно неверное место — и счётчик улетает куда-то в третью сотню.
Евгений взял листинг, прищурился.
— То есть ты хочешь сказать, — медленно произнёс он, — что из-за того, что вы сэкономили одну микросхему ЛА3 для сброса флага переноса, у нас теперь весь табличный вычислитель пошёл по… не по плану?
— Не одну, а две, — поправил Алексей. — Но да, смысл именно такой.
Он на секунду представил реальную плату: те самые два лишних корпуса К155, лишний провод, лишний ватт тепла. В будущем такой флаг помещался в один бит статуса, которого никто не замечал. Здесь этот бит превращался в железо, текстолит и кандалы в виде дефицита.
— То есть, если мы хотим, чтобы счётчик команд не сходил с ума, — подытожил он, — придётся всё-таки выделить ему отдельный канал, независимо от того, как мы там переносы таскаем.
Евгений постучал карандашом по столу.
— А вы не пытались вместо ЭВМ сделать счёты? — спросил он. — Там переносы хотя бы на пальцах видны.
— Счёты не умеют в условные переходы, — возразил Алексей. — А нам без них никуда.
Он быстро набросал новую последовательность операций: сначала в модели «обнулять» перенос перед сложением адресов, отделяя PC от ACC; в железе это означало — всё-таки добавить узел, который очищает флаг, прежде чем крутить счётчик шагов.
— Вот так, — сказал он. — Сначала независимый инкремент PC, без использования результата арифметики. Потом уже — работа с аккумулятором.
Он подчеркнул строку.
— Придётся пересчитать, сколько микросхем это съест. Но иначе у нас каждая девятая программа будет превращаться в фейерверк.
Евгений скривился, но спорить не стал.
— Хорошо, — сказал он. — В модели это не критично, микросхемы нам ЕС-ка не считает.
Он выхватил листок с формулами.
— Давайте я прямо тут перепишу цикл. Пока наша богиня очередей не передумала.
Они вернулись к пульту.
— Елена Петровна, — осторожно сказал Евгений, — мы тут нашли одну маленькую ошибку. Сейчас поправим программу и ещё разок прогон — и всё. Обещаю: без лавины.
— У вас «маленькие ошибки» — это сорок листов мусора, — заметила Тихонова. — Сколько вам ещё надо времени?
— Минут двадцать, — сказал Алексей. — Переписать цикл и один раз прогнать.
Он заговорщически снизил голос.
— Если не получится — сами уйдём до трёх, честно-честно.
Тихонова посмотрела на часы, потом — на их измученные лица. В её мире тоже иногда приходилось смотреть на схему и делать вид, что всё под контролем.
— Двадцать минут, — сказала она. — И ни секундой больше. Если в 2:59 ваша штука всё ещё печатает без остановки, я нажимаю «сброс» и забываю, как вас зовут.
— В 2:59 она уже будет молчать, — пообещал Евгений.
Он сел за терминал, быстро отредактировал подпрограмму: добавил явный сброс переноса перед расчётом PC, пересобрал. На современных машинах это заняло бы секунду. Здесь компиляция сама по себе была маленьким событием: лампочки на одной из стоек загорелись чуть ярче, дисковый накопитель глухо зашуршал.
— Готово, — сказал он. — Второй заход.
Алексей поймал себя на том, что напрягся сильнее, чем во время защиты проекта на НТС. Там были слова и подписи. Здесь — голые цифры. Если сейчас снова поползёт мусор, придётся снова выбивать время, объясняться, переписывать схему. Если же всё отработает, у них в руках окажется не только красивая диаграмма, но и модель, которая честно делает «load-add-branch» без сюрпризов.
Евгений нажал на запуск.
ЕС-ка загудела. На АЦПУ снова пошли строчки.
«Тест 1…» — аккуратные единицы и двойки.
«Тест 2…» — шаги по условному переходу.
Критическое место возникло на тех же строках, где раньше начиналась лавина. Тихонова невольно придвинулась ближе.
«ACC = 0004, PC = 0005»
«ACC = 0000, PC = 0006»
«Флаг окончания — установлен. Остановка.»
АЦПУ затих.
Впервые за всю ночь ЕС-1035 замолчала красиво: без рывка, без обрубленного лога, с аккуратным «СТОП» в конце.
— Вот это уже похоже на инженерию, — тихо сказал Алексей.
Евгений провёл ладонью по распечатке, как по меху кота.
— Давайте посмотрим дамп, — предложил он.
Они попросили машину напечатать содержимое всего их условного «памятного массива». Рулон зашуршал ещё раз, но на этот раз это была не абракадабра, а таблица:
«Адрес 00: 0001»
«Адрес 01: 0002»
«Адрес 02: 0003»
…
«Адрес 07: 0008»
— Лесенка, — удовлетворённо констатировал Алексей. — Без провалов и взрывов.
— То есть ваши табличные формулы умеют ходить по памяти и не сходить с ума, — перевела Тихонова на человеческий язык. — Я запомню.
Она заглянула в журнал, вытянула карандаш.
— Значит так.
Она аккуратно вывела: «Моделирование табличного комплекса. Сбой устранён. Результаты — удовлетворительные. Время — 2.41.»
— Чтобы потом никто не говорил, будто вы тут только бумагу портили, — добавила она.
— Спасибо, — сказал Алексей.
— Не мне, — отмахнулась Тихонова. — Машине спасибо скажите. Она у вас сегодня второй раз избежала дурдома.
Евгений поклонился ЕС-1035 театральным жестом.
— Спасибо, товарищ машина, — произнёс он. — Обещаю, что когда-нибудь у вас будет маленький брат. Меньше, глупее, но свой.
Он вполголоса добавил:
— И без такой очереди.
Алексей улыбнулся: маленький, глупый — это как раз и был их табличный прибор. Только в его голове он уже не казался ни маленьким, ни глупым. Это был первый кусок будущего, который совпал с расчётами.
На выходе из зала воздух показался ещё более холодным, чем неделю назад. Завод спал, только где-то далеко потрескивали трансформаторы, из труб тянулся редкий дым.
Алексей шёл, прижимая к боку папку с распечатками.
Несколько десятков страниц с адресами и числами. На любой другой взгляд — скучный отчёт о какой-то пользовательской задаче. Для него — первое документальное доказательство, что их «ядро» умеет:
1) прочитать значение из ячейки,
2) сложить,
3) принять решение, куда идти дальше.
Ни одна из этих трёх операций сама по себе не была чудом. В его двадцать шестом году так делали всё подряд — от чайников до телевизоров. Но здесь, в сентябре семьдесят шестого, этот маленький цикл на большой ЕС-ке означал, что их будущая ЭВМ перестала быть только картинкой на ватмане.
В его прошлом-будущем, когда он первый раз увидел дамп памяти на БК-0010, пестревший числами вместо картинок, он подумал: «Как люди вообще это понимают?»
Потом постепенно научился видеть за цифрами движение программы. Сейчас он снова смотрел на колонки адресов и значений, и за каждым нулём и единицей видел провод на плате, NAND в корпусе К155 и будущего пятиклассника, который когда-нибудь будет нажимать на их клавиши.
— Ну что, — нарушил тишину Евгений. — Считаем, что ваш внутренний блок выжил?
— Считаем, что он перестал портить память, — ответил Алексей. — Для старта этого более чем достаточно.
— Ага, — кивнул Евгений. — Потом ещё программки ваши табличные научимся писать так, чтобы они его не доводили до нервного срыва.
— Это уже другая история, — сказал Алексей.
Он мысленно отметил: конфликт «получится ли логика» на сегодня снят. В инженерной практике это называлось проще: прошли первый unit-test. Только вместо зелёной галочки в IDE — запись в журнале у Тихоновой и пачка бумаги под мышкой.
Никакого пафоса, никаких фанфар. Просто где-то между нулём и тремя часами ночи в конце сентября 1976 года ещё одна невидимая линия в его внутреннем плане сместилась из столбца «бы» в столбец «есть».
Теперь оставалось самое скучное и самое важное: перенести эту логику с виртуальной ЕС-ки на реальный текстолит, не потеряв по дороге ни одного переноса бита.