FORTH — вперед, в четвертий вимір комп'ютерних архітектур


•Гра слів в назві: «forth» при дослівному перекладі означає «вперед», проте — це скорочення від «fourth», що означає «четвертий».

        ЧОМУ Про FORTH? До написання цієї статті мене спонукали, здавалося б, абсолютно не взаємозв'язані речі:
по-перше, відомості, що промайнули, про підготовку корпорацією Microsoft вбудовуваної (embedded) версії системи Windows NT, по-друге, анонсовані компанією Rambus технологія і зразки швидкодіючої оперативної пам'яті RDRAM з частотою доступу 400-800 MHz і, нарешті, по-третє, найтепліші спогади про мій саморобний стародавній восьмибітовий комп'ютер. Сподіваюся, що ці розрізнені передумови зрозуміють в ході прочитання.
        ВИТОКИ FORTH
        У далекому 1970 р. одному з програмістів Стенфордського Лінійного Прискорювача (зараз відомішого як Стенфордський Лінійний Коллайдер) Чаку Муру (Chuck Moore) було доручено розробку програми для керуванням візка антени радіотелескопу Національної Радіообсерваторії.
        Промучившись декілька місяців з різними засобами розробки, Мур відважився створити свою систему програмування і вже з її допомогою вирішити поставлену задачу. До 1971 р. не тільки була реалізована нова система програмування, але і повністю автоматизована робота радіотелескопу. Система керувала позиціонуванням антени, збором і накопиченням даних, їх зберіганням, обробкою і відображенням результатів на графічних терміналах. Вся безліч завдань виконувалася на єдиній ЕОМ PDP-11 (деякі, напевно, пам'ятають її вітчизняний варіант СМ-4). Практично система була створена однією (!) людиною. Мур назвав систему «четвертою» (fourth) — по приналежності до нового, четвертого покоління засобів розробки і операційних систем. Але машина PDP-11 не дозволяла на той час використовувати імена довше 5 символів, тому назва fourth була скорочена до FORTH. Простота, надійність і зручність системи перевершили всі очікування — до 1976 р. вона працювала без єдиного збою і зупинки. Це зумовило її популярність серед астрономів — система і до цього дня використовується на більшості радіотелескопів світу (зокрема, бездоганно керує трьома з чотирьох астросистем космічних човників SpaceShuttle). Ось і перша передумова (про вбудовувану версію Windows NT) — цікаво, скільки грошей і часу зажадають сучасні системні інтегратори на рішення задачі автоматизації радіотелескопу? Простота і стабільність FORTH-системи зумовили її широке застосування і в інших областях. Досить пригадати перший «суперефектний» фільм «Термінатор 2: Судний день», спецефекти для якого створювалися в системі Morphing, написаній на FORTH.


         FORTH СЬОГОДНІ
        Масовий психоз від появи операційних систем і мов програмування «всіх часів, країн і народів» може викликати у програміста FORTH тільки усмішку сумного скептика. «Ax, Java!..», «Ax, незалежність від платформи!..», «Ах, об'єктно-орієнтована система!..». А FORTH-фахівець посміхнеться — адже та віртуальна байт-машина Java і є насправді FORTH-машина, і працює FORTH навіть на тому, на чому Java і не снилося, - від восьмибітового PIC-контролеру фірми Microchip з 1 KB ПЗП на кристалі до суперкомп'ютерів Cray, а об'єктно-орієнтований механізм є основою FORTH (для тих, хто захоче вивчити FORTH, слід звернути увагу на механізм CREATE DOES>). Крім того, відмінна реалізація FORTH-системи займає не більше 16 KB на будь-якій платформі. Напевно цим визначається достатньо стійкий інтерес до FORTH і сьогодні. В підтвердження приведу графік цитованості слова «FORTH» в розділі «Мови програмування» Бібліотеки Конгресу США (мал. 1).


Мал. 1

        БЛИСК ТА НИЦІСТЬ FORTH-СИСТЕМИ
        Краща коротка розповідь про систему FORTH для тих, хто її не знає, звучить приблизно так: «Це зовсім інша система». FORTH — не зовсім мова програмування і не зовсім операційна система. FORTH — це інша архітектура. Архітектура стекової машини. Тому навіть професійному програмістові, не знайомому з FORTH і стековими машинами, при вивченні FORTH доцільно впасти в стан deja'vu і почати все спочатку. У FORTH-системі дійсно поєднуються блискуче реалізована архітектура і пуританськи-ниці, на перший погляд, вбудовані можливості.

         СТЕКОВА АРХІТЕКТУРА — ЭФФЕКТИВНОСТЬ І ДЕШЕВИЗНА
        Поняття стеку (stack) відноситься до одних з фундаментальних і найпростіших в теорії і практиці комп'ютерних обчислень. Наочна некомп'ютерна реалізація стеку — це стос тарілок. З нього можна або зняти саму верхню тарілку (операція pop), або покласти тарілку на вершину стосу (операція push). Остання укладена тарілка, таким чином, буде знята першою. Ось, власне, і все, що потрібно знати про стек. Не дивлячись на простоту, що здається, стек — основа основ будь-якої програми, що виконується на будь-якому комп'ютері. Переривання, виклик функцій і процедур, повернення значень — всі ці процеси, що становлять операційні системи і прикладні програми, базуються на стеках.
Природно, фахівці з комп'ютерної архітектури давно створили і апаратну підтримку стеків, і взагалі комп'ютери, побудовані на апаратних стеках. Тепер практично у всіх процесорах стеки мають деяку апаратну підтримку. Наприклад, в найпоширеніших процесорах сімейства Intel x86 є спеціальний регістр стеку. Існує навіть класифікація різних процесорів по критерію апаратної підтримки стеків (табл. 1).

Таблиця 1 Класифікатор процесорів по апаратній підтримці стеку

Кількість стеків

Розмір стеків

Число операндів в команді

Процесор або сімейство процесорів

Один

Малий

0

Трансп'ютери INMOS, сімейства Burrouahs

Один

Малий

1

Hewlett-Packard 3000

Один

Малий

2

Intel 80х86

Один

Великий

0

Експериментальна ЕОМ NORMA

Один

Великий

1

Система AADC

Один

Великий

2

AMD AM29000

Багато

Малий

0

Мікроконтролери Rockwell

Багато

Малий

1

DEC PDP-11 (CM-4)

Багато

Малий

2

Motorola 680х0

Багато

Великий

0

FORTH.NCRNC4016

Багато

Великий

1

«Эльбрус» (СРСР), Lilith (Никлаус Вирт)

Багато

Великий

2

Система SOCRATES


        У цій класифікації нас цікавитимуть так звані «чисті стекові машини» з декількома великими апаратними стеками. В принципі, стекову архітектуру можна реалізувати на будь-якому процесорі, що і зроблено у всіх програмних версіях FORTH, проте це означає емуляцію з усіма витікаючими наслідками — відносними втратами продуктивності і підвищенням складності програмної реалізації. Основна відмінність «чистих стекових машин» — організація внутрішніх регістрів процесору. В традиційних процесорах є група регістрів, кожен з яких може бути адресований безпосередньо вказівкою адреси в коді команди або побічно. Адреса регістру (елементу оперативної пам'яті), який називається операндом, повинна знаходитися в команді, що виконується процесором. Це приводить до ускладнення системи команд процесору і, отже, внутрішньої логіки, збільшенню ступеня інтеграції, підвищенню розміру кристалу, необхідності застосування усіляких хитрувань (суперськалярності та ін.). Споживачеві воно, звичайно ж, непомітно, але достатньо боляче «б'є по кишені».
        У «чистій стековій машині» регістри організовані в стек (або стеки) з підтримкою всього двох команд — push і pop. Машини з нульовим числом операндів в команді мають доступ тільки до самого «верхнього» регістру стеку, і всі операції проводяться тільки з ним. Один операнд в команді має на увазі наявність апаратного стеку з доступом до «верхнього» елементу і додаткового регістру — акумулятору. Сама екзотична архітектура, реалізована в проекті SOCRATOS (два операнди в команді), достатньо складна і спірна, тому на ній ми зупинятися не будемо.
Перша особливість стекової машини, відчутна для користувача, — її простота і, отже, дешевизна. Сучасні реалізації 32-бітових стекових процесорів містять більше 50 внутрішніх регістрів, працюють на частотах 50-100 MHz, забезпечують масу корисних апаратних можливостей (наприклад, інтерфейс, що програмно настроюється, з різними підсистемами оперативної пам'яті). Для реалізації всього цього використовується кристал з числом транзисторів менше 150 тис. (для порівняння — Intel Pentium 100 MHz містить близько 3 млн 100 тис. транзисторів). І коштує такий процесор до $10 (для оптових покупців).
        Друга особливість — компактність і велика швидкість виконання програм, написаних мовою високого рівня і потім відкомпілюваних. Ще помітніше зростання продуктивності для Java-програм і аплетів. Хорошим прикладом може служити порівняння емуляції байт-команди Java IADD (складання двох цілих 32-бітових чисел) на різних платформах, приведене в табл. 2.
Третя особливість — простота портування застосувань будь-якого рівня складності і призначення для стекової архітектури. Від рівня операційної системи до прикладної програми будь-який, навіть дуже складний пакет може бути перенесений в найкоротші терміни. Річ у тому, що на стекових машинах вельми просто реалізуються компілятори практично будь-яких мов високого рівня, легко, відповідно, переносяться потім написані цими мовами програми. Крім того, мова асемблеру стекових машин — гранично проста і ефективна, істотно полегшуючий перенесення або створення машинно-залежних частин програм.
        Настав час пояснити другу передумову виникнення цієї статті — появу технології RDRAM фірми Rambus. Для стекових процесорів з відносно низьким ступенем інтеграції добитися високої тактової частоти (порядка 1 GHz) досить просто. Принаймні, набагато простіше, ніж для «монстрів» з мільйонами транзисторів. У поєднанні з швидкодіючою оперативною пам'яттю подібним процесорам не буде потрібна кеш-память — дорогий і корисний тільки при середньостатистичних оцінках механізм. А враховуючи низьку вартість самих стекових процесорів і ціни, що гарячково знижуються, на оперативну пам'ять (безвідносно до технології), можна сміливо стверджувати, що подібні системи - відмінна перспектива для ринків PDA, що ростуть, Java-терміналів, вбудовуваних систем.

УСЕРЕДИНІ СТЕКОВОЇ МАШИНИ
Найпростіша реалізація «чистої стекової машини» передбачає мінімальний об'єм необхідних апаратних засобів і так звану «високу регулярність виконання». Під нею розуміється однорідність використовуваних при проектуванні базових блоків цифрової електроніки — регістрів, лічильників і ін.

Мал. 2

Приведена на мал. 2 структура стекової машини потрапляє (по класифікації табл. 1) в клас «багато великих стеків, число операндів в команді 0». Призначення окремих елементів структури: стек даних — аналог набору регістрів в процесорі архітектури CISC (з складним набором команд) або регістрового вікна в архітектурі RISC (з скороченим набором команд); стек повернень — унікальна для стекової архітектури деталь — в ньому зберігаються адреси повернень в викликаючу підпрограму з викликаної; АЛП (Арифметико-Логічний Пристрій), Підсистема Введення/Виводу, Логіка Керування, Лічильник Команд і Регістр Адреси — стандартні вузли практично всіх мікропроцесорів з абсолютно однаковим призначенням в будь-якій архітектурі. Зате система команд канонічної стекової машини не має нічого спільного з командами будь-яких інших мікропроцесорів. По-перше, стекова машина — це дійсно RISC-машина, іноді навіть звана MISC-архітектурою (Minimal Instructions Set Computer, комп'ютер з мінімальним набором команд). По-друге, в командах канонічної стекової машини відсутнє поняття регістру — основного елементу «класичної» процесорної архітектури.
ЯК ЦЕ ПРАЦЮЄ
Самою, мабуть, чудовою в стекових машинах є не стільки простота реалізації, скільки простота розуміння принципу роботи. Якщо виключити очевидні арифметичні і логічні команди (складання, віднімання, бітові операції і ін.), система команд стекової машини включає всього лише 12 базових інструкцій (табл. 3). Мнемонічне позначення команд (фактично, мова асемблера) стекової машини прийнято запозичувати з FORTH-системи. Всі команди унікальні для стекової архітектури і гранично прості. Їх можна пояснити навіть восьмилітній дитині (особистий досвід автора). До речі, опікуни сучасної освіти і просвіти, скільки можна калічити бідолашних дітей навчанням нікому не потрібній і абсолютно бездарній мові Basic?
 

Таблиця 2. Характеристики програми емуляції команди віртуальної машини Java IADD для різних процесорів

Показник

Стекова машина

Power РС, код оптимізований

Pentium, код оптимізований

М680х0, код оптимізований

Довжина, байт

1

16

10

2

Кількість інструкцій

1

4

3

1

Пам'ять, цикл

0.25

5

3.5

1.5

Ті, кому відома мова асемблеру будь-якого мікропроцесору, відразу можуть зрозуміти переваги стекової машини. Іншим доведеться прийняти на віру слова автора. У будь-якому мікропроцесорі «класичної» архітектури виклик підпрограми, наприклад, пов'язаний зі значними витратами: по-перше, необхідно зберегти значення всіх регістрів процесору, по-друге, — зберегти адресу повернення в заздалегідь організованому стеку, по-третє, — стежити у всій програмі за цілісністю стеку повернень. У стековій машині значення регістрів зберігати не потрібно. Їх просто немає. Створювати стек повернень теж не потрібно. Він є. Єдине, що потрібне, — мінімально використовувати стек повернень не за прямим призначенням для забезпечення високої надійності програми. Очевидно, що швидкий виклик підпрограм — сильна сторона стекових машин. Саме тому вони широко застосовуються для створення систем реального часу, критичних до надійності коду.
СТЕКОВІ МАШИНИ «В МЕТАЛІ»
Сучасний етап створення апаратних реалізації стекових машин безпосередньо пов'язаний з ім'ям Чака Мура. Окрім прекрасної програмної реалізації віртуальної стекової машини FORTH, Myp створив систему проектування великих інтегральних мікросхем OKAD (природно, написану на FORTH) і з її допомогою спроектував декілька дуже вдалих стекових машин, які і сьогодні серійно випускаються. До них відноситься сімейство мікросхем F21 — 20-бітова стекова машина з продуктивністю 80 MIPS (пригадайте про ефективність командної системи стекової машини — це дійсно дуже висока продуктивність). Окрім ядра процесора, на кристалі F21 розміщені схеми формування повного телевізійного сигналу у форматі NTSC, підсистема обробки аналогових сигналів, бітовий процесор з підсистемою бітового вводу/виводу, паралельний порт, годинник реального часу і ПЗП для початкового завантаження. Надзвичайно зручна і вбудована підсистема програмно-керованого інтерфейсу з оперативною пам'яттю/ПЗП практично будь-яких типів. Процесор підтримує до 1 MB оперативної пам'яті і розміщений в корпусі JLCC з 68 виводами.
 

Таблиця 3

Базові команди канонічної стекової машини

Стек даних до

Команда

Стек даних після

Виконувані дії

AN

!

 

Знімає із стеку даних А і N. Записує в оперативну пам'ять N за адресою А

A

@

N

Знімає із стеку даних А. Кладе на стек даних N з елементу оперативної пам'яті з адресою А

A

>R

 

Знімає із стеку даних число А і кладе його на стек повернень

 

R>

A

Знімає із стеку повернень число А і кладе його на стек даних

N

DUP

NN

Кладе на стек даних копію N, яке знаходиться на вершині стеку даних

NM

DROP

M

Видаляє N зі стеку даних ; (верхнє значення стеку даних)

NM

OVER

MNM

Кладе на стек даних копію елементу, що знаходиться під верхнім елементом

NM

SWAP

MN

Міняє місцями два верхні елементи стека даних

N

IF addr

 

Знімає із стеку даних N, якщо N рівне нулю, управління передається на комірку оперативної пам'яті з адресою addr

 

CALL addr

 

Кладе на стек повернень адресу наступної команди і передає управління на комірку оперативної пам'яті з адресою addr

 

EXIT

 

Знімає зі стеку повернень addr і передає управління на комірку оперативної пам'яті з адресою addr

 

LIT N

N

Кладе на стек даних за командою комірки значення з наступної оперативної пам'яті

MM

+

D

Знімає зі стеку даних N і M, кладе на стек даних їх суму D

Вдалою була і розробка процесору з гучною назвою 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. Отже, стекові машини, можливо, чекає несподіване майбутнє.
Автор -
А. Зубинський
Серпень, 20, 1998 року
©Издательский Дом ITC