После шумного машинного зала коридоры Научного центра казались Громову слишком тихими. За плотно закрытыми дверями еще стучали печатающие устройства, где-то в глубине здания глухо тянула вентиляция, но этот шум становился дальним фоном.
Слава Крылов шагал рядом, легко огибая встречных лаборантов с папками. В своем институте он держался увереннее, чем на декабрьском техсовете: знал, где повернуть, кому кивнуть, у какой двери сбавить шаг.
— Евгений Александрович, помните ту восьмидюймовую дискету с CP/M? — спросил он, когда они свернули с основного коридора в боковой, более узкий. — Ту, что я вам в машинном зале передавал.
— Такое забыть трудно, — ответил Громов, перехватывая портфель с записями. — Я ее от Москвы до Владимира вез как государственный золотой запас. Только в лаборатории тогда было не до восторгов: олимпиада, сборка «Сферы-82», Петров со своим доносом. А вот когда Алексей Николаевич показал на ней «Смету» Седых, там уже считали деньги. Виктор Петрович, кажется, впервые увидел в машине вещь, с которой можно идти к бухгалтерии и наверх.
Слава улыбнулся, но улыбка быстро стала осторожной.
— Я тогда передал вам один готовый диск. Сейчас хочу показать среду, из которой он появился. Только сразу предупреждаю: это узкая рабочая кухня, где готовые западные программы сразу обрастают неприятными подробностями.
— Если неприятность имеет систематический характер, я почти счастлив, — сухо сказал Громов. — Ее хотя бы можно описать.
— Вот это Юрию Беспалову и скажите, — сказал Слава. — Он как раз занимается теми местами, где программа упирается в накопитель, терминал и чужой порядок записи.
Они остановились у двери с простой табличкой, где стоял только номер комнаты и фамилия ответственного за помещение. Слава коротко постучал костяшками пальцев и, не дожидаясь долгого ответа, приоткрыл дверь.
Внутри пахло бумажной пылью, сухим картоном и нагретой изоляцией. Комната занимала промежуточное место между машинным залом и библиотекой. Вдоль стен стояли металлические стеллажи: серые скоросшиватели, папки с машинописными ярлыками, широкие гармошки распечаток АЦПУ, коробки с перфолентами, журналы записи на машинное время. У окна стоял видеотерминал, потемневший экран отражал лампу под зеленым абажуром. Рядом, в отдельном шкафу, лежали пластиковые боксы с восьмидюймовыми гибкими дисками.
За столом у окна молодой инженер вытаскивал из дискового конверта бумажную карточку и сверял ее с записью в журнале. Худой, взъерошенный, в очках с тонкой металлической оправой, он хмурился так, будто карточка лично нарушила закон сохранения энергии.
— Юра, — сказал Слава. — Это Евгений Громов из владимирской группы.
Беспалов поднял голову.
— МикроДОС, — сказал он вместо приветствия.
— Иногда меня зовут и по фамилии, — заметил Громов.
— Фамилию я запомнил. Просто Слава неделю рассказывал, что у вас система умеет и по-русски разговаривать, и под CP/M маскироваться. Я тогда сказал, что в одном из двух вы врете.
— И что решили?
— Пока не решил. Поэтому и пустил.
Он протянул руку. Рукопожатие оказалось сухим и крепким: на пальцах чувствовались мелкие следы работы с разъемами, отверткой и сухой карточной бумагой.
Слава прикрыл за собой дверь.
— Юра у нас как раз связывает программы с нестандартной аппаратурой, — пояснил Слава. — Учит их понимать чужие схемы и капризные контроллеры.
— По бумагам нестандартная, — поправил Беспалов. — В работе самая обычная: включил, проверил, выругался, поправил. Странности начинаются у тех, кто пишет красивую процедуру вывода символа и думает, что символ сам попадет на экран.
Громов оглядел полки с дисками.
— Значит, та таблица была отсюда?
Беспалов помолчал, глядя на Славу. Тот едва заметно кивнул.
— Из нашего круга, — наконец сказал Юрий. — В обход обычной выдачи и заявочного шкафа. В Зеленограде есть несколько опытных комплектов, есть иностранные носители, есть люди, которые умеют с ними обращаться и не задают лишних вопросов вслух. Диск, который Слава передал вашей группе, был рабочей копией. Мы сначала сами проверили, что он читается, потом уже он пошел к вам.
— А первоисточник?
— Вам лучше этого не знать. Нам тоже иногда лучше не знать. Достаточно, что система там CP/M, диск восьмидюймовый, программа работает с файлами и держится в положенных границах обращения к железу. Поэтому у вас и появился шанс.
Он уже собирался убрать конверт обратно в бокс, но вдруг задержал взгляд на раскрытом портфеле Громова.
— А это у вас что?
Громов машинально прижал портфель коленом, как человек, у которого в голодный год спросили про лишний кусок хлеба.
— Где?
— Да вот. Конверты с дисками. Спокойно, я по технической части.
Слава повернул голову. Громов с видимым неудовольствием достал из портфеля две плотные бумажные оболочки. На одной аккуратным почерком Любы Ветровой было написано: «чистый носитель, 8 дюймов». На другой стоял только карандашный крестик, поставленный, видимо, самим Громовым, чтобы не перепутать сторону.
— Взял на всякий случай, — сказал Евгений. — Алексей Николаевич любит говорить «на месте разберемся». Я уже научился понимать: если Морозов говорит «разберемся», значит, программисту лучше иметь при себе бумагу, карандаш, отвертку и пару дисков. Иначе потом окажется, что вся работа встала только потому, что у Жени не оказалось под рукой чистого диска.
— Разумная привычка, — одобрил Беспалов.
— Опасная привычка, — поправил Слава. — Если ее заметит случайный проверяющий, Евгений еще полдня будет объяснять, почему в технической командировке у него в портфеле неучтенные диски.
Громов усмехнулся, но диски обратно не убрал.
Беспалов постучал пальцем по верхнему конверту.
— Тогда я вам кое-что запишу.
— Только избавьте меня от очередного редактора, — попросил Громов. — С редакторами я уже разобрался. Один работает, пока у него родной терминал, второй держится за свой накопитель, третий пишет на экран в обход общего порядка.
— Транслятор языка Си.
Громов посмотрел на него с таким лицом, будто Беспалов предложил ему изучить бухгалтерский учет добровольно и без командировочных.
— Какого языка?
— Си, — терпеливо повторил Юрий Сергеевич. — Есть такая рабочая копия под CP/M. BDS C. Небольшой микромашинный транслятор: без роскоши, местами грубый, зато помещается в разумный объём памяти и даёт код для восьмиразрядной машины. Пишете программу на Си, он переводит её в машинные команды.
— С языками высокого уровня я знаком, — сказал Громов, скрестив руки на груди. — Фортран знаю очень хорошо, тяжеловесным PL/I под ЕС меня тоже не испугать. Бейсик я вообще своими руками изнутри реализовывал, Алгол в теории разбирал. Но когда лезешь к устройствам, я предпочитаю машинные коды и ассемблер. Команды, которые сам вижу. Там хотя бы понятно, кто виноват. Я виноват. Процессор виноват. Иногда бумага виновата. А тут появится еще один посредник, который будет делать вид, что он умнее меня.
Беспалов оживился: похоже, именно такой реакции он и ждал.
— Вот поэтому и надо посмотреть. Для регистров и обращения к устройствам ассемблер останется. А если вам нужно разобрать текстовый файл, пройти по таблице, посчитать сумму, сравнить строки, собрать простую проверочную программу — зачем каждый раз руками вылизывать переходы и счетчики? Си держится ближе к машине, чем Фортран или Алгол, и позволяет уйти от одной и той же канители в сотый раз.
Громов скептически повертел чистый конверт.
— Ближе к машине, чем Фортран, но дальше, чем ассемблер. То есть ровно там, где можно получить и медленно, и непонятно.
— Можно, — согласился Беспалов. — Если писать без головы. А если с головой, то часть работы быстрее. BDS C требует такой же дисциплины, как любой транслятор. Сложные вычисления ему противопоказаны, с действительными числами там надо осторожно, библиотека небогатая. Зато для текстовых программ и маленьких средств проверки он очень удобен. Главное — требовать от него посильной работы, а ассемблер и бессонную ночь оставлять для своего участка.
Слава тихо рассмеялся.
— Юра, ты сейчас рекламируешь так, что Евгений Александрович обязан отказаться из чувства самосохранения.
— Я предупреждаю, — сказал Беспалов. — Пусть лучше человек сразу узнает правду. Си — хороший напильник. Им можно поправить деталь, а можно испортить палец.
Громов всё еще держал дискету двумя пальцами. Потом провел ногтем по краю бумажного конверта и спросил уже тише, без прежней гримасы:
— Команды какие?
Беспалов улыбнулся.
— Вот теперь разговор пошел правильно. Запишу рабочую копию и короткую памятку. Как включать, как собирать, где смотреть ошибки. Ваш накопитель может споткнуться о наш диск с первого раза.
— При таком исходе, — сказал Громов, — я буду считать, что судьба спасла меня от лишнего языка.
— При таком исходе, — ответил Беспалов, — я дам вам распечатку начального примера и список файлов. Всё равно вернетесь.
Он взял верхний конверт, аккуратно проверил, не загнут ли угол, и сделал на бумажной оболочке маленькую помету карандашом: «Си / CP/M / BDS». Потом полез к соседнему столу, где стоял дисковод, прикрытый серым чехлом, и начал освобождать место среди журналов машинного времени.
Громов наблюдал за ним с видом человека, которому только что всучили долговую расписку.
— Учить новый язык в командировке, — пробормотал он. — Прекрасно. Просто прекрасно. У меня теперь есть МИЭТ, топологи, форматы данных, контрольные суммы, Липатов с вопросами, Кац со своими выписками, и еще Си. Полный комплект счастья.
— Вы же программист, — сказал Слава. — Вам положено страдать от новых способов облегчить себе жизнь.
— Мне положено писать работающие программы, — буркнул Громов. — А страдать я умею и старыми способами.
Дисковод щелкнул, принимая чистый диск. Короткий механический звук прозвучал буднично: чужой накопитель взял владимирский носитель без лишних вопросов. Громов задержал взгляд на сером чехле с тем раздраженным любопытством, с каким смотрел на любой инструмент, который сначала хочется обругать, а потом всё равно приходится разбирать.
Громов провел пальцем по корешкам папок. На одних были аккуратные машинописные наклейки: «транслятор ассемблера», «программа сравнения файлов», «редактор исходных текстов», «контрольные суммы». На других стояли только внутренние номера и инициалы.
— Вы это как используете?
— Осторожно, — сказал Беспалов. — На отдельных стендах, в основном для своих задач. Где-то смотрим приемы, где-то переносим идею, где-то просто сравниваем, как люди пишут. Если начальству рассказать, что здесь лежит готовая западная библиотека, они решат, что завтра можно закрыть все наши работы и копировать. А на деле половина этого добра живет только вместе со своим терминалом, своим накопителем и своей таблицей знаков.
Он посмотрел на часы над дверью.
— Для ваших дисков я пригожусь. Для «СЛОЯ-81» вам нужен Кац. Я попросил его зайти, если он выберется от Ахметова.
Дверь открылась, и в комнату вошел Роман Борисович Кац. Он нес под мышкой тонкую папку с закладками и широкую распечатку, сложенную гармошкой. Очки были сдвинуты на кончик носа, лицо усталое, но внимательное: так смотрят на новый прибор, сразу прикидывая, куда его можно включить, чтобы он не испортил действующую схему.
— Уже выбрался, — сказал он, проходя к столу.
— Слава сказал, что вы наконец добрались до нашей программной кухни. Тогда лучше сразу снять лишние надежды. Здесь несколько разных порядков работы, и каждый оставляет после себя данные в своем виде.
Он положил распечатку на край стола.
— Большие ЭВМ считают тяжелые вещи: матрицы, участки топологии, технологические таблицы, статистику по партиям. Задания идут через машинное бюро, через перфокарты, перфоленты, иногда через магнитную ленту. Часть результата человек видит только как листинг АЦПУ. Часть остается в машинном массиве, куда пускают только по отдельному разрешению.
— И правильно сделают, — сухо сказал Громов. — Я бы тоже держал чужих людей подальше от своих массивов.
Кац кивнул, оценив здравый смысл.
— Дальше есть наши служебные программы. Они сортируют координаты, печатают выписки, сверяют номера слоев, пересчитывают партии, готовят куски для технологов. До законченной САПР в красивом смысле тут далеко: пока это рабочий набор программ, поправок и привычек, который держится на людях, журналах и конкретных машинах. Один человек знает, какой номер слоя в какой папке означает металл, другой помнит, что в старой выписке координаты шли от другого начала. Формально всё записано. Практически без живого проводника легко перепутать.
Беспалов постучал пальцем по дисковому боксу.
— А CP/M-круг живет рядом с этим маршрутом. Мы можем на малой машине посмотреть текст, сравнить два файла, быстро проверить таблицу, записать что-то на диск. Это мастерская около линии, с удобным столом и хорошими инструментами, но без права самовольно лезть в цеховую работу.
Громов провел взглядом от распечатки к коробкам с дисками.
— Значит, если мы привезли МикроДОС, главный вопрос — сможет ли она прочитать вашу разрешенную выписку.
— Именно, — сказал Кац. — Один узкий, оформленный кусок данных. «СЛОЙ-81» может встать сбоку от маршрута: НЦ подготовил выписку по одному участку топологии, затем ваша малая машина проверила формальное правило, а потом технолог снова смотрит глазами уже подозрительные места.
— То есть проверочная программа у стола тополога, — сказал Громов. — Обрабатывает выписку и печатает подозрительные координаты. Чертеж остается за технологом, маршрут — за НЦ, большие машины — за вашими людьми.
— Если вы так и запишете, я первым перестану морщиться, — ответил Кац. — Вторая польза: ваши маленькие программы могут готовить этот опыт. Проверить заголовок, пересчитать строки, сравнить две выписки, посчитать сумму по блоку. Работа скромная, зато именно на таких местах потом тонут большие доклады.
Слава, до этого молчавший у двери, сказал:
— Я поэтому и хотел, чтобы вы это увидели. В прошлый раз к вам попал готовый диск: вставили в накопитель, загрузили систему, таблица ожила. А здесь к каждому диску тянется хвост: машина, экран, листинг, журнал и человек, который помнит, как это записали.
— Да, — сказал Кац. — Программа без своего порядка работы быстро становится просто аккуратной распечаткой.
Громов достал из кармана тетрадь, оставил названия папок на потом, провел на чистом листе короткую черту и написал: «что переносится». Под ней вывел: «порядок работы», «формат файла», «кодировка», «проверка».
— Ладно, — сказал Громов. — Программы мы отложим. Вернемся к пути данных для «СЛОЯ-81». На техсовете мы договорились на выписку АЦПУ. Но я хочу понимать: как именно этот рулон появится на свет?
В комнате стало заметно тише. Даже Беспалов перестал вертеть дисковый конверт.
— Вот это правильный вопрос, — с уважением произнес Кац.
Он открыл нижний ящик шкафа и начал выкладывать предметы на стол: туго свернутую перфоленту в коричневой бумажной обертке, широкую гармошку распечатки АЦПУ, общую тетрадь с рукописными поправками и серый конверт с гибким диском.
— Вчера вы мужественно вызвались вбивать данные с распечатки, — сказал он, заметив, как Громов настороженно покосился на перфоленту. — Решение техсовета не меняется: первый опыт идет только по бумаге. Но вы должны понимать, что эта бумага не рождается из воздуха. До того как стать рулоном АЦПУ, эти же данные могут жить на ленте, в машинном массиве или в тетради с поправками тополога. Если вы этого не учтете, вы аккуратно, байт за байтом, перенесете в свою машину уже испорченную кем-то строку.
— А в этой тетради живет то, что между людьми: поправки, подписи, отметки «сверено», — указал Кац.
— Для машины она годится только после переписи в чистый вид, — добавил Беспалов. — А диск для наших внутренних работ удобен. Для вашего первого опыта он пока предупреждение на будущее: разметка, плотность, порядок секторов, символ конца строки и вопрос, прочтет ли ваш ИЗОТ наш носитель. Сейчас проще идти от утверждённого листинга, чем спорить с двумя накопителями и первым отделом.
Громов взял распечатку. На листе шли столбцы чисел, обозначения слоя, координаты, короткие служебные пометки. Для непосвященного это была серая каша. Для программиста — будущий файл, еще не получивший формы.
— Тогда шапка должна быть полной, — сказал он, водя карандашом над первой строкой. — Начало координат, единицы, номер слоя, порядок обхода контуров. Иначе я прочитаю участок правильно, а машина повернет его не туда.
— На разных участках бывает по-разному, — подтвердил Кац. — Одна группа описывает внешний контур, потом окна, другая идет строками. Для человека это видно на чертеже. Для машины это два разных мира.
Беспалов поднял палец.
— И ваша идея с контрольной суммой. Обязательно. Я буду выдавать распечатку строго с готовой суммой по каждому блоку. Ввели блок — пересчитали — сверили. При расхождении прекращаем работу. Никаких догадок.
— Программа должна останавливаться на таких местах, — поддержал Кац. — Намерения технолога угадывают люди, а машина сверяет запись.
Громов быстро писал. Теперь тетрадь наполнялась условиями первого обмена: «заголовок слоя», «начало координат», «единицы», «порядок контуров», «кодировка», «конец строки», «контрольная сумма», «подписи».
Дверь тихо открылась, и в комнату заглянула Лидия Борисовна Веденеева. Невысокая женщина в халате держала под мышкой папку с перфолентами и смотрела на стол так, будто сразу увидела главное нарушение порядка.
— Юрий Сергеевич, вы опять положили чистые конверты рядом с рабочими?
Беспалов поморщился.
— Лида, у нас тут высокий разговор о совместимости.
— Тем более, — спокойно сказала она и вошла. — У вас чистое лежит вперемешку с рабочим. Потом начнут гадать, где исходник, а где копия после правки.
Слава улыбнулся Громову:
— Лидия Борисовна как раз тот человек, который знает, как ваши красивые данные проходят через руки.
— Красота в данных начинается там, где два человека прочитали их одинаково, — сказала Веденеева.
Кац кивнул ей на стол.
— Мы обсуждаем первый обмен для «СЛОЯ-81». Громову нужен путь от нашей топологической выписки до их проверочной программы.
Лидия Борисовна поставила папку на край стола и, не спрашивая разрешения, развернула одну из перфолент.
— Тогда пишите формат строки вместе с маршрутом. Кто сделал выписку. Кто сверил слой. С какого листинга её переписывали. Кто пересчитал контрольную сумму. Где лежит бумажный лист, с которым сравнивали. А ленты и диски пока отмечайте как источник возможных расхождений, отдельной строкой после исходного материала.
Громов поднял глаза от тетради.
— Вы предлагаете останавливать проверку до выяснения?
— А что еще? — Веденеева посмотрела на него без улыбки. — Если у вас ошибка в исходных данных, самая умная программа только быстрее умножит ее на весь участок. Потом технолог будет смотреть на вашу распечатку и спрашивать, почему машина забраковала нормальное место.
— Лида постоянно ловит чужие «дефекты» в слое, — сказал Беспалов с видимым удовольствием. — Которые сидят в заголовке.
Веденеева бросила на него быстрый взгляд.
— Ищут другие. Я нахожу.
— Как обычно? — попросил Слава.
Она вздохнула, но папку не закрыла.
— Идет срочный заказ. Все нервные, начальство ходит кругами. На световом столе видят странный разрыв: по одной выписке проводник должен пройти рядом с окном, по другой будто пересекает его. Технолог ругается, тополог ругается, оператор клянется, что режет точно. Начинают проверять рубилит, пленку, журнал смены. Полсмены уходит. Потом я смотрю шапку листа: слой переписали правильно, а номер варианта оставили от предыдущей правки. Внизу все красиво, с подписью. Наверху одна строка чужая. И вся работа становится чужой.
Беспалов щелкнул пальцами.
— Вот вам и вся авария в одной строке.
— Вот именно, — сказала Лидия Борисовна. — После этого у нас шапка, контрольное число и подпись сверившего стали такой же частью работы, как резак и микроскоп. Машина только умножит ошибку, если ей с самого начала дали чужой лист.
Громов записал отдельной строкой: «ошибка в заголовке = останов».
— Значит, принимающая программа сперва проверяет заголовок, кодировку, номер слоя и сумму, — сказал он. — К геометрии переходит после подтверждения исходных данных.
— Вот теперь похоже на работу, — сказала Веденеева.
Кац аккуратно собрал разложенные предметы в одну линию.
— Видите, Громов, почему я морщусь при словах о готовых программах? Договоримся о среде — программа станет полезной. А пока всё держится на скучных вещах: как записали, кто сверил, чем прочитали, что считается ошибкой.
— Работы хватит, — сказал Громов. — У меня ощущение, что мы за один день нашли больше способов ошибиться, чем я успею запрограммировать за неделю.
— Это хорошее начало, — ответил Кац. — Теперь вы хотя бы знаете, от чего защищаться.
Беспалов положил перед Громовым пустую карточку из журнала.
— Напишите мне ваш минимальный формат. На одной карточке, пригодной для человека у перфоратора и человека у диска. Если они поймут одинаково, значит, у вас есть шанс.
Громов взял карточку и несколько секунд смотрел на чистое поле. Затем вывел первую строку: «объект; слой; начало координат; единицы; число записей; сумма».
— Так?
Беспалов прочитал, кивнул, потом дописал сбоку: «ответственный за подготовку».
Лидия Борисовна добавила еще ниже: «ответственный за сверку».
Кац поставил точку карандашом.
— А теперь это можно обсуждать с Ахметовым и Липатовым. Без подписи методиста такой обмен останется дружеской запиской.
Громов убрал карточку в тетрадь. Шкаф с дисками теперь выглядел иначе: там лежал ценный материал, а главная находка все равно оставалась на столе. Утверждённая распечатка, тетрадь сверки и карточка в несколько строк превращали чужой порядок записи в проверяемую работу.
Вечером в ведомственной гостинице батареи жарили так, что воздух казался сухим и колючим. На подоконнике остывали граненые стаканы с чаем. За стеной кто-то долго и безуспешно пытался настроить радиоприемник; в шуме то всплывал голос диктора, то снова тонул в треске.
Громов сидел на скрипучем стуле, вытянув ноги. Портфель стоял рядом, раздутый от тетрадей и разрешенных выписок. Морозов, закатав рукава рубашки, держал карточку Беспалова двумя пальцами и читал ее так внимательно, будто перед ним лежала первая страница будущего технического задания.
Липатов расположился напротив. Его двусторонний карандаш лежал параллельно краю блокнота, а сам Сергей Дмитриевич слушал молча, с тем выражением, при котором любой лишний оптимизм в комнате начинал чувствовать себя неуютно.
— Если коротко, — сказал Громов, откидывая голову на спинку стула, — то у них там зоопарк. Несколько порядков, которые держатся на честном слове и людской памяти. Большие ЭВМ жуют перфокарты и ленты по своему расписанию. У отдела Каца — терминалы, диски и свои привычки. А CP/M там вообще живет полулегально, как удобный напильник для тех, кто понимает.
— Практический вывод? — Морозов присел на край стола.
— Вывод такой: МикроДОС спасет нас в будущем, — ответил Громов. — Если мы когда-нибудь подружим их восьмидюймовые диски с нашими дисководами, мы будем перегонять тексты за секунды. Но сейчас мы туда не лезем. Первый опыт пойдет строго по бумаге, как и решили. И мне придется зашивать в программу проверки жесткие правила: кодировку, символ конца строки, порядок контуров и, главное, контрольные суммы по блокам. Потому что если оператор ошибся в шапке листа, их брак станет нашей проблемой.
— Да. Основной результат — формат обмена. Один слой, один участок, один порядок записи. Бумажная выписка остается исходным материалом и контрольным экземпляром. Перфолента или диск могут появиться только отдельным решением, когда Кац и Гальперин разрешат машинный путь. При расхождении контрольной суммы программа останавливается до выяснения. При расхождении заголовка с бумажной выпиской программа ждет исправленных исходных данных.
Морозов положил карточку на стол.
— Это хорошо. Мы предлагаем Зеленограду малую машину рядом с их маршрутом и проверку участка по формальному правилу. Чем уже первый опыт, тем сложнее зарубить его общими возражениями.
— И тем меньше соблазн у Громова написать половину чужой системы за две ночи, — сухо добавил Липатов.
Громов развел руками.
— После Каца у меня другой соблазн: попросить сразу их машинный массив и написать преобразование. Но это как раз та глупость, на которой нас остановят раньше первого прогона.
Морозов усмехнулся.
— Потому что вместо опыта получится самодеятельность.
— Да. Один человек помнит, что в этой папке слой считается от другого начала координат, другой ушел в отпуск, третий выдал листинг без шапки, и вся наша проверка начинает спорить с чужим порядком записи вместо топологии.
Липатов поднял карандаш.
— Тогда я пишу так, — сказал он и подвинул к себе блокнот. — Для «СЛОЯ-81» нужен официальный формат исходных данных. Бумажная выписка остается единственным материалом первого опыта и контрольным экземпляром. Диск или перфоленту выносим в отдельный вопрос.
— И контрольная сумма по блоку, — напомнил Громов. — Плюс журнал ошибок чтения и расхождений. В совместимом режиме МикроДОС читаем текстовые данные и служебные файлы, которые работают без чужого железа. Готовые программы, привязанные к конкретному терминалу, накопителю или таблице знаков, идут на изучение принципов; перенос откладываем отдельным решением.
Липатов записал и это.
— Формулировку смягчим, — сказал он. — «На изучение принципов»; вопрос переноса пока закрыт. Иначе Кац решит, что мы пришли оценивать их работу свысока.
— Кац и так решит, — сказал Громов. — Но оценит точность.
Морозов встал, подошел к окну и провел пальцем по тонкой полоске инея на стекле. За черным квадратом двора светились несколько окон соседнего корпуса. Где-то там лежали рубилитовые слои, журналы, перфоленты, диски, чужие программы, осторожные люди — и шанс, что завтрашний обмен данными не превратится в катастрофу.
— Завтра, — сказал он, не оборачиваясь, — начинаем с их данных. Что они готовы дать, кто подпишет, кто сверит и как мы поймем, что прочитали именно то, что они подготовили.
— Для демонстрации слишком много условий, — заметил Липатов.
— Это работа, — ответил Морозов.
Липатов закрыл блокнот, выровнял край обложки по краю стола и поднялся.
— Тогда я пойду к себе. Надо переписать это в нормальный порядок, пока вы оба не превратили рабочую договоренность в спор о прекрасном будущем. Завтра утром сверим формулировки.
— Сергей Дмитриевич, — сказал Громов, — если мы превратим рабочую договоренность в спор о прекрасном будущем, вы всё равно придете и вычеркнете половину.
— Разумеется, — ответил Липатов. — Для этого я здесь и нужен.
Он ушел в соседний номер. Дверь закрылась. За стеной послышался короткий скрип стула, потом щелчок настольной лампы: Липатов снова сел за свои формулировки.
Громов подождал несколько секунд, убедился, что Сергей Дмитриевич действительно занят своими бумагами, и только после этого достал из портфеля конверт с дискетой.
— Кстати, — сказал он почти небрежно. — Беспалов мне еще одну радость подложил. Транслятор Си. BDS C. Сказал, под CP/M, для восьмиразрядных машин. Велел смотреть, если я окончательно устану от ассемблера.
Морозов, бравший с подоконника остывший чай, замер со стаканом в руке.
— Повтори.
— Что, «окончательно устану от ассемблера»?
— Нет. Что он дал.
Громов насторожился. Морозов редко оживлялся так резко из-за чужой дискеты.
— Си, — медленно произнес Евгений. — Компилятор. Под CP/M. Небольшой, как они говорят. Ты чего?
Морозов поставил стакан на стол так резко, что чай плеснул на блюдце. Потом вдруг рассмеялся открыто, почти мальчишески. Он прошелся по комнате, вернулся к столу, снова посмотрел на конверт и хлопнул ладонью по подоконнику — обычно он позволял себе лишь сухую усмешку.
— Вот это подарок.
Громов смотрел на него с подозрением.
— Ты радуешься чужому компилятору так, будто тебе выдали персональный машзал.
— В некотором смысле — да.
— Лёш, — Евгений сел ровнее. — Ты сейчас меня пугаешь. Мне Беспалов весь день объяснял, что чудес нет, Кац объяснял, что чужие программы ломаются о чужие терминалы, Липатов объяснял, что каждую радость надо записывать в методику. И вдруг ты радуешься. Значит, либо я чего-то не понял, либо это действительно опасно.
Морозов взял конверт осторожно, будто внутри лежала тонкая пластина с будущим.
— Я радуюсь потому, что теперь, если прижмет, я смогу сам быстро написать часть рабочих программ. Твой участок остается за тобой, а я говорю о разборке данных, таблицах, проверках, форматах, маленьких расчетах. О местах, где ассемблер слишком дорог по времени.
Громов моргнул.
— Ты?
— Я.
— На Си?
— На Си.
Евгений откинулся на спинку стула. В его лице постепенно проступало предчувствие большой несправедливости.
— Подожди. Ты хочешь сказать, что в твоем две тысячи двадцать шестом году ты писал на этом языке?
— Да.
— На языке, который Беспалов сейчас записал мне на дискету как экзотику для CP/M?
— На его потомке, — поправил Морозов. — Очень далеком. Сильно выросшем. Обросшем правилами, библиотеками, привычками, школами. Но в основе — всё тот же Си. Байты, указатели, массивы, память и знакомая досада от того, что ошибка чаще всего принадлежит тебе лично.
Громов молчал. Потом медленно потер лицо ладонями.
— Значит, я только что получил язык из твоего будущего.
— Из моего будущего ты получил пока только одну ниточку, которая дотянется до него.
— Красиво сказал. Липатов бы сейчас потребовал определить термин «нитка» и указать сечение.
— А потом завел бы для нее отдельную графу в методике.
Громов фыркнул, но тут же снова стал серьезным.
— А второй твой язык? Ты как-то говорил про схемы, про кристаллы, про то, что всё это потом будут делать иначе. Был еще какой-то основной?
Морозов сел напротив. В комнате стало тише. За стеной Липатов перелистнул бумагу; этот бытовой шорох, наоборот, делал разговор более тайным. Алексей говорил негромко, без театральности, но в голосе у него появился тот самый оттенок, который Громов слышал зимой у Золотых ворот: человек из будущего пытался перевести огромную невидимую эпоху на язык, понятный инженеру восемьдесят первого года.
— В двадцать шестом мой основной рабочий язык для схем назывался Verilog. Это язык описания аппаратной логики: текст, из которого потом специальные программы строят цифровую схему.
Громов уставился на него.
— Текст строит схему?
— Текст описывает, как должна вести себя схема. Какие сигналы куда идут, какие регистры в каком такте меняются, что происходит при сбросе, где счетчик, где память, где управляющий автомат. Потом этот текст проверяют, моделируют, переводят в структуру элементов и дальше в кристалл.
— То есть в будущем ты задаешь схему текстом?
— Для цифровой логики такого уровня — да. Представь, что вместо листа с нарисованными вентилями и триггерами ты пишешь: вот регистр, вот условие, вот переход. А программа-синтезатор сама раскладывает это в логические элементы.
Громов подался вперед, явно пытаясь уложить это в своей программистской картине мира.
— Подожди. Когда я транслирую ассемблер или этот твой Си, мой текст превращается в нули и единицы. В команды для уже готовой машины. А когда ты транслируешь этот свой Верилог… во что превращается он?
— В саму машину, — просто ответил Морозов. — Мой текст не говорит процессору, что делать. Мой текст создает процессор. На выходе получается не работающий код, а физическая топология связей. После завода ты держишь мой откомпилированный текст в руках в виде кремниевого кристалла.
Громов уставился на него с почти суеверным ужасом.
— Текст, который при компиляции превращается в кусок железа.
— Да. И программа сама раскладывает его в тысячи и миллионы элементов.
Громов тяжело сглотнул.
— Миллионы?
— Миллионы, потом миллиарды.
— В одном кристалле?
— В одном кристалле.
Евгений тихо сказал что-то непечатное и посмотрел на конверт с BDS C уже иначе: будто в руках у него оказалась не просто дискета, а ключ от чужого, непонятного механизма.
— А Си тогда зачем, если у вас есть этот… Верилог?
— Потому что железо без программ остается железом. На Си пишут системные программы, куски операционных систем, программы для микроконтроллеров, проверочные средства — всё, что живет рядом с памятью и машиной. Си опасный, резкий язык: ошибка там часто прячется дальше, чем в ассемблере. Зато он переносится с одной архитектуры на другую.
— То есть ассемблер для ленивых?
— Ассемблер — для задач, где каждая команда должна быть твоей. Си — для задач, где важнее быстро описать работу с байтами, таблицами, файлами и памятью. Иногда компилятор сделает хуже, чем ты руками. Иногда достаточно хорошо. А иногда он спасет неделю жизни.
Громов прищурился.
— И в твоем будущем на нем пишут серьезные вещи?
Морозов улыбнулся.
— В моем будущем на нем пишут такие серьезные вещи, что если бы я перечислил, ты бы решил, что я тебя разыгрываю. Управление приборами, связь, низкоуровневые части больших систем, программы для маленьких контроллеров. И да, Жень, теперь самое смешное.
— Куда уж смешнее-то?
— Перед тем как проснуться здесь, я работал над кристаллом для бытовой линейки. Дешевый однокристальный контроллер: маленькая управляющая машина в одном корпусе. По сути — мозги для таких приборов, которые человек твоего времени назвал бы чайником, кофеваркой, стиральной машиной или чем-нибудь еще более обидным.
Громов несколько секунд смотрел на него без выражения. Потом спросил очень тихо:
— Для чайника?
— В том числе.
— Микросхему.
— Да.
— Для чайника.
— Для умного чайника, если угодно. Хотя слово «умный» там часто означало, что люди из сбыта придумали прибору лишнюю бесполезную кнопку, которая удваивала цену, но прекрасно смотрелась на рекламных плакатах.
Евгений зажал рот ладонью. Плечи у него дрогнули. Он попытался удержаться, но смех вырвался коротким хриплым звуком, потом перешел в почти беззвучный приступ. Громов согнулся над столом, одной рукой держась за край, другой показывая на Морозова и задыхаясь от смеха.
— Тише, — сказал Алексей, но сам улыбался.
— Подожди, — выдавил Громов. — Сейчас. Сейчас я должен это осознать. Ты приходишь из будущего, рассказываешь мне про миллиарды элементов в кристалле, про язык, который строит схемы из текста, про машины, которые стоят у каждого на столе… а сам в это время делал микросхему для чайника?
Он снова сорвался. Смех стал освобождающим. За последние дни в Зеленограде на него навалились рубилит, форматы, допуски, чужие машины, закрытые кабинеты, люди в очках, которые задают правильные вопросы. И вдруг всё это будущее, с его миллиардами транзисторов, оказалось привязано к кухонному чайнику. К предмету настолько простому, что рядом с ним смешно было произносить слово «кристалл».
— Для чайника! — шепотом повторил Громов и снова прыснул. — Лёша, я тебя умоляю, никогда не говори это Олегу. Он тебя до конца жизни будет спрашивать, сколько тактов нужно, чтобы вскипятить воду.
— Олег бы первым делом спросил про развязку с сетью.
— А Люба — про потребление!
— А Липатов — про методику испытаний чайника в крайних режимах.
Громов окончательно сдался и смеялся уже открыто, уткнувшись лбом в ладонь. Морозов дал ему выдохнуться. Евгений вытер глаза, поднял голову и посмотрел на конверт с BDS C уже без прежней злости.
— Господи. Микросхемы для чайников. Значит, мы тут мечтаем о персональных ЭВМ, а вы там сорок лет спустя снова воюете за чайник.
— За миллионы чайников, — поправил Морозов. — В этом как раз суть. Процессоры расползутся из вычислительных машин в приборы, станки, автомобили, связь, медицинскую технику, игрушки, замки, счетчики, лампы. Сначала люди поставят компьютер на стол, а потом начнут прятать микросхемы и полноценные компьютеры внутрь всего подряд.
Громов перестал улыбаться.
— Внутрь всего?
— Почти всего, до чего дотянутся деньги и фантазия. Иногда разумно, иногда — бессмысленно. Но это произойдет. И там везде понадобится кто-то, кто умеет говорить с железом на уровне отдельных команд процессора и на уровне переносимого описания: вот данные, вот память, вот состояние, вот проверка, вот ошибка.
Евгений постучал пальцем по конверту.
— Си.
— Си. И его потомки. Плюс языки описания аппаратуры, вроде Верилога. Плюс еще множество языков, которые будут появляться, спорить между собой, обещать счастье и частично его давать.
— А наши?
— Что «наши»?
— Мои языки. Ассемблер К580, машинные коды. Да тот же Фортран и PL/I, в конце концов. Всё, на чем я сейчас живу и что так хорошо знаю.
Морозов помедлил. Он понимал, что для Громова язык был профессией, привычкой думать, рукой, которая сама тянется к регистру A, к HL, к стеку, к флагу переноса. Сказать «умрет» значило ударить по человеку, который в нем жил.
— Почти всё уйдет, — сказал Алексей мягче. — Постепенно. Твой любимый Фортран надолго застрянет в узких нишах тяжелой математики у физиков, а PL/I вымрет, как динозавр, не выдержав собственного веса. Ассемблер останется как ювелирный инструмент, но каждый ассемблер привязан к своему железу. Умрет семейство процессоров — вместе с ним уходит и живой язык команд. Его можно хранить, изучать, создавать работающие математические модели (мы называем это словом эмулировать), но писать на нем новую жизнь уже почти некому и незачем.
— К580 тоже?
— Конечно.
Громов посмотрел на свои руки.
— Забавно. Я, значит, сейчас пишу на языке, который обречен.
— Ты пишешь на языке, который нужен сейчас. Благодаря ему будет сегодняшняя машина. Но если ты хочешь понимать, куда всё пойдет дальше, тебе нужен Си.
Морозов кивнул на конверт в руках программиста.
— Си — это не просто один транслятор. Это целая грамматика будущего. Его синтаксис — фигурные скобки, точки с запятой, структура функций — станет родоначальником целого древа языков.
Громов сдвинул брови, пытаясь представить это древо.
— Например?
— Скоро появится C++. Это развитие Си: он сохранит работу с памятью и адресами, но позволит строить сложные программные объекты, описывающие реальный мир. На нем будут писать самые тяжелые, быстрые и требовательные к железу вещи: операционные системы, графику с миллионами точек, системы управления станками.
— То есть Си для быстрых дел, С++ для сложных, — кивнул Громов. — А дальше?
— А дальше, через десятилетие с лишним, появится язык Джава, а за ним Си-шарп. Их придумают для других задач. Они будут работать поверх гигантских мировых сетей, связывая между собой огромные вычислительные центры банков, заводов и корпораций. Там главная задача — чтобы программа, написанная на одном конце света, гарантированно запустилась на любом железе на другом конце.
— Машинная независимость в квадрате, — усмехнулся Громов. — А еще?
— А еще Джава станет основным языком для тех самых карманных машин с триллионами байт, про которые я тебе зимой рассказывал.
Громов замер.
— Для аппаратов с экраном, картой города, библиотекой и фотоаппаратом?
— Да. И забавно то, что в моем времени этот вычислительный монстр в кармане всё еще по привычке будут называть просто «телефоном». Хотя, учитывая, сколько туда напихали процессоров, памяти и датчиков, от первоначального телефона там осталось только название. Впрочем, звонить он тоже будет уметь.
Громов потер лоб.
— Я в некотором замешательстве, Лёша. Выходит, изучая этот ваш Си сейчас, я заодно учу половину языков будущего?
— Синтаксис и логику чтения — да.
— Ладно. А как же Бейсик? Мы ведь только-только продавили МикроБейсик для школ как универсальный входной билет для новичков. Он тоже умрет?
— Бейсик умрет, — спокойно кивнул Морозов. — Он выполнит свою историческую миссию: покажет людям, что с машиной можно говорить по-английски, а не кодами. И уйдет. Для школьников, студентов и ученых появится другой язык с очень низким порогом вхождения. Он называется Питон.
— Питон, — эхом повторил Громов. Названия из будущего начинали звучать как издевательство. — И в чем его сила?
— В том, что он прячет от человека вообще всю физику машины. Там нет типов переменных, которые ты задаешь заранее. Нет ручного выделения памяти. Нет фигурных скобок для блоков — блоки выделяются просто отступами на странице. Пишешь: `х равно списку чисел`, потом `напечатать сумму х` — и он сам понимает, где взять память, как сложить и когда освободить место.
У Громова дернулась бровь. Как человек, привыкший лично контролировать каждый байт и следить за переполнением регистров, он испытал почти физическую боль.
— Он сам понимает, где взять память? Без моего приказа?
— Да. И сам ее за собой убирает. У него внутри работает автоматический сборщик мусора.
— И типы данных не проверяет при трансляции?
— Их можно менять прямо на лету. В одной строке `x` — это число, в другой — строка текста, в третьей — сложный массив данных.
Громов уставился на Морозова остановившимся взглядом.
— Лёша, это не язык программирования. Это анархия. Это поощрение умственной деградации! Человек же вообще перестанет понимать, сколько тактов и байтов он только что сжег одной строчкой! Да такой язык должен работать медленнее черепахи!
— Он и работает медленнее черепахи. По меркам Си или ассемблера Питон — это чудовищно прожорливый и медленный интерпретатор.
— Так зачем он нужен⁈
— Потому что время программиста станет дороже машинного времени, — жестко отчеканил Морозов. — В твоем времени машина стоит миллионы, а программист получает сто сорок рублей в месяц. В моем времени вычислительная мощность стоит копейки, а час хорошего разработчика — целое состояние. Питон позволяет ученому-физику, биологу или школьнику написать сложную программу за вечер, не тратя полгода на изучение того, как устроен стек и где происходит утечка памяти. Железо всё стерпит.
Евгений молча положил конверт с дискетой на стол. Повертел его, будто взвешивал новую неприятность, которая вдруг стала необходимой.
— Я недооценил этот ваш Си, — сказал он наконец, глядя на диск как на спасательный круг. — Если альтернатива — это анархия, где машина сама решает, когда ей убирать за мной мусор, я лучше буду писать на Си.
— Ты только начинаешь его оценивать. Так точнее.
— Хорошо. Тогда завтра вытащу из Беспалова всё, что у него есть: памятку, примеры, команды, что можно читать, чего нельзя трогать. И буду учить.
— Но ассемблер не забывай, он нам ещё долго нужен будет.
— Разумеется. Если этот ваш чайниковый язык переживет мои машинные коды, надо хотя бы узнать, за что такая честь.
Морозов поднял стакан.
— За чайники, значит.
— За чайники, — сказал Громов и впервые за весь вечер посмотрел на диск без раздражения.
Они посидели молча. За стеной Липатов аккуратно кашлянул, перевернул страницу и снова начал писать. В соседнем корпусе гудела вентиляция. На столе рядом лежали бумажная карточка формата обмена и скромный конверт с BDS C.
Громов открыл тетрадь и крупно написал: «Формат обмена СЛОЙ-81. Минимальная спецификация». Ниже вывел первую строку: «Заголовок: объект, слой, начало координат, единицы, записи, сумма, ответственные».
Он остановился, подумал и добавил еще одну строку: «До проверки геометрии проверить исходные данные».
На следующей странице он поставил отдельный заголовок: «Си. Разобраться. Написать пробную программу».