Фокал
FOCAL (аббр. FOrmula CALculator) — интерпретируемый язык программирования высокого уровня, переработка языка JOSS.
Фокал, в большой мере, разработка Ричарда Мерилла (Richard Merrill), оказал самое сильное влияние на компьютеры DEC PDP-8. Меррил написал изначальный (в 1968 году) и классический (FOCAL-69) интерпретаторы Фокала для PDP-8. Сама DEC позиционировала Фокал как «язык типа JOSS».
Как и ранние версии Бейсика, интерпретатор Фокала сам обеспечивал все необходимое программное окружение и не нуждался в операционной системе.
Фокал крайне нетребователен к ресурсам. Так, он работал на самых
простых вариантах PDP-8 (в том числе на системах без устройств
хранения). Многопользовательские варианты интерпретатора поддерживали
одновременную работу до четырех пользователей на телетайпных
терминалах. Позднее Фокал имел реализации для PDP-7/9 и PDP-11.
Компания Coca-Cola использовала внутри фирмы доработанную версию Фокала, под названием COKE.
Из отечественных компьютеров Фокал существовал на Электронике БК-0010/0011 и ДВК встроенный в ПЗУ
(в поздних моделях БК — доступный на картридже). Были также доступны
расширения Фокала для этих машин, написанные различными энтузиастами.
Расширения содержали разнообразные дополнительные команды и функции для
работы с графикой, звуком, запуска двоичных программ, обработки строк и
пр.
Существенно расширенная версия Фокал использовалась в качестве включающего языка в ДИАСП — Диалоговой Системе Проектирования — специализированной САПР, предназначенной для целей микроэлектроники.
В 1990-е годы энтузиастами была предпринята попытка переноса Фокала
на IBM PC (Turbo Focal), но она не вышла из стадии бета-версии, которая
распространялась по каналам BBS.
Работоспособность публично доступной в исходных текстах версии
Focal-81 была успешно протестирована на следующих платформах и
компиляторах:
- Sun SPARC
- gcc 2.6.3 (ANSI С) и Sun cc (K&R C), под SunOS 4.1.3
- gcc 2.6.3 (ANSI С) и SunPro cc 2.0.1 (ANSI С), под Solaris 2.3
- HP (9000 модель 720)
- gcc 2.5.8 (ANSI C) и HP cc (ANSI C) под HPUX 8.05
- x86
- MS C (ANSI C) и LSI C-86 (близко к ANSI C) под MS-DOS
- MS Visual C++ под Win32 (не тестировалась)
Из-за похожего синтаксиса Фокал просто обречен на сравнение с Бейсиком. Фокал уступает Бейсику по своим возможностям. Например, в Фокале совершенно отсутствует строковый тип данных, все переменные
на Фокале — числовые (как правило, дробные числа с плавающей точкой).
Вместе с тем, интерпретатор Фокала гораздо менее требователен к
ресурсам (прежде всего к памяти), нежели Бейсик, что позволяет делать более сложные программы на урезанных по ресурсам системах.
В настоящее время Фокал не развивается и практически не
используется, вышеупомянутые порты Focal-81 были проделаны энтузиастами
в целях развлечения.
Некоторые команды Фокала
команда |
описание |
аналог в Бейсике |
COMMENT |
комментарий (текст следом за командой игнорируется) |
REM |
TYPE |
вывод на консоль значений констант и выражений |
PRINT |
QUIT |
штатное завершение выполнения программы |
END |
SET |
присваивание значения переменной (или элементу массива) |
LET |
ASK |
ввод значений с консоли |
INPUT |
GOТО |
безусловный переход |
GOTO |
DO |
вызов подпрограммы |
GOSUB |
RETURN |
возврат из подпрограммы |
RETURN |
IF |
ветвление по значению выражения |
частично соответствует IF |
Команды Фокала могут быть записаны в сокращенной форме, только
первой буквой. Существовали также версии Фокала на европейских языках
(поставляемые DEC).
Примеры программ
Стандартный пример Hello World
1.05 C Программа выводит на экран тестовую строку 1.10 T "Hello World !" ! 1.20 Q
Решение квадратного уравнения вида ax² + bx + c = 0
1.05 C **** Программа для решения квадратного уравнения вида ax^2 + bx + c = 0 1.10 T "Введите коэффициенты a, b, c для уравнения ax^2 + bx + c = 0" ! 1.20 A "a = ", a ! "b = ", b ! "c = ", c 1.30 T ! "Решаем уравнение (", a, ")x2 + (", b, ")x + (", c, ") = 0" ! 1.35 C **** Вычисляем дискриминант 1.40 S d = b^2 - 4*a*c 1.50 T ! "D = ", d ! 1.55 C **** Выясняем количество корней 1.60 I (d) , 3, 4 1.65 С **** первая метка пропущена, поэтому при значении D 1.66 C **** меньшем нуля мы попадаем на следующую за IF строку
2.05 С **** Отрицательный дискриминант - корней нет 2.10 T "Уравнение не имеет действительных корней" ! 2.20 Q
3.05 С **** Нулевой дискриминант - один корень 3.10 T "Уравнение имеет один корень" ! 3.20 S s = 0 3.30 D 5 3.40 T "x = ", x ! 3.90 Q
4.05 С **** Положительный дискриминант - два корня 4.10 Т "Уравнение имеет два корня" ! 4.20 S s = FSQT(d) 4.30 D 5 4.40 T "x1 = ", x ! 4.50 S s = -s 4.30 D 5 4.40 T "x2 = ", x ! 4.90 Q
5.05 C **** Подпрограмма вычисления корня, где s - корень дискриминанта со знаком 5.10 S x = (s - b) / 2*a 5.90 R
Метки
строк в Фокале имеют вид <номер_группы>.<номер_строки>. В
командах GOTO, IF, DO может указываться как полная метка, так и номер
группы без номера строки (вызывает переход на строку с наименьшим
номером в данной группе).
Восклицательный знак «!» в командах ASK и TYPE (ввод/вывод с
консоли) является (наравне с «,») разделителем аргументов, и вызывает
перевод строки, перед вводом или выводом следующего элемента списка.
Команда IF вычисляет значение выражения и переходит по одной из трех
меток, соответственно, при значении меньшем нуля, значении равном нулю
и значении большем нуля. Если метка опущена, то управление передается
на следующую за IF строку.
Литература и публикации
- В.А.Абрамов, А.В.Стрижков, А.Р.Федоров; «Диалоговый язык ФОКАЛ».
М.«Высшая школа», 1991. Серия «Программное обеспечение МикроЭВМ», книга
4.
- Г.И.Фролов, Г.А.Куправа, Ю.Г.Чаиров и др.; Под редакцией Л.Н.Преснухина; «Программирование на языке ФОКАЛ». М.Изд-МИЭТа, 1984
- А.Н.Писаревский, Л.Г.Осетинский, М.Г.Осетинский; «ФОКАЛ -
диалоговый язык для миниЭВМ». Л.«Машиностроение». Ленинградское
отделение. 1985
|