FORTH — вперед, в четвертое измерение компьютерных архитектур

24 август, 1998 - 15:22Андрей Зубинский

В рамках публикации архивных материалов нашего издания, предлагаем вашему вниманию статью из № 31 (150) «Компьютерного Обозрения» от 24 августа 1998 г. Первая статья о FORTH и стековой архитектуре, которая 20 лет назад, как казалось, должна была перевернуть мир.

Игра слов в названии: «forth» при дословном переводе означает «вперед», однако — это сокращение от «fourth», что означает «четвертый».

ПОЧЕМУ О FORTH’!?

К написанию этой статьи меня побудили, казалось бы, совершенно не взаимосвязанные вещи: во-первых, промелькнувшие сведения о подготовке корпорацией Microsoft встраиваемой (embedded) версии системы Windows NT, во-вторых, анонсированные компанией Rambus технология и образцы быстродействующей оперативной памяти RDRAM с частотой доступа 400-800 MHz и, наконец, в-третьих, самые теплые воспоминания о моем самодельном древнем восьмибитовом компьютере. Надеюсь, что эти разрозненные предпосылки будут поняты в ходе прочтения.

ИСТОКИ FORTH

В далеком 1970 г. одному из программистов Стенфордского Линейного Ускорителя (сейчас более известного как Стенфордский Линейный Коллайдер) Чаку Муру (Chuck Moore) была поручена разработка программы для управления тележкой антенны радиотелескопа Национальной Радиообсерватории.

FORTH — вперед, в четвертое измерение компьютерных архитектур

Помучившись несколько месяцев с различными средствами разработки, Мур отчаялся создать свою систему программирования и уже с ее помощью решить поставленную задачу. К 1971 г. не только была реализована новая система программирования, но и полностью автоматизирована работа радиотелескопа. Система управляла позиционированием антенны, сбором и накоплением данных, их хранением, обработкой и отображением результатов на графических терминалах. Все множество задач выполнялось на единственной ЭВМ PDP-11 (некоторые, наверное, помнят ее отечественный вариант СМ-4). Практически система была создана одним (!) человеком. Мур назвал ее «четвертой» (fourth) — по принадлежности к новому, четвертому поколению средств разработки и операционных систем. Но машина PDP-11 не позволяла на то время использовать имена длиннее 5 символов, поэтому название fourth было сокращено до FORTH.

Простота, надежность и удобство системы превзошли все ожидания — к 1976 г. она работала без единого сбоя и остановки. Это обусловило ее популярность среди астрономов — система и по сей день используется на большинстве радиотелескопов мира (в том числе, безукоризненно управляет тремя из четырех астросистем космических челноков SpaceShuttle). Вот и первая предпосылка (о встраиваемой версии Windows NT) — интересно, сколько денег и времени затребуют современные системные интеграторы на решение задачи автоматизации радиотелескопа?

Простота и стабильность FORTH-системы обусловили ее широкое применение и в других областях. Достаточно вспомнить первый «суперэффектный» фильм «Терминатор 2: Судный день», спецэффекты для которого создавались в системе Morphing, написанной на FORTH.

FORTH СЕГОДНЯ

Массовый психоз от появления операционных систем и языков программирования «всех времен, стран и народов» может вызвать у программиста на FORTH только улыбку печального скептика. «Ах, Java!..», «Ах, независимость от платформы!..», «Ах, объектно-ориентированная система!..». A FORTH-cneциалист ухмыльнется — да ведь виртуальная байт-машина Java и есть на самом деле FORTH-машина, и работает FORTH даже на том, на чем Java и не снилось, — от восьмибитового PIС-контроллера фирмы Microchip с 1 КВ ПЗУ на кристалле до суперкомпьютеров Cray, а объектно-ориентированный механизм является основой FORTH (для тех, кто захочет изучить FORTH, следует обратить внимание на механизм CREATE DOES>).

Кроме того, отличная реализация FORTH-системы занимает не больше 16 КВ на любой платформе. Наверное этим определяется достаточно устойчивый интерес к FORTH и сегодня. В подтверждение приведу график цитируемоести слова «FORTH» в разделе «Языки программирования» Библиотеки Конгресса США (рис. 1).

FORTH — вперед, в четвертое измерение компьютерных архитектур

БЛЕСК И НИЩЕТА FORTH-СИСТЕМЫ

Лучший краткий рассказ о системе FORTH для тех, кто ее не знает, звучит примерно так: «Это совсем другая система». FORTH — не совсем язык программирования и не совсем операционная система. FORTH — это другая архитектура. Архитектура стековой машины. Поэтому даже профессиональному программисту, не знакомому с FORTH и стековыми машинами, при изучении FORTH целесообразно впасть в состояние deja’vu и начать все сначала. В FORTH-системе действительно сочетаются блестяще реализованная архитектура и пуритански-нищие, на первый взгляд, встроенные возможности.

СТЕКОВЫЕ АРХИТЕКТУРЫ — ЭФФЕКТИВНОСТЬ И ДЕШЕВИЗНА

Понятие стека (stack) относится к одним из фундаментальных и самых простых в теории и практике компьютерных вычислений. Наглядная некомпьютерная реализация стека — это стопка тарелок. С нее можно либо снять самую верхнюю тарелку (операция pop), либо положить тарелку на вершину стопки (операция push). Последняя уложенная тарелка, таким образом, будет снята первой. Вот, собственно, и все, что нужно знать о стеке. Несмотря на кажущуюся простоту, стек — основа основ любой программы, выполняющейся на любом компьютере. Прерывания, вызовы функций и процедур, возвраты значений — все эти процессы, составляющие операционные системы и прикладные программы, базируются на стеках.

Естественно, специалисты по компьютерным архитектурам давно создали и аппаратную поддержку стеков, и вообще компьютеры, построенные на аппаратных стеках. Теперь практически во всех процессорах стеки имеют некоторую аппаратную поддержку. Например, в самых распространенных процессорах семейства Intel х86 есть специальный регистр стека. Существует даже классификация различных процессоров по критерию аппаратной поддержки стека (табл. 1).

FORTH — вперед, в четвертое измерение компьютерных архитектур

В этой классификации нас будут интересовать так называемые «чистые стековые машины» с несколькими большими аппаратными стеками. В принципе, стековую архитектуру можно реализовать на любом процессоре, что и сделано во всех программных версиях FORTH, однако это означает эмуляцию со всеми вытекающими последствиями — относительными потерей производительности и повышением сложности программной реализации. Основное отличие «чистых стековых машин» — организация внутренних регистров процессора. В традиционных процессорах имеется группа регистров, каждый из которых может быть адресован непосредственно указанием адреса в коде команды или косвенно. Адрес регистра (ячейки оперативной памяти), который называется операндом, должен находиться в команде, выполняемой процессором. Это приводит к усложнению системы команд процессора и, следовательно, внутренней логики, увеличению степени интеграции, повышению размера кристалла, необходимости применения всяческих ухищрений (суперскалярности и пр.). Потребителю оно, конечно же, незаметно, но достаточно больно «бьет по карману».

В «чистой стековой машине» регистры организованы в стек (или стеки) с поддержкой всего двух команд — push и pop. Машины с нулевым числом операндов в команде имеют доступ только к самому «верхнему» регистру стека, и все операции производятся только с ним. Один операнд в команде подразумевает наличие аппаратного стека с доступом к «верхнему» элементу и дополнительного регистра — аккумулятора. Самая экзотичная архитектура, реализованная в проекте SOCRATOS (два операнда в команде), достаточно сложна и спорна, поэтому на ней мы останавливаться не будем.

FORTH — вперед, в четвертое измерение компьютерных архитектур

Первая особенность стековой машины, ощутимая для пользователя, — ее простота и, следовательно, дешевизна. Современные реализации 32-битовых стековых процессоров содержат больше 50 внутренних регистров, работают на частотах 50-100 MHz, обеспечивают массу полезных аппаратных возможностей (например, программно-настраиваемый интерфейс с различными подсистемами оперативной памяти). Для реализации всего этого используется кристалл с числом транзисторов меньше 150 тыс. (для сравнения — Intel Pentium 100 MHz содержит порядка 3 млн 100 тыс. транзисторов). И стоит такой процессор до $10 (для оптовых покупателей).

Вторая особенность — компактность и большая скорость выполнения программ, написанных на языке высокого уровня и затем откомпилированных. Еще заметнее рост производительности для Java-программ и апплетов. Хорошим примером может служить сравнение эмуляции байт-команды Java IADD (сложение двух целых 32-битовых чисел) на разных платформах, приведенное в табл. 2.

FORTH — вперед, в четвертое измерение компьютерных архитектур

Третья особенность — простота портирования приложений любого уровня сложности и назначения для стековых архитектур. От уровня операционной системы до прикладной программы любой, даже очень сложный пакет может быть перенесен в кратчайшие сроки. Дело в том, что на стековых машинах весьма просто реализуются компиляторы практически любых языков высокого уровня, легко, соответственно, переносятся затем написанные на этих языках программы. Кроме того, язык ассемблера стековых машин — предельно простой и эффективный, существенно облегчающий перенос или создание машинно-зависимых частей программ.

Настало время объяснить вторую предпосылку возникновения этой статьи — появление технологии RDRAM фирмы Rambus. Для стековых процессоров с относительно низкой степенью интеграции добиться высокой тактовой частоты (порядка 1 GHz) достаточно просто. По крайней мере, намного проще, чем для «монстров» с миллионами транзисторов. В сочетании с быстродействующей оперативной памятью подобным процессорам не потребуется кэш-память — дорогой и хороший только при среднестатистических оценках механизм. А учитывая низкую стоимость самих стековых процессоров и лихорадочно снижающиеся цены на оперативную память (безотносительно к технологии), можно смело утверждать, что подобные системы — отличная перспектива для растущих рынков PDA, Java-терминалов, встраиваемых систем.

ВНУТРИ СТЕКОВОЙ МАШИНЫ

Самая простая реализация «чистой стековой машины» предусматривает минимальный объем необходимых аппаратных средств и так называемую «высокую регулярность исполнения». Под ней понимается однородность используемых при проектировании базовых блоков цифровой электроники — регистров, счетчиков и пр.

Приведенная на рис. 2 структура стековой машины попадает (по классификации табл. 1) в класс «много больших стеков, число операндов в команде 0». Назначение отдельных элементов структуры: стек данных — аналог набора регистров в процессоре архитектуры CISC (со сложным набором команд) или регистрового окна в архитектурах RISC (с сокращенным набором команд); стек возвратов -уникальная для стековой архитектуры деталь — в нем хранятся адреса возвратов в вызывающую подпрограмму из вызванной; АЛУ (Арифметико-Логическое Устройство), Подсистема Ввода/Вывода, Логика Управления, Счетчик Команд и Регистр Адреса — стандартные узлы практически всех микропроцессоров с абсолютно одинаковым назначением в любых архитектурах. Зато система команд канонической стековой машины не имеет ничего общего с командами любых других микропроцессоров. Во-первых, стековая машина — это действительно RISC-машина, иногда даже называемая MISC-архитектурой (Minimal Instructions Set Computer, компьютер с минимальным набором команд). Во-вторых, в командах канонической стековой машины нет понятия регистра — основного элемента «классических» процессорных архитектур.

КАК ЭТО РАБОТАЕТ

Самым, пожалуй, замечательным в стековых машинах является не столько простота реализации, сколько простота понимания принципа работы. Если исключить очевидные арифметические и логические команды (сложение, вычитание, битовые операции и пр.), система команд стековой машины включает в себя всего лишь 12 базовых инструкций (табл. 3). Мнемоническое обозначение команд (фактически, язык ассемблера) стековой машины принято заимствовать из FORTH-системы. Все команды уникальны для стековой архитектуры и предельно просты. Их можно объяснить даже восьмилетнему ребенку (личный опыт автора). Кстати, радетели современного образования и просвещения, сколько можно калечить бедных детей обучением никому не нужному и совершенно бездарному языку Basic?

FORTH — вперед, в четвертое измерение компьютерных архитектур

Те, кому известен язык ассемблера какого-либо микропроцессора, сразу могут понять преимущества стековой машины. Остальным придется поверить автору на слово. В любом микропроцессоре «классической» архитектуры вызов подпрограммы, например, связан со значительными затратами: во-первых, необходимо сохранить значения всех регистров процессора, во-вторых, — сохранить адрес возврата в предварительно организованном стеке, в-третьих, — следить во всей программе за целостностью стека возвратов. В стековой машине значения регистров сохранять не нужно. Их просто нет. Создавать стек возвратов тоже не нужно. Он есть. Единственное, что нужно, — минимально использовать стек возвратов не по прямому назначению для обеспечения высокой надежности программы. Очевидно, что быстрый вызов подпрограмм — сильная сторона стековых машин. Именно поэтому они широко применяются для создания систем реального времени, критичных к надежности кода.

СТЕКОВЫЕ МАШИНЫ «В ЖЕЛЕЗЕ»

Современный этап создания аппаратных реализаций стековых машин непосредственно связан с именем Чака Мура. Кроме великолепной программной реализации виртуальной стековой машины FORTH, Мур создал систему проектирования больших интегральных микросхем OKAD (естественно, написанную на FORTH) и с ее помощью спроектировал несколько очень удачных стековых машин, которые и сегодня серийно выпускаются. К ним относится семейство микросхем F21 — 20-битовая стековая машина с производительностью 80 MIPS (вспомните об эффективности командной системы стековой машины — это действительно очень высокая производительность). Кроме ядра процессора, на кристалле F21 размещены схемы формирования полного телевизионного сигнала в формате NTSC, подсистема обработки аналоговых сигналов, битовый процессор с подсистемой битового ввода/вывода,параллельный порт, часы реального времени и ПЗУ для начальной загрузки. Чрезвычайно удобна и встроенная подсистема программно-управляемого интерфейса с оперативной памятью/ПЗУ практически любых типов. Процессор поддерживает до 1 МВ оперативной памяти и размещен в корпусе JLCC с 68 выводами.

Удачной была и разработка процессора с громким названием SH-ВООМ. Ядро этого 32-битового процессора было лицензировано компанией Patriot Scientific (США) и после модификации используется в серийном микропроцессоре PSC 1000 — на сегодняшний день, пожалуй, самом интересном для встраиваемых и микровычис-лительных систем для Java. Он так же, как и F21, включает некоторые полезные дополнительные элементы: битовый процессор ввода/ вывода, подсистему управления динамическим ОЗУ.

Большинство же стековых машин реализовывались и реализуются по сей день благодаря свойственной им простоте на основе так называемой программируемой логики (программируемых логических матриц -PLM). Например, созданный в лаборатории прикладной физики Университета Джона Хопкинса процессор FRISC 3 — чисто 32-разрядная стековая машина -«уместился» на кристалле с 35 тыс. транзисторов. Быстродействие современных PLM, достигающее 200 MHz, и свойственная стековым машинам высокая производительность, а также доступность процессов проектирования и изготовления (не нужны ни стоящие многие миллионы программно-аппаратные комплексы САПР, ни высокочистые помещения и вакуумное оборудование) открывают неожиданную перспективу появления альтернативных freeware-процессоров. Под ними понимаются соответствующая «маска» программирования заводской «чистой» PLM и открытое описание реализации процессора. Так как некоторые современные PLM допускают неоднократное программирование, можно автоматически решить вопросы модернизаций (включая расширение системы команд) и устранения ошибок в проекте без замены собственно процессора.

ПОЧЕМУ СТЕКОВЫЕ МАШИНЫ НЕ ПОЛУЧИЛИ ШИРОКОГО РАСПРОСТРАНЕНИЯ?

Действительно, архитектура стековых машин проста и эффективна, реализация их не требует больших затрат. Но ни один из имевших шумный коммерческий успех микропроцессоров не был стековым. Вероятнее всего, в начале своей «карьеры» стековые машины не получили распространения из-за высокой требовательности к пропускной способности подсистемы оперативной памяти. Для процессоров «классической» архитектуры эти требования более мягкие. Естественно, развитие пошло по пути наименьшего сопротивления. Для стековых архитектур осталась узкая и специфичная ниша — высоконадежные системы реального времени. Возможно, ситуация изменилась бы к лучшему, если бы Чак Мур работал в Intel приблизительно тогда, когда там «рождалось» ядро всей архитектуры х86 -процессор i8086. Сегодня же массовый переход к стековым архитектурам просто невозможен с коммерческой точки зрения: в технократической гонке производители процессоров затратили такие суммы на совершенствование своих архитектур и довели их показатели до такого уровня, что переход на мощные десятидолларовые процессоры полностью «взорвет» индустрию полупроводников.

КАКИМ БУДЕТ СТЕКОВЫЙ ПРОЦЕССОР 2000 г.?

Естественно, — 64-разрядным, со встроенной подсистемой управления виртуальной памятью, с тактовой частотой порядка 200 MHz, реализацией архитектуры SIMD (одна инструкция — много данных), со степенью интеграции не более 1 млн транзисторов, с розничной ценой порядка $15~20. Жаль только, что персонального компьютера на таком процессоре мы купить никогда не сможем.

Р.S.: О Z80 И СЕГОДНАШНЕЙ СУДЬБЕ ЧАКА МУРА

А причем тут, собственно, древний восьмибитовый компьютер (с процессором Zilog Z80), о котором я упоминал в начале статьи? Дело в том, что единственная система, с которой на нем можно было с удовольствием работать, был ... тот самый FORTH. Именно благодаря воспоминаниям о почти эстетическом удовольствии от программирования в FORTH и родилась эта статья.

Чак Мур в настоящее время является основателем, владельцем и главным идеологом страшно засекреченной фирмы iTVc. Следует отметить, что в числе ее партнеров и спонсоров находится отнюдь не маленькая корпорация Sanyo. Об iTVc известно совсем мало — компания разрабатывает персональную информационную систему новой (читай — стековой) архитектуры. Известна и ориентировочная цена — до $100. Так что, стековые машины, возможно, ждет неожиданное будущее.