Первая версия «Денди» была сделана впопыхах, без особых архитектурных затей, и по сути являлась безрегистровой двухадресной машиной [386]наподобие первых «Минсков». [387]То есть в роли регистров выступал весь объем ОЗУ, а любая машинная инструкция могла использовать не более двух ячеек памяти. Таким образом, результат операции сложения автоматически записывался на место одного из слагаемых. Это был шаг вперед по сравнению с трехадресными БЭСМ-4 или М-20, в которых нужно было явно указывать следующую, как бы третью ячейку, но за сокращение длины кода пришлось «платить» пересохранением данных для повторного использования.
Надо заметить, что в конце 60-х подобную схему можно было без всяких сомнений признать безнадежно устаревшей. Я был поражен, когда не в теории, а собственными глазами и руками попробовал, что значит указывать два адреса для памяти на 64 килобайта — это же два числа, каждое из которых по 16 бит! Если добавить минимальные 8 бит на саму инструкцию, получается цепочка в 40 бит. И всю эту груду ноликов и единичек надо как-то хранить в оперативной памяти и пересылать по жалкой 8-ми разрядной шине.
Выход нашли давно, лучшие «собаководы» из DEC для своей PDP-8 использовали «особую» ячейку-аккумулятор, в которой хранился один из аргументов, туда же, после выполнения инструкции, записывался результат. Специально адресовать аккумулятор не требовалось, и большая часть команд заметно укоротилась. Не смотря на возросшую сложность программирования, архитектура была очень популярна даже в СССР, по ней была сделана новая и прогрессивная серия «Уралов». Примени этот метод ребята Староса, на операцию сложения потребовалось бы не 40 бит, а всего 24. Но на первой «Денди» «схитрили» еще проще, пользуясь там, что код «Тетриса» занимал заведомо менее восьми килобайт, разработчики ограничились только 8-ю битами на адрес, и для сложения двух чисел вполне хватало 32 бит. [388]
Дальше больше, операции с относительно медленной памятью на ферритовых сердечниках успели изрядно надоесть конструкторам, и они пустились «во все тяжкие» в деле изобретения «быстрых» архитектур, из которых можно было выделить два основных направления — стековое [389]и регистровое.
Сторонники первого решили напрочь все упростить, и выкинули адреса из команд вообще. Соответственно, арифметико-логическое устройство оперировало исключительно двумя «верхними» ячейками, а сам стек был устроен примерно как магазин АК-47, в котором числа «заряжены» вместо патронов. В теории, сторонникам данной архитектуры никто не мешал добавить операции прямого доступа в основное ОЗУ, но красота идеологии потребовала крови практиков, которым оставили всего две операции — «загрузить в стек», и «выгрузить из стека». Причем нельзя сказать, что это все было какой-то абстрактной идеей, реализации «в натуре» не только существовали, но они еще и производили очень приличное впечатление. К примеру, стековые мейнфреймы Burroughs [390]B5500 и, тем более, B6500 вполне успешно конкурировали с IBM и вымирать как-то не собирались.
Регистровые варианты на этом фоне смотрелись откровенно консервативным развитием идеи аккумуляторов. Где была одна «особая» ячейка — стало две, три, восемь или шестнадцать, все с «особым» коротким адресом. Однако и тут назревали нешуточные «развилки истории». Кто-то ратовал за упрощение а-ля стек, при котором АЛУ будет иметь дело только с регистрами, другие отстаивали необходимость «длинных» команд для прямого обращения к памяти… На первый взгляд такая мелочь! Вот только для программиста, имеющего дело с кодами, получаются совершенно разные ЭВМ. Соответственно и перспективы могли выйти очень… Разными.
Тут-то бы и сказаться преимуществам послезнания во всей красе! Увы, ничего дельного я не мог подсказать даже по самым общим вопросам. Разве что споры о полных и ограниченных наборах команд навевали ассоциации [391]про будущие холивары между RISC и CISC, но полной уверенности всеж не было. Да и чем это могло помочь? Разумеется, я прекрасно помнил, что Intel использовал CISС до процессора i486DX, и только потом перешел на RISC-ядро. Вот только кто ответит, на сколько оптимальным был их путь?!
В поисках знаний я проштудировал кучу книг из будущего. Увы, скоро в голове было «не протолкнуться» от шин, кешей, акселераторов, обработчики графики, северных и южных мостов, AGP и PCI, и прочих хитрых аббревиатур… То, что было связано с программированием, вообще «вынесло мозг» разнообразием подходов и вариантов. Когда-то в будущем, я считал себя специалистом, весьма и весьма неплохо разбирающимся в особенностях компьютеров, да что там, я мог буквально часами рассуждать, к примеру, о преимуществах DDR3 SDRAM! Оказывается, это были пустые камлания вокруг маркетингового буллшита! Подражающий реальному диспетчеру дикарь в сплетенных их ротанга «наушниках» и куском палки в качестве микрофона мог «призвать» самолет с новой порцией стеклянных бус на ближайшую к стойбищу поляну с большей вероятностью, чем я связать свои навыки с проектированием реального устройства.
Хорошо одно — пока я пытался явить окружающим откровение из будущего, специалисты сами определились с решением. Едва «попробовав» первые образцы SRAM, и получив заверения в быстром росте количества бит на кристалле, сторонники «длинных» команд «с прямыми адресами» буквально «положили на лопатки» как своих «регистровых» оппонентов, так и желающих «попробовать стек». [392]Причина была тривиальной — полупроводниковое ОЗУ работало фактически на скорости будущего процессора, и отказ поддерживать доступ к нему на уровне команд стал казаться бессмысленной глупостью. [393]
После решения архитектурных вопросов, пошло моделирование. На этой стадии я даже не пытался вмешиваться, но все же примерно к пятой версии «Денди» не выдержал, и как-то очень по-доброму настучал Шелепину. Сколько можно, есть прототип сложностью чуть менее пяти тысяч транзисторов, в нем 8-ми битное АЛУ с логикой, сдвигом, сложением-вычитанием, такая же шина данных, 16-ти битные адреса позволяют использовать 64 килобайта памяти, где-то сбоку функциональной схемы пристроены 16 регистров общего назначения… И прочие параметры, эдак на три машинописных листа, если использовать ГОСТовский двойной интервал… В общем, мне казалось, что результат должен быть не сильно хуже «Ямахи» [394]из моего школьного детства.
Главное, система работает, ее надо в серию гнать, а не доводить до окончательного совершенства. Без того спецы «убили» последний квартал на какой-то хитрый двухфазный тактовый сигнал, [395]который дает надежду получить частоту минимум в один мегагерц. Вроде прекрасный результат, но только дай им волю — будут следующие полгода переводить прототип на четыре фазы, а потом и про восемь вспомнят.
В результате Филипп Георгиевич не разговаривал со мной неделю, но всеж разгул перфекционизма прекратил, и надо признать, сделал это очень вовремя. Позже стало понятно, что потеря темпа обошлась очень недешево, враг подобрался буквально вплотную. Совсем не тот, что изображается на развороте «Крокодила» в черных цветах и фашисткой каске с набранным болдом шильдиком «НАТО». Доморощенные конкуренты оказались куда опаснее.
Первое время нас буквально «спасала» относительно низкая тактовая частота, непонятность, и реальная сложность освоения новых технологий. Профессионалы-лебедевцы из ИТМиВТ походили было вокруг, но вполне справедливо решили, что даже сверхбольшие микросхемы не сильно помогут в деле создания будущей рекордной супер-ЭВМ БЭСМ-8. Поэтому оставили Староса в покое, сосредоточив свои немалые аппаратные возможности на добыче полупроводниковой памяти.
386
В конце 60-х годов реальной истории КБ-2 Староса по смешанной двух-трёхадресной схеме разработало управляющую ЭВМ «Электроника К-200», позже она выпускалась серийно на Псковском объединении «Рубин».
387
Здесь и далее описание архитектур сильно упрощено, т. к. используемые в 60-х годах приемы экономии памяти могут служить поводом для отдельной книги.
388
В «Электронике К-200» реальной истории было три блока адресов по 8 килослов (по 24 бита), два из которых два были в ПЗУ (память констант и память кода).
389
Стек образует множество логически взаимосвязанных ячеек, взаимодействующих по принципу «последним вошел, первым вышел» (LIFO, Last In First Out). Здесь и далее используется современная терминология, которая существенно отличается от принятой в СССР 60-х годов.
390
Burroughs Corporation основана в 1886 году как производитель арифмометров. ЭВМ Burroughs практически доминировали в банковском секторе. Действующая поныне система платежей SWIFT начала работать в 1977 году на ЭВМ Burrough. После 1986 года компания слилась с Sperry UNIVAC и переименована в Unisys.
391
Действительно, именно в этой точке началось расхождение сокращенного набора команд (RISC) и полного (CISC).
392
Считается, что стековые архитектуры были вполне конкурентоспособны до конца 80-х годов (появления реальных проблем с сохранением контекста при многозадачности и параллельных вычислениях). Впрочем, и сейчас некоторые специалисты готовы спорить об их перспективах.
393
Имеющий «стековую» систему команд Intel 4004 был запущен в разработку в 1969 году, и вполне вероятно, не был ориентирован на дешевую и большую полупроводниковую память.
394
Ямаха КУВТ комплекс учебной вычислительной техники на основе бытовых компьютеров стандарта MSX компании Yamaha, массово устанавливался в школах в середине 80-х и начале 90-х.
395
В процессоре много цепочек из триггеров, и время их срабатывания вполне конечно. Таким образом, можно подавать сигнал чаще, к примеру, четные триггеры будут срабатывать по заднему фронту синхроимпульса, а нечетные — по переднему. Сейчас для обозначения числа фаз изобрели термин «множитель процесора», а вместо «фронтов» используют локальные Ring-осциляторы. Например, 333МHz х 12 фаз = Phenom II X4 965 BE @ 3.996Ghz.